Browse Source

议题管理

feature
jiangyy 3 years ago
parent
commit
b9f6b2b6cd
  1. 17
      src/views/modules/shequzhili/event/cpts/event-info.vue
  2. 54
      src/views/modules/shequzhili/issue/cpts/eventDetail.vue
  3. 11
      src/views/modules/shequzhili/issue/cpts/issue-detail.vue
  4. 703
      src/views/modules/shequzhili/issue/cpts/process-form-demand.vue
  5. 640
      src/views/modules/shequzhili/issue/cpts/process-form-project.vue
  6. 252
      src/views/modules/shequzhili/issue/cpts/process-form-replay.vue
  7. 204
      src/views/modules/shequzhili/issue/cptsAudit/eventDetail.vue
  8. 156
      src/views/modules/shequzhili/issue/cptsAudit/issue-detail.vue
  9. 308
      src/views/modules/shequzhili/issue/cptsAudit/issue-info.vue
  10. 188
      src/views/modules/shequzhili/issue/cptsAudit/process-form.vue
  11. 186
      src/views/modules/shequzhili/issue/cptsAudit/topicDetail.vue
  12. 41
      src/views/modules/shequzhili/issue/issueAuditList.vue
  13. 30
      src/views/modules/shequzhili/issue/issueList.vue

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

@ -98,7 +98,7 @@
</div>
</div>
<div v-if="item.type==='project'">
<div v-else-if="item.type==='project'">
<div v-if="item.processName==='回复'">
<div class="detail">
<div class="detail-field">回复人</div>
@ -152,7 +152,7 @@
</div>
</div>
<div v-if="item.type==='demand'">
<div v-else-if="item.type==='demand'">
<div v-if="item.processName==='回复'">
<div class="detail">
<div class="detail-field">回复人</div>
@ -181,6 +181,17 @@
</div>
</div>
<div v-else-if="item.type==='issue'">
<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>
</div>
</div>
</div>
@ -600,7 +611,7 @@ export default {
this.$message.error(msg);
}
if (this.eventDetailCopy.status === 'processing') {
if (this.issueDetailData.issueStatus === 'voting') {
this.issuePageType = 'dispose'
} else {
this.issuePageType = 'info'

54
src/views/modules/shequzhili/issue/cpts/eventDetail.vue

@ -6,52 +6,74 @@
<div class="m-info">
<div class="info-prop">
<span class="info-title-2">所属网格</span>
<span>{{ eventDetailData.topicContent||'--' }}</span>
<span>{{ eventDetailData.gridName||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">发生时间</span>
<span>{{ eventDetailData.happenTime||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">事件内容</span>
<span>{{ eventDetailData.eventContent||'--' }}</span>
</div>
<div class="info-prop"
v-if="eventDetailData.photoList&&eventDetailData.photoList.length>0">
v-if="eventDetailData.imageList&&eventDetailData.imageList.length>0">
<span class="info-title-2">图片</span>
<div class="info-pics">
<img v-for="(item,index) in eventDetailData.photoList"
<img v-for="(item,index) in eventDetailData.imageList"
style="width:80px;height:80px"
:key="index"
:src="item.url"
:src="item"
@click="watchImg(item)">
</div>
</div>
<div class="info-prop"
v-if="voiceList&&voiceList.length>0">
v-if="eventDetailData.voiceList&&eventDetailData.voiceList.length>0">
<span class="info-title-2">音频</span>
<audio controls>
<source :src="item.url"
type=""
:key="item.url"
v-for="item in voiceList" />
v-for="item in eventDetailData.voiceList" />
</audio>
</div>
<div class="info-prop">
<span class="info-title-2">发布人</span>
<span>{{ eventDetailData.topicPublisher||'--' }}</span>
<span class="info-title-2">反映渠道</span>
<span>{{ eventDetailData.sourceTypeName||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">发布时间</span>
<span>{{ eventDetailData.topicPublisherTimeShow||'--' }}</span>
<span class="info-title-2">地址</span>
<span>{{ eventDetailData.address||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">报事人</span>
<span>{{ eventDetailData.name||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">联系方式</span>
<span>{{ eventDetailData.topicPublisherMobile||'--' }}</span>
<span class="info-title-2">手机号</span>
<span>{{ eventDetailData.mobile||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">发布小组</span>
<span>{{ eventDetailData.groupName||'--' }}</span>
<span class="info-title-2">身份证号</span>
<span>{{ eventDetailData.idCard||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">痛点难点</span>
<span>{{ eventDetailData.difficultPointName||'--' }}</span>
</div>
<div v-if="eventDetailData.satisfactionName"
class="info-prop">
<span class="info-title-2">满意度</span>
<span>{{ eventDetailData.satisfactionName||'--' }}</span>
</div>
</div>

11
src/views/modules/shequzhili/issue/cpts/issue-detail.vue

@ -54,10 +54,10 @@
@click="handleToTopic">查看话题>--</div>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">意见和建议</span>
<div v-if="issueInfo.sourceType==='resi_topic'"
class="line"
:class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">意见和建议</span>
<div class="line"
@click="handleToSuggest">查看全部</div>
</div>
@ -168,11 +168,10 @@
</el-popover>
</div>
<div v-if="issueInfo.issueStatus==='closed'"
<div v-if="issueInfo.issueStatus==='closed'&&issueInfo.sourceType==='resi_topic'"
:class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">满意度评价</span>
<div v-if="issueInfo.sourceType==='resi_topic'"
class="line"
<div class="line"
@click="handleToEvaluation">查看全部</div>
</div>

703
src/views/modules/shequzhili/issue/cpts/process-form-demand.vue

@ -1,703 +0,0 @@
<template>
<div class="">
<el-form ref="ref_form"
:inline="false"
:model="formData"
:rules="dataRule"
label-width="100px">
<!-- <el-form-item label="事件分类"
label-width="150px"
prop="categoryId">
<el-cascader class="cell-width-2"
ref="myCascader"
v-model="selCategoryArray"
:key="iscascaderShow"
:options="casOptions"
:props="optionProps"
:show-all-levels="false"
@change="handleChangeCate"></el-cascader>
</el-form-item> -->
<el-form-item label="服务内容"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="content">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.content"
:autosize="{ minRows: 2, maxRows: 10 }"
type="textarea"
clearable
class="cell-width-area"
placeholder="请输入内容"></el-input>
</div>
</el-form-item>
<el-form-item label="服务类型"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="categoryCode">
<div :class="{'visiual-form':source==='visiual'}">
<el-cascader v-model="formData.categoryCode"
:options="demandOptions"
clearable
class="cell-width-1"
@change="handleCateSlect"></el-cascader>
</div>
</el-form-item>
<el-form-item label="服务时间"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="wantServiceTime">
<div :class="{'visiual-form':source==='visiual'}">
<el-date-picker v-model="formData.wantServiceTime"
type="datetime"
class="cell-width-1"
clearable
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期时间">
</el-date-picker>
</div>
</el-form-item>
<el-form-item label="需求人"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="demandUserName">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.demandUserName"
class="cell-width-1"></el-input>
</div>
</el-form-item>
<el-form-item label="联系电话"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="demandUserMobile">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.demandUserMobile"
class="cell-width-1"></el-input>
</div>
</el-form-item>
<el-form-item label="服务地点"
prop="serviceLocation"
:class="{'form-item':source==='visiual'}"
label-width="150px"
style="display: block">
<div :class="{'visiual-form':source==='visiual'}">
<el-input class="cell-width-1"
v-model="formData.serviceLocation">
</el-input>
</div>
</el-form-item>
<el-form-item label="位置坐标"
:class="{'form-item':source==='visiual'}"
prop="longitude"
label-width="150px"
style="display: block">
<div style="width:500px">
<div class="div_map">
<div id="app_map">
</div>
<div class="div_searchmap">
<el-input class="cell-width-map"
maxlength="50"
size="mini"
placeholder="请输入关键字"
v-model="keyWords">
</el-input>
<el-button style="margin-left: 10px"
type="primary"
size="mini"
@click="handleSearchMap">查询</el-button>
</div>
</div>
<!-- <div style="margin-top: 10px">
<span>经度</span>
<el-input class="item_width_3"
maxlength="50"
placeholder="请输入经度"
v-model="formData.longitude">
</el-input>
<span style="margin-left: 20px">纬度</span>
<el-input class="item_width_3"
maxlength="50"
placeholder="请输入纬度"
v-model="formData.latitude">
</el-input>
</div> -->
</div>
</el-form-item>
<el-form-item label="门牌号"
:class="{'form-item':source==='visiual'}"
label-width="150px"
prop="locationDetail">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.locationDetail"
class="cell-width-1"></el-input>
</div>
</el-form-item>
<el-form-item label="服务方"
:class="{'form-item':source==='visiual'}"
label-width="150px"
prop="serverId">
<template>
<div :class="[{'single-select':source==='visiual'},'sel-service']">
<el-select v-model="formData.serviceType"
class="cell-width-1"
placeholder="请选择"
clearable
@change="handleServiceChange('add', $event)">
<el-option v-for="item in serviceOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
-
<el-select v-model="formData.serverId"
class="cell-width-1"
filterable
placeholder="请选择"
clearable>
<el-option v-for="item in serviceOptiondList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
</template>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { Loading } from "element-ui"; // Loading
import { requestPost } from "@/js/dai/request";
import formVltHelper from "dai-js/tools/formVltHelper";
import { isCard } from "@/utils/validate";
let loading; //
var map
var search
var markers
var infoWindowList
var geocoder //
function iniFmData () {
return {
operationType: '2',//[0: 1: 2:]
icEventId: '',//Id
gridId: '',//
categoryCode: '',//
parentCode: '',//
content: '',// 1000
reportType: 'self_help',// communitybuilding_caption;party;self_help
reportUserName: '',//
reportUserMobile: '',//
reportTime: '',//
demandUserId: '',// user.idic_resi_user.id
demandUserName: '',//
demandUserMobile: '',//
wantServiceTime: '',//
serviceType: '',
serverId: '',
locationDetail: '',
serviceLocation: '',//
latitude: '',//
longitude: '',//
// categoryId: ''
};
}
export default {
data () {
return {
btnDisable: false,
customerId: localStorage.getItem("customerId"),
demandOptions: [],
serviceOptions: [
],
serviceOptiondList: [],
casOptions: [],
iscascaderShow: 0,
selCategoryArray: [],
selCateObj: {},
optionProps: {
multiple: false,
value: 'id',
label: 'name',
children: 'subCategory',
},
formData: iniFmData(),
okflag: false,
//
keyWords: '',
eventDetailCopy: {}
};
},
components: {},
computed: {
dataRule () {
return {
// categoryId: [
// { required: true, message: "", trigger: "blur" },
// ],
content: [
{ required: true, message: "服务内容不能为空", trigger: "blur" },
],
categoryCode: [
{ required: true, message: "服务类型不能为空", trigger: "blur" },
],
wantServiceTime: [
{ required: true, message: "服务时间不能为空", trigger: "blur" },
],
demandUserName: [
{ required: true, message: "需求人不能为空", trigger: "blur" },
],
demandUserMobile: [
{ required: true, message: "联系电话不能为空", trigger: "blur" },
],
serviceLocation: [
{ required: true, message: "服务地点不能为空", trigger: "blur" },
],
serverId: [
{ required: true, message: "服务方不能为空", trigger: "blur" },
],
};
},
},
props: {
demandUserId: {
type: String,
default: "",
},
demandUserName: {
type: String,
default: "",
},
demandUserMobile: {
type: String,
default: "",
},
eventId: {
type: String,
default: "",
},
eventDetailData: {
type: Object,
default () {
return {}
}
},
source: {//manage visiual
type: String,
default: 'manage'
}
},
watch: {
demandUserName: function (val) {
this.formData.reportUserName = val
this.formData.demandUserName = val
},
demandUserMobile: function (val) {
this.formData.reportUserMobile = val
this.formData.demandUserMobile = val
},
demandUserId: function (val) {
this.formData.demandUserId = val
},
},
created () {
},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
this.getCategoryList();
this.getDemandOptions();
this.getServiceOption()
// this.formData = { ...this.formDataTemp }
this.initMap()
if (this.eventId) {
this.eventDetailCopy = JSON.parse(JSON.stringify(this.eventDetailData));
this.formData.reportUserMobile = this.eventDetailCopy.mobile
this.formData.reportUserName = this.eventDetailCopy.name
this.formData.reportTime = this.eventDetailCopy.happenTime
this.formData.gridId = this.eventDetailCopy.gridId
this.formData.demandUserId = this.eventDetailCopy.reportUserId
this.formData.demandUserName = this.eventDetailCopy.name
this.formData.demandUserMobile = this.eventDetailCopy.mobile
if (this.eventDetailCopy.parentCategoryId && this.eventDetailCopy.categoryId) {
// this.selCategoryArray = []
// this.selCategoryArray.push(this.eventDetailCopy.parentCategoryId)
// this.selCategoryArray.push(this.eventDetailCopy.categoryId)
// this.formData.categoryId = this.eventDetailCopy.categoryId
// this.selCateObj = {
// name: this.eventDetailCopy.categoryName,
// id: this.eventDetailCopy.categoryId
// }
}
} else {
this.formData.demandUserName = this.demandUserName
this.formData.demandUserMobile = this.demandUserMobile
this.formData.demandUserId = this.demandUserId
}
},
methods: {
async getCategoryList () {
const url = "/gov/issue/issueprojectcategorydict/list"
let params = {}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
let treeDataNew = this.filterTree(data)
//
++this.iscascaderShow
this.casOptions = []
this.casOptions = treeDataNew
} else {
this.$message.error(msg)
}
},
handleChangeCate () {
console.log(this.$refs["myCascader"].getCheckedNodes()[0].data)
this.selCateObj = this.$refs["myCascader"].getCheckedNodes()[0].data
this.formData.categoryId = this.selCateObj.id
},
//
filterTree (arr) {
let childs = arr
for (let i = childs.length; i--; i > 0) {
if (childs[i].subCategory) {
if (childs[i].subCategory.length) {
this.filterTree(childs[i].subCategory)
} else {
delete childs[i].subCategory
}
}
}
return arr
},
async getDemandOptions () {
const url = "/heart/icresidemanddict/demandoption"
let params = {}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.demandOptions = this.getFlagData(
this.getTreeData(data),
"usableFlag"
);
} else {
this.$message.error(msg)
}
},
async getServiceOption () {
const url = "/sys/dict/data/dictlist"
let params = { dictType: "user_demand_service_type", }
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.serviceOptions = data;
} else {
this.$message.error(msg)
}
},
getTreeData (data) {
if (!Array.isArray(data)) return [];
let arr = data.map((item) => {
let _item = {};
if (item.children) {
if (item.children.length === 0)
_item = { ...item, children: undefined };
else _item = { ...item, children: this.getTreeData(item.children) };
} else {
_item = { ...item };
}
return _item;
});
return arr;
},
getFlagData (data, flag) {
if (!Array.isArray(data)) return [];
let arr1 = data.filter((item) => item[flag]);
let arr2 = arr1.map((item) => {
if (item.children)
return { ...item, children: this.getFlagData(item.children, flag) };
else return item;
});
// console.log('arrr-oppp', arr2)
return arr2;
},
handleCateSlect (val) {
console.log("val", val);
if (val.length === 1) {
this.demandOptions.forEach((item) => {
if (item.value == val[0]) this.formData.parentCode = item.pvalue;
});
this.formData.categoryCode = val[0];
} else {
this.formData.parentCode = val[0];
this.formData.categoryCode = val[1];
}
},
handleServiceChange (type, val) {
if (val === "social_org") {
if (type === "add") {
this.getServiceuserList(val, "add_demand");
} else {
this.getServiceuserList(val, "query_demand");
}
} else {
this.getServiceuserList(val, "");
}
},
async getServiceuserList (serviceType, query) {
if (!serviceType) return false;
const { demandUserId } = this.formData;
const params = {
serviceName: "",
serviceType: serviceType,
queryPurpose: query,
};
const url = "/heart/userdemand/servicelist"
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.serviceOptiondList = data.filter(
(item) => item.value != demandUserId
);
} else {
this.$message.error(msg)
}
},
async getDemandInfo () {
this.okflag = false
this.$refs["ref_form"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
// this.formData.categoryId = this.selCateObj.id
} else {
this.okflag = true
}
});
},
resetData () {
},
// init
initMap () {
//
var center = new window.TMap.LatLng(36.0722275, 120.38945519)
// map TMap.Map()
map = new window.TMap.Map(document.getElementById('app_map'), {
center: center, //
zoom: 17.2, //
pitch: 43.5, //
rotation: 45 //
})
search = new window.TMap.service.Search({ pageSize: 10 })
//
markers = new TMap.MultiMarker({
map: map,
geometries: []
})
infoWindowList = Array(10)
geocoder = new TMap.service.Geocoder(); //
//
map.on('panend', () => {
this.handleMoveCenter()
})
this.handleMoveCenter()
this.convert()
},
setMarker (lat, lng) {
markers.setGeometries([])
markers.add([
{
id: '4',
styleId: 'marker',
position: new TMap.LatLng(lat, lng),
properties: {
title: 'marker4'
}
}
])
},
handleSearchMap () {
infoWindowList.forEach((infoWindow) => {
infoWindow.close()
})
infoWindowList.length = 0
markers.setGeometries([])
//
search
.searchRectangle({
keyword: this.keyWords,
bounds: map.getBounds()
})
.then((result) => {
let { data } = result
if (Array.isArray(data) && data.length > 0) {
const {
location: { lat, lng }
} = data[0]
map.setCenter(new TMap.LatLng(lat, lng))
this.setMarker(lat, lng)
this.formData.latitude = lat
this.formData.longitude = lng
this.convert()
} else {
this.$message.error('未检索到相关位置坐标')
}
})
},
handleMoveCenter () {
//
const center = map.getCenter()
const lat = center.getLat()
const lng = center.getLng()
this.formData.latitude = lat
this.formData.longitude = lng
this.setMarker(lat, lng)
this.convert(lat, lng)
},
convert (lat, lng) {
markers.setGeometries([]);
// var input = document.getElementById('location').value.split(',');
let location
if (lat && lng) {
location = new TMap.LatLng(lat, lng);
} else {
location = new TMap.LatLng(this.formData.latitude, this.formData.longitude);
}
// map.setCenter(location);
markers.updateGeometries([
{
id: 'main', //
position: location,
},
]);
geocoder
.getAddress({ location: location }) //
.then((result) => {
this.formData.serviceLocation = result.result.address
//
});
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: "正在加载……", //
background: "rgba(0,0,0,.7)", //
});
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close();
}
},
},
};
</script>
<style lang='scss' scoped>
@import "@/assets/scss/modules/visual/a_customize.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>
<style>
.el-dialog__body {
padding: 0 10px 20px !important;
}
</style>

640
src/views/modules/shequzhili/issue/cpts/process-form-project.vue

@ -1,640 +0,0 @@
<template>
<div class="">
<el-form ref="ref_form"
:inline="false"
:model="formData"
:rules="dataRule"
label-width="100px">
<el-form-item label="事件分类"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="categoryList">
<div :class="{'visiual-form':source==='visiual'}">
<el-cascader class="cell-width-2"
ref="myCascader"
v-model="selCategoryArray"
:key="iscascaderShow"
:options="casOptions"
:props="optionProps"
:show-all-levels="false"
@change="handleChangeCate"></el-cascader>
</div>
</el-form-item>
<el-form-item label="项目标题"
prop="title"
:class="{'form-item':source==='visiual'}"
label-width="150px"
style="display: block">
<div :class="{'visiual-form':source==='visiual'}">
<el-input class="cell-width-1"
maxlength="50"
placeholder="请输入项目标题"
v-model="formData.title">
</el-input>
</div>
</el-form-item>
<el-form-item label="所属网格 "
prop="gridId"
:class="{'form-item':source==='visiual'}"
label-width="150px"
style="display: block">
<div :class="{'visiual-form':source==='visiual'}">
<el-select v-model.trim="formData.gridId"
placeholder="请选择"
clearable
class="cell-width-1">
<el-option v-for="item in gridList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
</el-form-item>
<el-form-item label="处理部门"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="staffList">
<el-popover placement="bottom"
width="400"
height="400"
v-model="visibleStaffPanel">
<div class="f">
<select-staff @confirm="(ret) => (formData.staffList = ret)"
@close="visibleStaffPanel = false" />
</div>
<div slot="reference">
<a v-if="formData.staffList.length == 0"
style="cursor: pointer">点击选择</a>
<a v-else
style="cursor: pointer">已选 {{ formData.staffList.length }} </a>
</div>
</el-popover>
</el-form-item>
<!-- <el-form-item label="协办单位"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="assistanceUnitIndex">
<div :class="{'visiual-form':source==='visiual'}">
<el-select v-model.trim="formData.assistanceUnitIndex"
placeholder="请选择"
class="cell-width-1">
<el-option v-for="(item, index) in assistanceUnitList"
:key="item.assistanceUnitId"
:label="item.assistanceUnitName"
:value="index">
</el-option>
</el-select>
</div>
</el-form-item> -->
<el-form-item label="项目方案"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="publicReply">
<div :class="{'visiual-form':source==='visiual'}">
<el-input type="textarea"
class="cell-width-area"
:rows="2"
placeholder="请输入项目方案"
v-model="formData.publicReply">
</el-input>
</div>
</el-form-item>
<el-form-item label="内部备注"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="internalRemark">
<div :class="{'visiual-form':source==='visiual'}">
<el-input type="textarea"
class="cell-width-area"
:rows="2"
placeholder="请输入内部备注"
v-model="formData.internalRemark">
</el-input>
</div>
</el-form-item>
<el-form-item label="图片/附件:"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="internalFile">
<el-upload :headers="$getElUploadHeaders()" class="avatar-uploader"
:action="uploadUlr"
:data="{ customerId: customerId }"
:show-file-list="true"
:on-success="handleImgSuccess"
:on-remove="handleImgRemove"
:before-upload="beforeImgUpload">
<i v-if="source==='manage'"
:class="['el-icon-plus']"></i>
<img v-else
style="width:27px;height:27px"
src="@/assets/img/file-add.png">
</el-upload>
</el-form-item>
<el-form-item label="标签"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="tagList">
<fold-text v-if="tagList.length>0"
style="width: 300px"
:row="3">
<div :key="item.name"
class="tag-name"
v-for="item in tagList">
{{ item.name }}
</div>
</fold-text>
<el-popover placement="top"
width="450"
height="450"
v-model="visibleTagPanel">
<div class="f"
style="min-height: 120px">
<h2>选择标签</h2>
<el-select style="width: 350px"
v-model="selectedTagData"
multiple
allow-create
filterable
placeholder="请选择"
@change="handleTagChange">
<el-option-group label="自定义标签">
<el-option v-for="item in tagOptions.customized"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-option-group>
<el-option-group label="常用标签">
<el-option v-for="item in tagOptions.defaulted"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-option-group>
</el-select>
<el-button style="margin-left: 10px"
size="small"
type="danger"
@click="updateProjectTag">关闭</el-button>
</div>
<div slot="reference">
<el-button v-if="source==='manage'"
size="small"
type="">选择</el-button>
<div v-else
class="one-btn">选择</div>
</div>
</el-popover>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { Loading } from "element-ui"; // Loading
import { requestPost } from "@/js/dai/request";
import selectStaff from "@/views/components/selectStaff";
import formVltHelper from "dai-js/tools/formVltHelper";
import foldText from "@/views/components/foldText";
import { isCard } from "@/utils/validate";
let loading; //
function iniFmData () {
return {
operationType: '1',//[0: 1: 2:]
publicReply: '',// 1000
internalRemark: '',// 1000
gridId: '',//
assistanceUnitIndex: '',
assistanceUnitId: '',// Id
assistanceUnitType: '',// 12
staffList: [],//
categoryList: [],//
tagList: [],//
internalFile: [],//
title: '',//
publicFile: [],//
locateAddress: '',//
locateLongitude: '',//
locateDimension: '',//
eventId: '',//
};
}
export default {
data () {
return {
btnDisable: false,
customerId: localStorage.getItem("customerId"),
gridList: [],//list--
myDepartmentList: [],//
visibleStaffPanel: false,
assistanceUnitList: [],//
tagList: [],//
tagOptions: [],
visibleTagPanel: false,
selectedTagData: [],
casOptions: [],
iscascaderShow: 0,
selCategoryArray: [],
selCateObj: {},
optionProps: {
multiple: false,
value: 'id',
label: 'name',
children: 'subCategory',
},
formData: iniFmData(),
formDataTemp: {
assistanceUnitIndex: 0,
assistanceUnitId: '',// Id
assistanceUnitType: '',// 12
eventId: "",
gridId: "63d5ff92ea981b1c58e4914ac894c610",
internalRemark: "内部备注",
operationType: "1",
projectStaffId: "1514068005825622017",
publicReply: "项目方案",
title: "3123123",
internalFile: [],
staffList: [],
tagList: [{
id: "46294b3c9f96ee4d0b00e997e06c8f97",
isDisable: "enable",
name: "车行道、人行道、盲道、无障碍通道、路名牌",
},
{
id: "953bafc1191f784841d9b8da61ec7b9b",
isDisable: "enable",
name: "城市广场管理",
}],
},
okflag: false,
uploadUlr: window.SITE_CONFIG["apiURL"] + "/oss/file/uploadqrcodeV2",
eventDetailCopy: {}
};
},
components: { selectStaff, foldText },
computed: {
dataRule () {
return {
categoryList: [
{ required: true, message: "请填写事件分类", trigger: "blur" },
],
title: [
{ required: true, message: "标题不能为空", trigger: "blur" },
],
gridId: [
{ required: true, message: "所属网格不能为空", trigger: "blur" },
],
staffList: [
{ required: true, message: "处理部门不能为空", trigger: "blur" },
],
publicReply: [
{ required: true, message: "项目方案不能为空", trigger: "blur" },
],
};
},
},
props: {
gridId: {//id
type: String,
default: "",
},
eventId: {
type: String,
default: "",
},
eventDetailData: {
type: Object,
default () {
return {}
}
},
source: {//manage visiual
type: String,
default: 'manage'
}
},
watch: {
gridId: function (val) {
this.formData.gridId = val
},
"formData.assistanceUnitIndex": function (val) {
if (val === "" || this.assistanceUnitList.length === 0) {
this.formData.assistanceUnitId = "";
this.formData.assistanceUnitType = "";
} else {
this.formData.assistanceUnitId =
this.assistanceUnitList[val].assistanceUnitId;
this.formData.assistanceUnitType =
this.assistanceUnitList[val].assistanceUnitType;
}
},
async selectedTagData (val) {
const { tagOptions } = this;
this.tagList = await Promise.all(
val.map(async (id) => {
let ele = [...tagOptions.customized, ...tagOptions.defaulted].find(
(item) => item.id == id || item.name == id
);
if (!ele) {
await this.createTag(id);
ele = [
...this.tagOptions.customized,
...this.tagOptions.defaulted,
].find((item) => item.name == id);
if (!ele)
return {
id: "",
name: ele.name,
};
}
return {
id: ele.id,
name: ele.name,
};
})
);
this.tagList = this.tagList.filter((item) => item.id);
console.log(this.tagList)
},
},
created () {
},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
this.getCategoryList();
this.loadGrid();
this.getMyDepartmentList();
this.getAssistanceUnitList();
this.getTagList()
// this.formData = { ...this.formDataTemp }
if (this.eventId) {
this.eventDetailCopy = JSON.parse(JSON.stringify(this.eventDetailData));
this.formData.gridId = this.eventDetailCopy.gridId
if (this.eventDetailCopy.parentCategoryId && this.eventDetailCopy.categoryId) {
this.selCategoryArray = []
this.selCategoryArray.push(this.eventDetailCopy.parentCategoryId)
this.selCategoryArray.push(this.eventDetailCopy.categoryId)
this.selCateObj = {
name: this.eventDetailCopy.categoryName,
id: this.eventDetailCopy.categoryId
}
this.formData.categoryList = []
this.formData.categoryList.push(this.selCateObj)
}
} else {
this.formData.gridId = this.gridId
}
},
methods: {
async getCategoryList () {
const url = "/gov/issue/issueprojectcategorydict/list"
let params = {}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
let treeDataNew = this.filterTree(data)
//
++this.iscascaderShow
this.casOptions = []
this.casOptions = treeDataNew
} else {
this.$message.error(msg)
}
},
handleChangeCate () {
console.log(this.$refs["myCascader"].getCheckedNodes()[0].data)
this.selCateObj = this.$refs["myCascader"].getCheckedNodes()[0].data
this.formData.categoryList = []
this.formData.categoryList.push(this.selCateObj)
},
//
filterTree (arr) {
let childs = arr
for (let i = childs.length; i--; i > 0) {
if (childs[i].subCategory) {
if (childs[i].subCategory.length) {
this.filterTree(childs[i].subCategory)
} else {
delete childs[i].subCategory
}
}
}
return arr
},
async loadGrid () {
const url = "/gov/org/customergrid/gridoption"
let params = {
agencyId: this.agencyId
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.gridList = data
} else {
this.$message.error(msg)
}
},
//
async getMyDepartmentList () {
const url = "/gov/project/trace/approvalagencylist";
const { data, code, msg } = await requestPost(url, {
issueId: '',
projectStaffId: '',
});
if (code === 0) {
this.myDepartmentList = data.subAgencyList;
} else {
this.$message.error(msg);
}
},
//
async getAssistanceUnitList () {
const url = "/heart/icpartyunit/assistanceUnitList";
const { data, code, msg } = await requestPost(url, {
// projectId: this.projectIdCopy,
});
if (code === 0) {
this.assistanceUnitList = data;
} else {
this.$message.error(msg);
}
},
//
async getTagList () {
const url = "/gov/issue/issueprojecttagdict/list";
const { data, code, msg } = await requestPost(url, {
});
if (code === 0) {
this.tagOptions = {
customized: data.customized,
defaulted: data.defaulted,
};
} else {
this.$message.error(msg);
}
},
handleTagChange (val) {
console.log(val);
},
updateProjectTag () {
this.visibleTagPanel = false;
},
async getProjectInfo () {
this.okflag = false
this.$refs["ref_form"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
} else {
this.formData.tagList = this.tagList
this.okflag = true
}
});
},
beforeImgUpload (file) {
const isLt1M = file.size / 1024 / 1024 < 10;
if (!isLt1M) {
this.$message.error("上传文件大小不能超过 10MB!");
}
return isLt1M;
},
resetData () {
},
handleImgSuccess (res, file, fileList) {
console.log("res.data.url", file);
if (res.code === 0 && res.msg === "success") {
console.log("res.data.url", res.data.url);
this.formData.internalFile.push({
format: file.name.split(".").pop(),
name: file.name,
size: file.size,
type: file.raw.type,
url: res.data.url,
});
console.log(this.formData.internalFile);
} else {
this.$message.error(res.msg);
}
},
handleImgRemove (file) {
let index = this.formData.internalFile.findIndex(
(item) => item.url == file.response.data.url
);
this.formData.internalFile.splice(index, 1);
console.log(this.formData.internalFile);
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: "正在加载……", //
background: "rgba(0,0,0,.7)", //
});
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close();
}
},
},
};
</script>
<style
lang="scss"
src="@/assets/scss/modules/shequzhili/project-info.scss"
scoped
></style>
<style lang='scss' scoped>
@import "@/assets/scss/modules/visual/a_customize.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>
<style>
.el-dialog__body {
padding: 0 10px 20px !important;
}
</style>

252
src/views/modules/shequzhili/issue/cpts/process-form-replay.vue

@ -1,252 +0,0 @@
<template>
<div class="search">
<el-form ref="ref_form1"
:inline="false"
:model="formData"
:rules="dataRule">
<el-form-item label="事件分类"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="categoryList">
<div :class="{'visiual-form':source==='visiual'}">
<el-cascader class="cell-width-2"
ref="myCascader"
v-model="selCategoryArray"
:key="iscascaderShow"
:options="casOptions"
:props="optionProps"
:show-all-levels="false"
@change="handleChangeCate"></el-cascader>
</div>
</el-form-item>
<el-form-item label="回复内容"
prop="content"
label-width="150px"
:class="{'form-item':source==='visiual'}"
style="display: block">
<div :class="{'visiual-form':source==='visiual'}">
<el-input class="cell-width-area"
type="textarea"
maxlength="500"
show-word-limit
:rows="5"
placeholder="请输入回复内容,不超过500字"
v-model="formData.content"></el-input>
</div>
</el-form-item>
<el-form-item label=""
label-width="150px"
:class="{'form-item':source==='visiual'}"
style="display: block">
<el-checkbox :class="{'form-item':source==='visiual'}"
v-model="status">已完成</el-checkbox>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { Loading } from "element-ui"; // Loading
import { requestPost } from "@/js/dai/request";
import formVltHelper from "dai-js/tools/formVltHelper";
import { isCard } from "@/utils/validate";
let loading; //
export default {
data () {
return {
btnDisable: false,
formData: {
operationType: '0',//[0: 1: 2:]
content: '',
status: ''
},
status: false,
okflag: false,
eventDetailCopy: {},
casOptions: [],
iscascaderShow: 0,
selCategoryArray: [],
selCateObj: {},
optionProps: {
multiple: false,
value: 'id',
label: 'name',
children: 'subCategory',
},
};
},
components: {},
computed: {
dataRule () {
return {
content: [
{ required: true, message: "回复内容不能为空", trigger: "blur" },
],
};
},
},
props: {
eventId: {
type: String,
default: "",
},
eventDetailData: {
type: Object,
default () {
return {}
}
},
source: {//manage visiual
type: String,
default: 'manage'
}
},
watch: {},
created () {
console.log(this.source)
},
async mounted () {
this.getCategoryList()
if (this.eventId) {
this.eventDetailCopy = JSON.parse(JSON.stringify(this.eventDetailData));
if (this.eventDetailCopy.parentCategoryId && this.eventDetailCopy.categoryId) {
this.selCategoryArray = []
this.selCategoryArray.push(this.eventDetailCopy.parentCategoryId)
this.selCategoryArray.push(this.eventDetailCopy.categoryId)
this.selCateObj = {
name: this.eventDetailCopy.categoryName,
id: this.eventDetailCopy.categoryId
}
}
}
},
methods: {
async getCategoryList () {
const url = "/gov/issue/issueprojectcategorydict/list"
let params = {}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
let treeDataNew = this.filterTree(data)
//
++this.iscascaderShow
this.casOptions = []
this.casOptions = treeDataNew
} else {
this.$message.error(msg)
}
},
handleChangeCate () {
console.log(this.$refs["myCascader"].getCheckedNodes()[0].data)
this.selCateObj = this.$refs["myCascader"].getCheckedNodes()[0].data
},
//
filterTree (arr) {
let childs = arr
for (let i = childs.length; i--; i > 0) {
if (childs[i].subCategory) {
if (childs[i].subCategory.length) {
this.filterTree(childs[i].subCategory)
} else {
delete childs[i].subCategory
}
}
}
return arr
},
async getReplayInfo () {
this.okflag = false
this.$refs["ref_form1"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
} else {
if (this.status) {
if (!this.selCateObj || !this.selCateObj.id) {
this.$message.info("请填写事件分类");
return false
}
this.formData.status = 'closed_case'
} else {
this.formData.status = 'processing'
}
this.formData.categoryId = this.selCateObj.id
this.formData.categoryList = []
this.formData.categoryList.push(this.selCateObj)
this.okflag = true
}
});
},
resetData () {
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: "正在加载……", //
background: "rgba(0,0,0,.7)", //
});
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close();
}
},
},
};
</script>
<style lang='scss' scoped>
@import "@/assets/scss/modules/visual/a_customize.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>
<style>
.el-dialog__body {
padding: 0 10px 20px !important;
}
</style>

204
src/views/modules/shequzhili/issue/cptsAudit/eventDetail.vue

@ -0,0 +1,204 @@
<template>
<div class="epidemic-form">
<div class="dialog-h-content scroll-h">
<div v-if="initLoading"
class="m-row">
<div class="m-info">
<div class="info-prop">
<span class="info-title-2">所属网格</span>
<span>{{ eventDetailData.gridName||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">发生时间</span>
<span>{{ eventDetailData.happenTime||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">事件内容</span>
<span>{{ eventDetailData.eventContent||'--' }}</span>
</div>
<div class="info-prop"
v-if="eventDetailData.imageList&&eventDetailData.imageList.length>0">
<span class="info-title-2">图片</span>
<div class="info-pics">
<img v-for="(item,index) in eventDetailData.imageList"
style="width:80px;height:80px"
:key="index"
:src="item"
@click="watchImg(item)">
</div>
</div>
<div class="info-prop"
v-if="eventDetailData.voiceList&&eventDetailData.voiceList.length>0">
<span class="info-title-2">音频</span>
<audio controls>
<source :src="item.url"
type=""
:key="item.url"
v-for="item in eventDetailData.voiceList" />
</audio>
</div>
<div class="info-prop">
<span class="info-title-2">反映渠道</span>
<span>{{ eventDetailData.sourceTypeName||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">地址</span>
<span>{{ eventDetailData.address||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">报事人</span>
<span>{{ eventDetailData.name||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">手机号</span>
<span>{{ eventDetailData.mobile||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">身份证号</span>
<span>{{ eventDetailData.idCard||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">痛点难点</span>
<span>{{ eventDetailData.difficultPointName||'--' }}</span>
</div>
<div v-if="eventDetailData.satisfactionName"
class="info-prop">
<span class="info-title-2">满意度</span>
<span>{{ eventDetailData.satisfactionName||'--' }}</span>
</div>
</div>
</div>
</div>
<div class="div-btn">
<el-button size="small"
@click="handleCancle"> </el-button>
<!-- <el-button v-if="formType != 'detail'"
size="small"
type="primary"
:disabled="btnDisable"
@click="handleComfirm"> </el-button> -->
</div>
</div>
</template>
<script>
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
import dateFormat from "dai-js/tools/dateFormat";
let loading //
export default {
data () {
return {
initLoading: false,
eventId: '',
eventDetailData: {},
voiceList: [],
}
},
components: {},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
},
methods: {
async initForm (eventId) {
this.startLoading()
this.eventId = eventId
await this.loadForm()
this.initLoading = true
this.endLoading()
},
async loadForm () {
const url = "/gov/project/icEvent/detail";
const { data, code, msg } = await requestPost(url, {
icEventId: this.eventId,
});
if (code === 0) {
this.eventDetailData = { ...data };
} else {
this.$message.error(msg);
}
},
handleCancle () {
// this.resetData()
this.$emit('diaDetailClose')
},
watchImg (src) {
window.open(src);
},
resetData () {
this.eventDetailData = {}
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
},
props: {
// serviceList: {
// type: Array,
// default: []
// },
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/detail-main.scss";
</style>

156
src/views/modules/shequzhili/issue/cptsAudit/issue-detail.vue

@ -0,0 +1,156 @@
<template>
<div class="">
<el-card :class="{'box-card':source==='visiual'}"
v-if="showType==''">
<h3 v-if="source==='manage'">议题详情</h3>
<div class="m-row">
<div class="m-info">
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">议题标题</span>
<span>{{ issueInfo.issueTitle }}</span>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">处理意见</span>
<span>{{ issueInfo.issueSuggestion||'--' }}</span>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">所属网格</span>
<span>{{ issueInfo.gridName||'--' }}</span>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">议题来源</span>
<div v-if="issueInfo.sourceType==='resi_topic'"
class="line"
@click="handleToTopic">查看话题</div>
<div v-else-if="issueInfo.sourceType==='ic_event'"
class="line"
@click="handleToEvent">查看事件</div>
<!-- <div v-else>--</div> -->
<div v-else
class="line"
@click="handleToTopic">查看话题</div>
</div>
</div>
</div>
<!--
显示关闭
1状态=完成 (已评价)||(没评价&&不是本人)
2状态=未完成 有操作id -->
<div v-if="type==='info'"
class="div-btn ">
<el-button size="small"
@click="handleCloseEvent">关闭</el-button>
</div>
</el-card>
</div>
</template>
<script>
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',
issueInfo: {},
showType: '',
};
}
export default {
name: "issueInfo",
props: {
issueId: {
type: String,
default: "",
},
type: {
type: String,
default: "info",
},
issueDetailData: {
type: Object,
default () {
return {}
}
},
source: {//manage visiual
type: String,
default: 'manage'
}
},
components: {
foldText, projectInfo
},
data: iniData,
computed: {},
watch: {
},
created () { },
mounted () {
this.user = this.$store.state.user
if (this.issueId) {
this.issueInfo = JSON.parse(JSON.stringify(this.issueDetailData));
}
},
methods: {
watchImg (src) {
window.open(src);
},
handleClose () {
this.showType = ''
},
handleCloseEvent () {
this.$emit("handleClose");
},
async getApiData () {
},
handleToTopic () {
this.$emit("handleToTopic")
},
handleToEvent () {
this.$emit("handleToEvent")
},
handleTagChange (val) {
console.log(val);
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>

308
src/views/modules/shequzhili/issue/cptsAudit/issue-info.vue

@ -0,0 +1,308 @@
<template>
<div class="">
<div v-if="pageTypeCopy == 'dispose'||pageTypeCopy == 'info'"
class="g-page">
<div :class="['g-total',{'g-left':projectProcess.length>0}]">
<issue-detail ref="ref_detail"
:type="pageType"
:issueId="issueId"
:issueDetailData="issueDetailData"
:source="source"
@handleToEvent="handleToEvent"
@handleToTopic="handleToTopic"
@handleClose="handleClose"></issue-detail>
<div v-if="!issueDetailData.operationId &&pageTypeCopy == 'dispose' "
class="process-form">
<el-card :class="{'box-card':source==='visiual'}">
<div :class="['process-title',{'process-title-vis':source==='visiual'}]">处理</div>
<process-form ref="ref_processinfo_dispose"
:source="source"
:issueId="issueId"
:issueDetailData="issueDetailData"></process-form>
<div class="div-btn ">
<el-button size="small"
@click="handleClose">关闭</el-button>
<el-button style="margin-left:20px"
type="primary"
size="small"
@click="handleComfirm">确定</el-button>
</div>
</el-card>
</div>
</div>
<div v-if="projectProcess.length>0"
class="g-right">
<el-card :class="{'box-card':source==='visiual'}"
style="max-height: 90vh; overflow: auto">
<div class="m-process">
<div :class="['process-title',{'process-title-vis':source==='visiual'}]">处理进展</div>
<div class="list">
<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"
v-if="item.actionType==='under_auditing'">{{ '待审核' }}</div>
<div class="name"
v-if="item.actionType==='rejected'">{{ '驳回' }}</div>
<!-- <div class="date">
{{ item.operateTime }}
</div> -->
</div>
<div>
<div v-if="item.actionType==='under_auditing'"
class="detail">
<div class="detail-field">提交审核时间</div>
<div class="detail-value">{{ item.operateTime }}</div>
</div>
<div v-if="item.actionType==='rejected'"
class="detail">
<div class="detail-field">理由</div>
<div class="detail-value">{{ item.reason }}</div>
</div>
</div>
</div>
</div>
</div>
</el-card>
</div>
</div>
<el-dialog :visible.sync="topicShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'话题详情'"
width="950px"
top="5vh"
class="dialog-h"
@closed="diaDetailClose">
<topic-detail ref="ref_detail_topic"
@diaDetailClose="diaDetailClose"></topic-detail>
</el-dialog>
<el-dialog :visible.sync="eventShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'事件详情'"
width="950px"
top="5vh"
class="dialog-h"
@closed="diaDetailClose">
<event-detail ref="ref_detail_event"
@diaDetailClose="diaDetailClose"></event-detail>
</el-dialog>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import { Loading } from "element-ui"; // Loading
import foldText from "@/views/components/foldText";
import dateFormat from "dai-js/tools/dateFormat";
import issueDetail from "./issue-detail";
import processForm from "./process-form";
import topicDetail from "./topicDetail";
import eventDetail from "./eventDetail";
let loading; //
function iniData () {
return {
auditInfo: {},
issueDetailCopy: {},
projectProcess: [],
projectPageType: 'info',
pageTypeCopy: '',
//
topicShow: false,
eventShow: false,
};
}
export default {
name: "projectInfo",
props: {
issueId: {
type: String,
default: "",
},
pageType: {
type: String,
default: "",
},
issueDetailData: {
type: Object,
default () {
return {}
}
},
source: {//manage visiual
type: String,
default: 'manage'
}
},
components: {
foldText,
issueDetail,
processForm,
topicDetail,
eventDetail,
},
data: iniData,
computed: {},
watch: {
issueId () {
let data = iniData();
Object.keys(data).forEach((k) => {
this[k] = data[k];
});
// this.getApiData();
},
},
created () {
},
mounted () {
this.pageTypeCopy = this.pageType
this.getProjectProcess()
if (this.issueId) {
this.issueDetailCopy = JSON.parse(JSON.stringify(this.issueDetailData));
}
},
methods: {
diaDetailClose () {
this.topicShow = false
this.eventShow = false
},
//
async getProjectProcess () {
const url = "/gov/issue/issueaudit/applicationhistory";
const { data, code, msg } = await requestPost(url, {
issueApplicationId: this.issueId,
});
if (code === 0) {
this.projectProcess = data.map((item) => {
item.operateTime = dateFormat(
new Date(item.operateTime * 1000),
"yyyy-MM-dd hh:mm"
);
return item;
});
} else {
this.$message.error(msg);
}
},
async handleComfirm () {
this.startLoading()
if (this.pageTypeCopy === 'dispose') {
await this.handelDispose()
}
this.endLoading()
},
async handelDispose () {
this.$refs.ref_processinfo_dispose.getProcessInfo()
if (this.$refs.ref_processinfo_dispose.okflag) {
this.auditInfo = this.$refs.ref_processinfo_dispose.auditInfo
this.auditInfo.issueApplicationId = this.issueId
console.log('auditInfo', this.auditInfo)
//
let url = '/gov/issue/issueaudit/audit'
await this.submitDispose(url, this.auditInfo)
} else {
return false
}
},
async submitDispose (url, params) {
const { data, code, msg } = await requestPost(url, {
...params,
});
if (code === 0) {
this.$message.success("操作成功!");
this.$emit("handleOk");
} else {
this.$message.error(msg);
}
},
handleClose () {
this.$emit("handleClose");
},
handleToEvent () {
// this.pageTypeCopy = 'event'
this.eventShow = true
this.$nextTick(() => {
this.$refs.ref_detail_event.initForm(this.issueDetailCopy.sourceId)
})
},
handleToTopic () {
// this.pageTypeCopy = 'topic'
this.topicShow = true
this.$nextTick(() => {
this.$refs.ref_detail_topic.initForm(this.issueDetailCopy.topicInfo)
})
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: "正在加载……", //
background: "rgba(0,0,0,.7)", //
});
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close();
}
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>

188
src/views/modules/shequzhili/issue/cptsAudit/process-form.vue

@ -0,0 +1,188 @@
<template>
<div class="">
<div>
<el-form ref="ref_audit_form"
:inline="false"
:model="auditInfo"
:rules="auditDataRule">
<el-form-item label="处理方式"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="actionType">
<el-radio-group :class="{'form-item':source==='visiual'}"
v-model="auditInfo.actionType">
<el-radio label="approved">通过</el-radio>
<el-radio label="rejected">驳回</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="理由"
prop="reason"
label-width="150px"
:class="{'form-item':source==='visiual'}"
style="display: block">
<div :class="{'visiual-form':source==='visiual'}">
<el-input class="cell-width-area"
type="textarea"
maxlength="500"
show-word-limit
:rows="5"
placeholder="请输入理由,不超过500字"
v-model="auditInfo.reason"></el-input>
</div>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import { Loading } from "element-ui"; // Loading
import { requestPost } from "@/js/dai/request";
import selectStaff from "@/views/components/selectStaff";
let loading; //
export default {
data () {
return {
okflag: false,
eventDetailCopy: {},
auditInfo: {
actionType: 'approved',
reason: '',//
},
};
},
components: {
selectStaff,
},
computed: {
auditDataRule () {
return {
actionType: [
{ required: true, message: "处理方式不能为空", trigger: "change" },
],
reason: [
{ required: true, message: "理由不能为空", trigger: "change" },
],
};
},
},
props: {
eventId: {
type: String,
default: "",
},
eventDetailData: {
type: Object,
default () {
return {}
}
},
source: {//manage visiual
type: String,
default: 'manage'
}
},
watch: {
},
created () {
console.log(this.source)
},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
if (this.eventId) {
this.eventDetailCopy = JSON.parse(JSON.stringify(this.eventDetailData));
}
},
methods: {
handleChangeOperationType (val) {
this.$refs['ref_audit_form'].resetFields()
},
async getProcessInfo () {
this.okflag = false
this.$refs["ref_audit_form"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
} else {
this.okflag = true
}
});
},
handleCancle () {
this.$refs['ref_audit_form'].resetFields()
this.resetData();
},
resetData () {
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: "正在加载……", //
background: "rgba(0,0,0,.7)", //
});
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close();
}
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>
<style>
.el-dialog__body {
padding: 0 10px 20px !important;
}
</style>

186
src/views/modules/shequzhili/issue/cptsAudit/topicDetail.vue

@ -0,0 +1,186 @@
<template>
<div class="epidemic-form">
<div class="dialog-h-content scroll-h">
<div v-if="initLoading"
class="m-row">
<div class="m-info">
<div class="info-prop">
<span class="info-title-2">话题内容</span>
<span>{{ topicInfo.topicContent||'--' }}</span>
</div>
<div class="info-prop"
v-if="topicInfo.photoList&&topicInfo.photoList.length>0">
<span class="info-title-2">图片</span>
<div class="info-pics">
<img v-for="(item,index) in topicInfo.photoList"
style="width:80px;height:80px"
:key="index"
:src="item.url"
@click="watchImg(item)">
</div>
</div>
<div class="info-prop"
v-if="voiceList&&voiceList.length>0">
<span class="info-title-2">音频</span>
<audio controls>
<source :src="item.url"
type=""
:key="item.url"
v-for="item in voiceList" />
</audio>
</div>
<div class="info-prop">
<span class="info-title-2">发布人</span>
<span>{{ topicInfo.publishedUser||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">发布时间</span>
<span>{{ topicInfo.publishedTime||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">联系方式</span>
<span>{{ topicInfo.topicPublishMobile||'--' }}</span>
</div>
</div>
</div>
</div>
<div class="div-btn">
<el-button size="small"
@click="handleCancle"> </el-button>
<!-- <el-button v-if="formType != 'detail'"
size="small"
type="primary"
:disabled="btnDisable"
@click="handleComfirm"> </el-button> -->
</div>
</div>
</template>
<script>
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
import dateFormat from "dai-js/tools/dateFormat";
let loading //
export default {
data () {
return {
initLoading: false,
topicInfo: {},
voiceList: [],
}
},
components: {},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
},
methods: {
async initForm (topicInfo) {
this.startLoading()
this.topicInfo = JSON.parse(JSON.stringify(topicInfo))
if (this.topicInfo.publishedTime) {
this.topicInfo.publishedTime = dateFormat(
new Date(this.topicInfo.publishedTime * 1000),
"yyyy-MM-dd hh:mm"
);
}
await this.getAttechment()
this.initLoading = true
this.endLoading()
},
async getAttechment () {
const url = "/resi/group/topic/topicattachmentlist"
let params = {
topicId: this.topicInfo.topicId,
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.voiceList = data.voiceList
} else {
this.$message.error(msg)
}
},
handleCancle () {
// this.resetData()
this.$emit('diaDetailClose')
},
watchImg (src) {
window.open(src);
},
resetData () {
this.topicInfo = {}
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
},
props: {
// serviceList: {
// type: Array,
// default: []
// },
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/detail-main.scss";
</style>

41
src/views/modules/shequzhili/issue/issueAuditList.vue

@ -10,7 +10,7 @@
<el-form-item label="所属组织"
prop="orgId">
<el-cascader class="item_width_1"
<el-cascader class="item_width_2"
ref="myCascader"
size="small"
v-model="agencyIdArray"
@ -24,7 +24,7 @@
<el-form-item label="议题标题"
prop="issueTitle">
<el-input v-model="formData.issueTitle"
class="item_width_1"
class="item_width_2"
size="small"
clearable
placeholder="请输入">
@ -38,7 +38,7 @@
class="item_width_2"
size="small"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="开始时间">
</el-date-picker>
@ -48,7 +48,7 @@
class="item_width_2 data-tag"
size="small"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="结束时间">
</el-date-picker>
@ -194,7 +194,7 @@
import { requestPost } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import { mapGetters } from "vuex";
import issueInfo from "./cpts/issue-info";
import issueInfo from "./cptsAudit/issue-info";
import axios from "axios";
export default {
@ -258,10 +258,10 @@ export default {
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
endPickerOptions: {
disabledDate: endDisabledDate
// disabledDate: endDisabledDate
},
startPickerOptions: {
disabledDate: startDisabledDate
// disabledDate: startDisabledDate
},
issueId: '',
issueDetailData: {},
@ -271,8 +271,8 @@ export default {
computed: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 410 + this.iframeHeigh
: this.clientHeight - 410;
? this.clientHeight - 360 + this.iframeHeigh
: this.clientHeight - 360;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
@ -373,11 +373,13 @@ export default {
},
async handleWatch (row) {
this.issueId = row.issueId
const url = "/gov/issue/manage/votingissuedetail";
this.issueId = row.issueApplicationId
const url = "/gov/issue/issueaudit/applicationdetail";
// const url = "http://yapi.elinkservice.cn/mock/245/gov/project/icEvent/detail";
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
issueApplicationId: this.issueId,
});
if (code === 0) {
@ -391,13 +393,13 @@ export default {
//
async handleAudit (row) {
this.issueId = row.issueId
// this.issueId = '29bbec4b08bb11edbb6b0050568f8cf7'
const url = "/gov/issue/manage/votingissuedetail";
this.issueId = row.issueApplicationId
const url = "/gov/issue/issueaudit/applicationdetail";
// const url = "http://yapi.elinkservice.cn/mock/245/gov/project/icEvent/detail";
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
issueApplicationId: this.issueId,
});
if (code === 0) {
@ -466,6 +468,7 @@ export default {
},
resetSearch () {
this.agencyIdArray = []
this.formData = {
orgId: '',
orgType: '',
@ -476,11 +479,9 @@ export default {
}
this.pageNo = 1
this.getTableData();
// this.loadTable()
// this.getTableData();
},
deepTree (arr, child) {
if (Array.isArray(arr) && arr.length > 0) {

30
src/views/modules/shequzhili/issue/issueList.vue

@ -10,7 +10,7 @@
<el-form-item label="所属组织"
prop="orgId">
<el-cascader class="item_width_1"
<el-cascader class="item_width_2"
ref="myCascader"
size="small"
v-model="agencyIdArray"
@ -24,7 +24,7 @@
<el-form-item label="议题标题"
prop="issueTitle">
<el-input v-model="formData.issueTitle"
class="item_width_1"
class="item_width_2"
size="small"
clearable
placeholder="请输入">
@ -38,7 +38,7 @@
class="item_width_2"
size="small"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="开始时间">
</el-date-picker>
@ -48,7 +48,7 @@
class="item_width_2 data-tag"
size="small"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="结束时间">
</el-date-picker>
@ -154,13 +154,7 @@
label="状态"
width="80"
:show-overflow-tooltip="true">
<!-- <template slot-scope="scope">
<span v-if="scope.row.issueStatus==='voting'">表决中</span>
<span v-else-if="scope.row.issueStatus==='shift_project'">已转项目</span>
<span v-else-if="scope.row.issueStatus==='closed'">已关闭</span>
<span v-else>--</span>
</template> -->
</el-table-column>
<el-table-column fixed="right"
@ -263,7 +257,6 @@ export default {
},
],
formData: {
orgId: '',
orgType: '',
@ -286,10 +279,10 @@ export default {
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
endPickerOptions: {
disabledDate: endDisabledDate
// disabledDate: endDisabledDate
},
startPickerOptions: {
disabledDate: startDisabledDate
// disabledDate: startDisabledDate
},
issueId: '',
issueDetailData: {},
@ -299,8 +292,8 @@ export default {
computed: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 410 + this.iframeHeigh
: this.clientHeight - 410;
? this.clientHeight - 360 + this.iframeHeigh
: this.clientHeight - 360;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
@ -510,6 +503,7 @@ export default {
},
resetSearch () {
this.agencyIdArray = []
this.formData = {
orgId: '',
orgType: '',
@ -520,11 +514,9 @@ export default {
}
this.pageNo = 1
this.getTableData();
// this.loadTable()
// this.getTableData();
},
deepTree (arr, child) {
if (Array.isArray(arr) && arr.length > 0) {

Loading…
Cancel
Save