Browse Source

Merge branch 'master' into dev-天地图

# Conflicts:
#	src/views/modules/communityParty/heart/heartForm.vue
dev-烟台中转登录
dai 3 years ago
parent
commit
e67523683e
  1. 4
      package.json
  2. 5
      src/js/util.js
  3. 25
      src/views/components/tinymce2/index.vue
  4. 241
      src/views/modules/base/community/community.vue
  5. 32
      src/views/modules/base/community/roomTable.vue
  6. 95
      src/views/modules/base/epidemic/antiInfo.vue
  7. 38
      src/views/modules/base/epidemic/natFocus/natFocusList.vue
  8. 11
      src/views/modules/base/epidemic/natInfo/natDetail.vue
  9. 30
      src/views/modules/base/epidemic/natInfo/natForm.vue
  10. 33
      src/views/modules/base/epidemic/natInfo/natList.vue
  11. 44
      src/views/modules/base/epidemic/natInfo/noNatList.vue
  12. 2
      src/views/modules/base/epidemic/travel.vue
  13. 333
      src/views/modules/communityParty/article/index.vue
  14. 441
      src/views/modules/communityParty/heart/heartForm.vue
  15. 11
      src/views/modules/cpts/base/index.vue
  16. 94
      src/views/modules/plugins/rent/rentcontractinfo-add-or-update.vue
  17. 66
      src/views/modules/plugins/rent/rentcontractinfo-look-or-check.vue
  18. 9
      src/views/modules/shequzhili/event/cpts/event-detail.vue
  19. 83
      src/views/modules/shequzhili/event/cpts/event-info.vue
  20. 253
      src/views/modules/shequzhili/event/cpts/process-form-issue.vue
  21. 23
      src/views/modules/shequzhili/event/cpts/process-form.vue
  22. 24
      src/views/modules/shequzhili/event/eventList.vue
  23. 778
      src/views/modules/shequzhili/issue/cpts/add.vue
  24. 216
      src/views/modules/shequzhili/issue/cpts/evaluationDetail.vue
  25. 204
      src/views/modules/shequzhili/issue/cpts/eventDetail.vue
  26. 498
      src/views/modules/shequzhili/issue/cpts/issue-detail.vue
  27. 451
      src/views/modules/shequzhili/issue/cpts/issue-info.vue
  28. 330
      src/views/modules/shequzhili/issue/cpts/process-form.vue
  29. 202
      src/views/modules/shequzhili/issue/cpts/suggestDetail.vue
  30. 190
      src/views/modules/shequzhili/issue/cpts/topicDetail.vue
  31. 204
      src/views/modules/shequzhili/issue/cptsAudit/eventDetail.vue
  32. 213
      src/views/modules/shequzhili/issue/cptsAudit/issue-detail.vue
  33. 319
      src/views/modules/shequzhili/issue/cptsAudit/issue-info.vue
  34. 188
      src/views/modules/shequzhili/issue/cptsAudit/process-form.vue
  35. 186
      src/views/modules/shequzhili/issue/cptsAudit/topicDetail.vue
  36. 510
      src/views/modules/shequzhili/issue/issueAuditList.vue
  37. 558
      src/views/modules/shequzhili/issue/issueList.vue
  38. 47
      src/views/modules/shequzhili/xiangmu/cpts/project-info.vue
  39. 432
      src/views/modules/shequzhili/xiangmu/index.vue
  40. 6
      src/views/modules/shujuduibi/canji.vue
  41. 6
      src/views/modules/shujuduibi/siwang.vue
  42. 3
      src/views/modules/workPc/guidance/addForm.vue

4
package.json

@ -59,7 +59,7 @@
},
"devDependencies": {
"@antv/f2": "^3.8.10-beta.1",
"@tinymce/tinymce-vue": "^3.2.8",
"@tinymce/tinymce-vue": "3.2.8",
"@vue/cli-plugin-babel": "^3.10.0",
"@vue/cli-plugin-eslint": "^3.10.0",
"@vue/cli-service": "^3.10.0",
@ -70,7 +70,7 @@
"ol": "^6.9.0",
"sass-loader": "^7.3.1",
"script-loader": "^0.7.2",
"tinymce": "^5.8.2",
"tinymce": "5.8.2",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {

5
src/js/util.js

@ -15,7 +15,10 @@ export default {
let message = ''
for (var oneObj in messageObj) {
message = message + messageObj[oneObj][0].message + ' <br/> '
if(messageObj[oneObj][0].message){
message = message + messageObj[oneObj][0].message + ' <br/> '
}
}
Vue.prototype.$message({

25
src/views/components/tinymce2/index.vue

@ -87,11 +87,12 @@ export default {
toolbar_mode: "none",
toolbar_drawer: "sliding",
toolbar_mode: "sliding",
outputFormat: 'p',
outputFormat: "p",
plugins:
"wordcount visualchars visualblocks toc textpattern template tabfocus spellchecker searchreplace save quickbars print preview paste pagebreak noneditable nonbreaking media insertdatetime importcss imagetools image hr help fullscreen fullpage directionality codesample code charmap link code table lists advlist anchor autolink autoresize autosave", // import
toolbar:
"formats undo redo paste print fontsizeselect fontselect template fullpage|wordcount ltr rtl visualchars visualblocks toc spellchecker searchreplace|save preview pagebreak nonbreaking|media image|outdent indent aligncenter alignleft alignright alignjustify lineheight underline quicklink h2 h3 blockquote numlist bullist table removeformat forecolor backcolor bold italic strikethrough hr charmap link insertdatetime|subscript superscript cut codesample code |anchor preview fullscreen|help",
// "formats undo redo paste print fontsizeselect fontselect template fullpage|wordcount ltr rtl visualchars visualblocks toc spellchecker searchreplace|save preview pagebreak nonbreaking|media image|outdent indent aligncenter alignleft alignright alignjustify lineheight underline quicklink h2 h3 blockquote numlist bullist table removeformat forecolor backcolor bold italic strikethrough hr charmap link insertdatetime|subscript superscript cut codesample code |anchor preview fullscreen|help",
"formats undo redo|fontsizeselect|fontselect|forecolor backcolor bold italic underline strikethrough removeformat|image media link|outdent indent|aligncenter alignleft alignright alignjustify lineheight quicklink h2 h3 blockquote numlist bullist table|subscript superscript codesample code|preview fullscreen|wordcount|help",
content_style: "p {margin: 5px 0; font-size: 14px}",
fontsize_formats: "12px 14px 16px 18px 24px 36px 48px 56px 72px",
font_formats:
@ -171,17 +172,16 @@ export default {
if (editor && val !== prevVal && val !== editor.getContent()) {
if (typeof val !== "string") val = val.toString();
debounceSetContent.call(editor, val);
return
return;
}
// debounceSetContent.call(editor, this.dormatHtml(val));
});
editor.on("change keyup undo redo", () => {
// console.log('editor.getContent()---', editor.getContent({ format : 'p' }))
const c = editor.getContent({ format : 'p' })
const c = editor.getContent({ format: "p" });
this.$emit("input", editor.getContent());
// debounce(500, this.$emit("input", editor.getContent({ format : 'p' })));
;
});
editor.on("blur", () => {
// console.log('editor.blur--', editor.getContent({ format : 'p' }))
@ -190,12 +190,12 @@ export default {
});
},
dormatHtml(content) {
let c = ''
if (content.indexOf('DOCTYPE') != -1) {
let c = "";
if (content.indexOf("DOCTYPE") != -1) {
c = content.slice(45, -16);
}
console.log('content', typeof content)
return c || content
console.log("content", typeof content);
return c || content;
},
getUserToken() {
return localStorage.getItem("token");
@ -211,3 +211,10 @@ export default {
},
};
</script>
<style lang="scss">
//
.tox-tinymce-aux {
z-index: 5000 !important;
}
</style>

241
src/views/modules/base/community/community.vue

@ -122,6 +122,72 @@
</el-date-picker>
</el-form-item>
<el-form-item label="所属房屋">
<div class="resi-cell-value">
<div class="resi-cell-col">
<el-form-item prop="neighborHoodId">
<el-select v-model.trim="neighborHoodId"
:disabled="vDisabled"
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="buildingId">
<el-select v-model.trim="buildingId"
placeholder="楼号"
:disabled="!neighborHoodId || bDisabled"
size="small"
clearable
class="resi-cell-select resi-cell-select-middle list_item_width_1"
@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="buildingUnitId">
<el-select v-model.trim="buildingUnitId"
placeholder="单元"
size="small"
:disabled="!buildingId"
clearable
class="resi-cell-select resi-cell-select-middle list_item_width_1"
@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="houseId">
<el-select v-model.trim="houseId"
placeholder="房号"
:disabled="!buildingUnitId"
size="small"
clearable
class="resi-cell-select resi-cell-select-middle list_item_width_1">
<el-option v-for="item in optionsH"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</div>
</div>
</el-form-item>
<el-button style="margin-left:30px"
size="small"
class="diy-button--search"
@ -155,6 +221,10 @@
:ownerPhone="ownerPhone"
:rentFlag="rentFlag"
:purpose="purpose"
:neighborHoodId="neighborHoodId"
:buildingId="buildingId"
:buildingUnitId="buildingUnitId"
:houseId="houseId"
:remark="remark"
:updateStartDate="updateStartDate"
:updateEndDate="updateEndDate"
@ -187,6 +257,7 @@ import roomTable from './roomTable'
import { requestPost } from "@/js/dai/request";
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import nextTick from 'dai-js/tools/nextTick'
let loading //
export default {
@ -263,6 +334,20 @@ export default {
startPickerOptions: {
disabledDate: startDisabledDate
},
optionsV: [],
optionsB: [],
optionsH: [],
optionsD: [],
neighborHoodId: "",
buildingId: "",
buildingUnitId: "",
houseId: "",
selGridId: '',
selAgencyId: '',
vDisabled: false,
bDisabled: false,
}
},
components: {
@ -274,6 +359,7 @@ export default {
await this.loadOrgData()
await this.loadTree()
// await this.loadOpenNode()
this.getValiheList('', '')
await this.$refs['ref_communityTable'].loadTable(true, this.selTreeObj)
if (this.treeData.length > 0) {
@ -299,6 +385,113 @@ export default {
...mapGetters(['clientHeight', 'iframeHeight'])
},
methods: {
handleChangeV (val) {
this.buildingId = "";
this.buildingUnitId = "";
this.houseId = "";
this.getBuildList();
// this.getUniList();
// this.getHouseList();
},
handleChangeB (val) {
this.buildingUnitId = "";
this.houseId = "";
this.getUniList();
// this.getHouseList();
},
handleChangeD () {
this.houseId = "";
this.getHouseList();
},
async getValiheList () {
const { user } = this.$store.state;
if (!this.selGridId) {
this.selAgencyId = this.selAgencyId ? this.selAgencyId : user.agencyId
}
const url = "/gov/org/icneighborhood/neighborhood-options";
// const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/epidemicPrevention/page"
let params = {
gridId: this.selGridId,
agencyId: this.selAgencyId,
isPage: false
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.optionsV = data;
this.neighborHoodId = ""
this.buildingId = "";
this.buildingUnitId = "";
this.houseId = "";
} else {
this.$message.error(msg);
}
},
async getBuildList () {
const url = "/gov/org/icbuilding/buildingoption";
// const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/epidemicPrevention/page"
let params = {
neighborHoodId: this.neighborHoodId,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.optionsB = data;
this.buildingId = "";
this.buildingUnitId = "";
this.houseId = "";
} else {
this.$message.error(msg);
}
},
async getUniList () {
const url = "/gov/org/icbuildingunit/unitoption";
// const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/epidemicPrevention/page"
let params = {
buildingId: this.buildingId,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.optionsD = data;
this.buildingUnitId = "";
this.houseId = "";
} else {
this.$message.error(msg);
}
},
getHouseList () {
this.$http
.post("/gov/org/ichouse/houseoption", { unitId: this.buildingUnitId })
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg);
} else {
this.optionsH = res.data;
this.houseId = "";
}
})
.catch(() => {
return this.$message.error("网络错误");
});
},
handleSearch () {
// if (this.ownerName || this.ownerPhone || this.rentFlag || this.purpose || this.remark) {
@ -323,6 +516,10 @@ export default {
this.remark = ''
this.updateStartDate = ''
this.updateEndDate = ''
this.neighborHoodId = ''
this.buildingId = ''
this.buildingUnitId = ''
this.houseId = ''
this.pageSize = 10
this.pageNo = 1
@ -392,7 +589,7 @@ export default {
},
handleNodeClick (obj) {
async handleNodeClick (obj) {
this.ownerName = ''
this.ownerPhone = ''
this.rentFlag = ''
@ -404,18 +601,42 @@ export default {
this.selObj = JSON.parse(JSON.stringify(obj))
this.getTreeObj(obj)
await nextTick(1000)
this.vDisabled = false
this.bDisabled = false
if (obj.level === 'building') {//
this.$refs['ref_buildingTable'].loadTable('tree', this.selTreeObj)
this.selAgencyId = ''
this.selGridId = ''
await this.getValiheList()
this.neighborHoodId = this.selTreeObj.pid
await this.getBuildList()
this.buildingId = this.selTreeObj.id
await this.getUniList()
this.vDisabled = true
this.bDisabled = true
this.$nextTick(() => {
if (obj.level === 'building') {//
this.$refs['ref_buildingTable'].loadTable('tree', this.selTreeObj)
} else if (obj.level === 'neighborHood') {//
this.$refs['ref_neighTable'].loadTable(true, this.selTreeObj)
} else if (obj.level === 'neighborHood') {//
this.$refs['ref_neighTable'].loadTable(true, this.selTreeObj)
this.selAgencyId = ''
this.selGridId = ''
await this.getValiheList()
this.neighborHoodId = this.selTreeObj.id
await this.getBuildList()
this.vDisabled = true
} else {
this.$refs['ref_communityTable'].loadTable(true, this.selTreeObj)
if (obj.level === 'grid') {
this.selAgencyId = ''
this.selGridId = this.selTreeObj.id
} else {
this.$refs['ref_communityTable'].loadTable(true, this.selTreeObj)
this.selAgencyId = this.selTreeObj.id
this.selGridId = ''
}
})
this.getValiheList('', '')
}
},
@ -507,7 +728,7 @@ export default {
obj.longitude = this.centerPoint[1]
}
this.selTreeObj = obj
console.log(this.selTreeObj)
console.log('selTreeObj', this.selTreeObj)
},

32
src/views/modules/base/community/roomTable.vue

@ -297,6 +297,10 @@ export default {
sortType: this.sortType,
updateStartDate: this.updateStartDate,
updateEndDate: this.updateEndDate,
neighborHoodId: this.neighborHoodId,
buildingId: this.buildingId,
buildingUnitId: this.buildingUnitId,
houseId: this.houseId,
};
this.$refs.baobiao.init({
elseParams: {
@ -401,6 +405,10 @@ export default {
sortType: this.sortType,
updateStartDate: this.updateStartDate,
updateEndDate: this.updateEndDate,
neighborHoodId: this.neighborHoodId,
buildingId: this.buildingId,
buildingUnitId: this.buildingUnitId,
houseId: this.houseId,
};
const url = "/gov/org/house/houselist";
@ -602,6 +610,10 @@ export default {
updateStartDate: this.updateStartDate,
updateEndDate: this.updateEndDate,
buildingId: this.agencyObj.id,
neighborHoodId: this.neighborHoodId,
buildingId: this.buildingId,
buildingUnitId: this.buildingUnitId,
houseId: this.houseId,
};
if (this.agencyObj.level === "grid") {
@ -699,6 +711,10 @@ export default {
remark: this.remark,
updateStartDate: this.updateStartDate,
updateEndDate: this.updateEndDate,
neighborHoodId: this.neighborHoodId,
buildingId: this.buildingId,
buildingUnitId: this.buildingUnitId,
houseId: this.houseId,
buildingId: "",
neighborHoodId: "",
};
@ -891,6 +907,22 @@ export default {
type: String,
default: "",
},
neighborHoodId: {
type: String,
default: "",
},
buildingId: {
type: String,
default: "",
},
buildingUnitId: {
type: String,
default: "",
},
houseId: {
type: String,
default: "",
},
},
};
</script>

95
src/views/modules/base/epidemic/antiInfo.vue

@ -141,6 +141,22 @@
</el-form-item>
<el-form-item label="核酸检测时间"
label-width="110px"
prop="natStartDate">
<el-date-picker v-model="timeRange"
size="small"
type="daterange"
@change="handleTimeChange"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-button style="margin-left:30px"
size="small"
class="diy-button--search"
@ -153,7 +169,14 @@
</el-form>
</div>
<div class="div_table">
<div class="div_btn">
<el-button style="float:left;margin-left:10px"
class="diy-button--reset"
size="small"
@click="handleExport">导出</el-button>
</div>
<el-table class="table"
:data="tableData"
border
@ -473,6 +496,8 @@ export default {
age: {},
startBirthDay: '',
endBirthDay: '',
natStartDate: '',
natEndDate: '',
},
formDetail: {
name: '',
@ -516,13 +541,27 @@ export default {
this.getGridList()
this.getValiheList()
await this.loadTable()
this.sHeight = this.$refs.div_search.offsetHeight + 230
this.sHeight = this.$refs.div_search.offsetHeight + 270
},
activated () {
this.$refs['ref_table'].doLayout()
},
methods: {
handleTimeChange (time) {
if (time) {
this.searchForm.natStartDate = time[0]
this.searchForm.natEndDate = time[1]
} else {
this.searchForm.natStartDate = ''
this.searchForm.natEndDate = ''
}
},
handleAgeChange (val) {
console.log('val----age---', val)
if (val.start) {
@ -823,6 +862,7 @@ export default {
//
resetSearch () {
this.timeRange = []
this.$refs.ref_searchform.resetFields()
this.searchForm.buildingId = ''
this.searchForm.unitId = ''
@ -830,12 +870,63 @@ export default {
this.searchForm.age = {}
this.searchForm.startBirthDay = ''
this.searchForm.endBirthDay = ''
this.searchForm.natStartDate = ''
this.searchForm.natEndDate = ''
this.pageSize = 20
this.pageNo = 1
this.loadTable()
// this.loadTable()
},
//
async handleExport () {
let title = '居民防疫信息'
const url = "/epmetuser/epidemicPrevention/epidemicPreventionExport"
let params = {
pageSize: this.pageSize,
pageNo: this.pageNo,
...this.searchForm
}
app.ajax.exportFilePost(
url,
params,
(data, rspMsg) => {
this.download(data, title + '.xlsx')
},
(rspMsg, data) => {
this.$message.error(rspMsg);
}
);
},
//
download (data, fileName) {
if (!data) {
return
}
var csvData = new Blob([data])
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(csvData, fileName);
}
// for Non-IE (chrome, firefox etc.)
else {
var a = document.createElement('a');
document.body.appendChild(a);
a.style = 'display: none';
var url = window.URL.createObjectURL(csvData);
a.href = url;
a.download = fileName;
a.click();
a.remove();
window.URL.revokeObjectURL(url);
}
},
handleSizeChange (val) {
this.pageSize = val
this.pageNo = 1

38
src/views/modules/base/epidemic/natFocus/natFocusList.vue

@ -304,7 +304,12 @@
size="small"
@click="handleVisiteList(scope.row)">随访记录</el-button>
</div>
<div class="table-more-btn">
<el-button type="text"
class="div-table-button--delete"
size="small"
@click="handleDelete2(scope.row)">删除</el-button>
</div>
<el-button type="text"
size="small"
class="div-table-button--more"
@ -834,6 +839,37 @@ export default {
});
},
async handleDelete2 (row) {
this.$confirm("确认删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(async () => {
let delUrl = "/epmetuser/icEpidemicSpecialAttention/delete";
const { data, code, msg } = await requestPost(delUrl, [row.id]);
if (code === 0) {
this.$message({
type: "success",
message: "删除成功",
});
this.loadTable();
} else {
this.$message.error(msg);
}
})
.catch((err) => {
if (err == "cancel") {
// this.$message({
// type: "info",
// message: ""
// });
}
});
},
async deleteFocus (row) {
const url = "/epmetuser/icEpidemicSpecialAttention/cancel-attention";
// const url = "http://yapi.elinkservice.cn/mock/245/gov/org/placepatrolteam/del"

11
src/views/modules/base/epidemic/natInfo/natDetail.vue

@ -18,9 +18,16 @@
<span class="info-title-2">证件号</span>
<span>{{ formData.idCard||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">检检测地点</span>
<span class="info-title-2">采样时间</span>
<span>{{ formData.sampleTime||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">检测时间</span>
<span>{{ formData.natTime||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">检测地点</span>
<span>{{ formData.natAddress||'--' }}</span>
</div>
<div class="info-prop">

30
src/views/modules/base/epidemic/natInfo/natForm.vue

@ -95,7 +95,20 @@
v-model="formData.idCard">
</el-input>
</el-form-item>
<el-form-item label="采样时间"
style="display: block"
prop="sampleTime"
label-width="150px">
<el-date-picker class="item_width_2"
v-model="formData.sampleTime"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
type="datetime"
:picker-options="pickerOptions"
clearable
placeholder="选择时间">
</el-date-picker>
</el-form-item>
<el-form-item label="检测时间"
style="display: block"
prop="natTime"
@ -133,21 +146,6 @@
</el-radio-group>
</el-form-item>
<el-form-item label="采样时间"
style="display: block"
prop="sampleTime"
label-width="150px">
<el-date-picker class="item_width_2"
v-model="formData.sampleTime"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
type="datetime"
:picker-options="pickerOptions"
clearable
placeholder="选择时间">
</el-date-picker>
</el-form-item>
<el-form-item v-if=" formType!=='detail' || (formType=='detail'&&fileList.length>0)"
class="block"
label-width="150px"

33
src/views/modules/base/epidemic/natInfo/natList.vue

@ -22,7 +22,6 @@
<el-form-item label="本辖区居民">
<el-select class="list_item_width_1"
size="small"
:disabled="formData.orgType!='current'"
v-model.trim="formData.isResiUser"
placeholder="请选择">
<el-option v-for="item in isResiUserList"
@ -32,14 +31,13 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="核酸检测时间"
<el-form-item label="采样时间"
label-width="110px"
prop="startTime">
<el-date-picker v-model="timeRange"
prop="sampleStartTime">
<el-date-picker v-model="sampleTimeRange"
size="small"
type="datetimerange"
@change="handleTimeChange"
@change="handleSampleTimeChange"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
range-separator="至"
@ -48,13 +46,13 @@
</el-date-picker>
</el-form-item>
<el-form-item label="采样时间"
<el-form-item label="核酸检测时间"
label-width="110px"
prop="sampleStartTime">
<el-date-picker v-model="sampleTimeRange"
prop="startTime">
<el-date-picker v-model="timeRange"
size="small"
type="datetimerange"
@change="handleSampleTimeChange"
@change="handleTimeChange"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
range-separator="至"
@ -177,6 +175,12 @@
label="证件号"
min-width="170">
</el-table-column>
<el-table-column prop="sampleTime"
header-align="center"
align="center"
label="采样时间"
width="150">
</el-table-column>
<el-table-column prop="natTime"
header-align="center"
align="center"
@ -198,12 +202,7 @@
label="检测结果"
width="100">
</el-table-column>
<el-table-column prop="sampleTime"
header-align="center"
align="center"
label="采样时间"
width="150">
</el-table-column>
<el-table-column v-if="isResiUser"
prop="isResiUserShow"
header-align="center"
@ -413,7 +412,7 @@ export default {
this.tableData.forEach(item => {
item.isResiUserShow = item.isResiUser === '0' ? '否' : '是'
item.isResiUserShow = item.isLocalResiUser === '0' ? '否' : '是'
if (item.natResult === '1') {
item.natResultShow = '阳性'
} else if (item.natResult === '0') {

44
src/views/modules/base/epidemic/natInfo/noNatList.vue

@ -64,6 +64,31 @@
</el-input>
</el-form-item>
<el-form-item label="核酸检测时间">
<el-date-picker class="list_item_width_1"
v-model="formData.natDate"
format="yyyy-MM-dd"
value-format="yyyyMMdd"
type="date"
size="small"
clearable
placeholder="选择时间">
</el-date-picker>
</el-form-item>
<el-form-item label="检测状态">
<el-select class="list_item_width_1"
size="small"
clearable
v-model.trim="formData.status"
placeholder="请选择">
<el-option v-for="item in statusList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-button style="margin-left:30px"
size="small"
@ -270,13 +295,25 @@ export default {
label: '是'
},
],
statusList: [
{
value: '1',
label: '已检测'
},
{
value: '0',
label: '未检测'
},
],
formData: {
importDate: '',//
name: '',//
mobile: '',//
idCard: '',//
isResiUser: ''//(0: 1:)
isResiUser: '',//(0: 1:)
status: '',//10
natDate: ''
},
@ -523,8 +560,9 @@ export default {
name: '',//
mobile: '',//
idCard: '',//
importDate: ''
importDate: '',
status: '',//10
natDate: ''
}

2
src/views/modules/base/epidemic/travel.vue

@ -279,7 +279,7 @@
size="small"
@click="handleVisiteList(scope.row) ">随访记录</el-button>
</el-dropdown-item>
<el-dropdown-item>
<el-dropdown-item v-if=" agencyId===scope.row.agencyId">
<el-button type="text"
class="div-table-button--delete--noline "
size="small"

333
src/views/modules/communityParty/article/index.vue

@ -1,71 +1,144 @@
<template>
<div>
<base-page ref="basePage"
:searchParams="searchParams"
:tableParams="tableParams"
:tableUrl="tableUrl"
:addUrl="addUrl"
:editUrl="editUrl"
:delUrl="delUrl"
:editAuth="editAuth"
:delAuth="delAuth"
:infoUrl="infoUrl"
:exportUrl="exportUrl"
:importUrl="importUrl"
:mubanUrl="mubanUrl"
:editParams="editParams"
:editFixedParams="editFixedParams"
:editElseRules="editElseRules"
:editConfig="editConfig"
:editParamsDiv="5"
:editBtnName="(item) => (!item.latitude ? '待完善' : '修改')"
:formBtnFixed="true"
idName="articleId">
<base-page
ref="basePage"
:searchParams="searchParams"
:tableParams="tableParams"
:tableUrl="tableUrl"
:addUrl="addUrl"
:editUrl="editUrl"
:delUrl="delUrl"
:editAuth="editAuth"
:delAuth="delAuth"
:infoUrl="infoUrl"
:exportUrl="exportUrl"
:importUrl="importUrl"
:mubanUrl="mubanUrl"
:editParams="editParams"
:editFixedParams="editFixedParams"
:editElseRules="editElseRules"
:editConfig="editConfig"
:editParamsDiv="5"
:editBtnName="(item) => '修改'"
:formBtnFixed="true"
idName="articleId"
>
<template v-slot:editOperateSup="{ id, formType, info }">
<el-button v-if="formType != 'watch'"
type="warning"
size="small"
:disabled="draftBtnDisable"
@click="handleClickDraft(info)">存草稿</el-button>
<el-button
v-if="formType == 'add'"
type="warning"
size="small"
:disabled="draftBtnDisable"
@click="handleClickDraft(info)"
>存草稿</el-button
>
</template>
<template v-slot:listBtnSup="{ item }">
<el-button v-if="
<el-button
v-if="
item.statusFlag == 'published' &&
item.agencyId == $store.state.user.agencyId
"
@click="handleOfflineShow(item)"
type="text"
size="small"
style="color: #666">下线</el-button>
@click="handleOfflineShow(item)"
type="text"
size="small"
style="color: #666"
>下线</el-button
>
</template>
<template v-slot:listBtnbefore="{ item }">
<el-button v-if="item.isTop == '1'"
@click="handleTopArticle(item,'cancel_top')"
type="text"
size="small"
style="color: #fe6252">取消置顶</el-button>
<el-button v-else
@click="handleTopArticle(item,'top')"
type="text"
size="small"
style="color: #22c1c3">置顶</el-button>
<el-button
v-if="item.isTop == '1'"
v-show="item.statusFlag == 'published'"
@click="handleCancleTopArticle(item, 'cancel_top')"
type="text"
size="small"
style="color: #fe6252"
>取消置顶</el-button
>
<el-button
v-show="item.statusFlag == 'published'"
v-else
@click="handleTopArticle(item, 'top')"
type="text"
size="small"
style="color: #22c1c3"
>置顶</el-button
>
</template>
</base-page>
<el-dialog :visible.sync="offlineShowed"
:close-on-click-modal="false"
:close-on-press-escape="false"
title="下线"
width="850px"
top="5vh"
class="dialog-h"
@closed="offlineShowed = false">
<offline ref="offlineForm"
@close="offlineShowed = false"
@afterOffline="handleOfflineSuccess"></offline>
<el-dialog
:visible.sync="offlineShowed"
:close-on-click-modal="false"
:close-on-press-escape="false"
title="下线"
width="850px"
top="5vh"
class="dialog-h"
@closed="offlineShowed = false"
>
<offline
ref="offlineForm"
@close="offlineShowed = false"
@afterOffline="handleOfflineSuccess"
></offline>
</el-dialog>
<el-dialog
:visible.sync="showAddImage"
:close-on-click-modal="false"
:close-on-press-escape="false"
title="上传封面图片"
width="650px"
top="5vh"
class="dialog-h"
@closed="showAddImage = false"
>
<div class="dialog-h-content scroll-h">
<!-- <span>请先上 传封面图片</span> -->
<el-form
ref="ref_form"
:inline="true"
:model="formData"
class="div_form"
>
<div class="form_flex">
<div class="form_item">
<el-form-item
label=""
prop="selImgUrl"
label-width="150px"
style="display: block"
>
<el-upload
:headers="$getElUploadHeaders()"
:class="['avatar-uploader', { hide: hideUploadBtn }]"
ref="uploadPic"
:action="uploadUlr"
list-type="picture-card"
:on-exceed="exceedPic"
:before-upload="beforeAvatarUpload"
:on-remove="removePic"
:file-list="replayImgList"
:on-change="handleEditChange"
:on-success="handleSuccess"
:limit="1"
>
<span class="font-14">选择图片</span>
</el-upload>
</el-form-item>
</div>
</div>
</el-form>
</div>
<div class="div_btn">
<el-button size="small" @click="showAddImage = false"> </el-button>
<el-button size="small" type="primary" @click="handleAddImage"
> </el-button
>
</div>
</el-dialog>
</div>
</template>
@ -81,7 +154,7 @@ import nextTick from "dai-js/tools/nextTick";
export default {
props: {},
data () {
data() {
return {
offlineShowed: false,
@ -97,7 +170,7 @@ export default {
optionUrl: "/gov/voice/tag/taglist",
optionUrlParams: {},
optionList: [],
optionCook (list) {
optionCook(list) {
return list.map((item) => ({
label: item.tagName,
value: item.tagId,
@ -138,12 +211,12 @@ export default {
children: "subAgencyList",
checkStrictly: true,
},
optionCook (obj) {
optionCook(obj) {
return [obj];
},
supKeys: ["publishRangeId", "publishRangeType"],
supValues: ["", ""],
handleChangeFn (vals, item) {
handleChangeFn(vals, item) {
const { optionList } = item;
if (vals.length > 0) {
item["supValues"][0] = vals[vals.length - 1];
@ -195,14 +268,14 @@ export default {
exportUrl: "",
addUrl: "/gov/voice/article/addOrSaveDraft",
editUrl: "",
editUrl: "/gov/voice/article/updateArticle",
infoUrl: "/gov/voice/article/detailV2",
delUrl: "",
editAuth (item) {
return false;
delUrl: "/gov/voice/article/delete批量",
editAuth(item) {
return item.statusFlagName == "已发布";
},
delAuth (item) {
return false;
delAuth(item) {
return item.statusFlagName == "已下线";
},
editParams: [
@ -232,7 +305,7 @@ export default {
uploadUrl: window.SITE_CONFIG["apiURL"] + "/oss/file/article/upload",
supKeys: ["imgUrlArr", "imgUrl"],
supValues: [() => [], ""],
beforeImgUpload (file, item, that) {
beforeImgUpload(file, item, that) {
console.log(file);
const isLt1M = file.size / 1024 / 1024 < 10;
const srcType = file.type;
@ -268,10 +341,10 @@ export default {
checkStrictly: false,
emitPath: false,
},
optionCook (obj) {
optionCook(obj) {
return [obj];
},
handleChangeFn (vals, item, that) {
handleChangeFn(vals, item, that) {
console.log("handleChangeFn", vals);
const { optionList } = item;
const optionPlaneList = collapse(optionList, "subAgencyList");
@ -312,7 +385,7 @@ export default {
type: "date",
value: dateFormat(new Date(), "yyyy-MM-dd"),
pickerOptions: {
disabledDate (time) {
disabledDate(time) {
return time.getTime() > Date.now();
},
},
@ -333,7 +406,7 @@ export default {
optionType: "group",
supKeys: ["publisherName", "publisherType"],
supValues: ["", ""],
optionCook (data) {
optionCook(data) {
let ret = [];
const { agencyDeptList, agencyGridList, agencyId, agencyName } =
data;
@ -375,7 +448,7 @@ export default {
}
return ret;
},
handleChangeFn (vals, item, that) {
handleChangeFn(vals, item, that) {
const { optionList } = item;
let opts = [];
optionList.forEach((g) => {
@ -403,7 +476,7 @@ export default {
optionUrl: "/gov/voice/tag/taglist",
optionUrlParams: {},
optionList: [],
optionCook (list) {
optionCook(list) {
return list.map((item) => ({
label: item.tagName,
value: item.tagName,
@ -436,7 +509,7 @@ export default {
editElseRules: {},
editConfig: {
confirmBtnName: "发布",
cookInfoFn (data) {
cookInfoFn(data) {
if (data.richTextFlag == "0") {
data.content = data.contentList
.map((item) => {
@ -467,7 +540,7 @@ export default {
return data;
},
beforeSubmit (formType, fmData, that) {
beforeSubmit(formType, fmData, that) {
if (fmData.isTop == "1" && !fmData.imgUrl) {
that.$message.error("请上传封面图片");
return false;
@ -475,46 +548,130 @@ export default {
return true;
},
},
formData: {},
showAddImage: false,
uploadUlr: window.SITE_CONFIG["apiURL"] + "/oss/file/uploadvariedfile",
replayImgList: [],
hideUploadBtn: false,
selType: "top",
selArticleId: "",
selImgUrl: "",
};
},
components: { basePage, offline },
computed: {},
watch: {},
async mounted () { },
async mounted() {},
methods: {
async handleOfflineShow (item) {
async handleOfflineShow(item) {
console.log(item);
this.offlineShowed = true;
await nextTick(100);
this.$refs.offlineForm.initForm(item);
},
async handleTopArticle (item, type) {
async handleAddImage() {
console.log("formData", this.formData);
this.topArticle();
},
async handleCancleTopArticle(item, type) {
this.selType = type;
this.selArticleId = item.articleId;
await this.topArticle();
},
const url = "/gov/voice/article/topArticle";
async handleTopArticle(item, type) {
this.selType = type;
this.selArticleId = item.articleId;
let hasImage = await this.isHasImage();
if (hasImage === "refrsh") {
this.$message.error("请求失败,请重新尝试");
} else if (hasImage === "no") {
// this.$message.info("");
this.showAddImage = true;
} else {
await this.topArticle();
}
},
async isHasImage() {
const url = "/gov/voice/article/detailV2";
const { tableData } = this;
const { data, code, msg } = await requestPost(url, {
articleId: item.articleId,
type: type
articleId: this.selArticleId,
});
if (code === 0) {
// this.formData = data
if (data.imgUrl) {
return "has";
} else {
return "no";
}
} else {
return "refrsh";
}
},
async topArticle() {
const url = "/gov/voice/article/topArticle";
const { tableData } = this;
let params = {
articleId: this.selArticleId,
type: this.selType,
};
if (this.selImgUrl) {
params.imgUrl = this.selImgUrl;
}
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.$message.success("操作成功!");
this.showAddImage = false;
this.$refs.basePage.refresh();
} else {
this.$message.success("操作失败!");
}
},
handleOfflineSuccess () {
removePic(file, fileList) {
this.selImgUrl = "";
this.replayImgList = [];
this.hideUploadBtn = fileList.length >= 1;
},
// 3
handleEditChange(file, fileList) {
this.hideUploadBtn = fileList.length >= 1;
},
exceedPic() {
this.$message.warning("只能上传1张封面图");
},
beforeAvatarUpload(file) {
const isJPG = file.type === "image/jpeg";
const isLt2M = file.size / 1024 / 1024 < 10;
if (!isLt2M) {
this.$message.error("上传图片大小不能超过 10MB!");
}
return isLt2M;
},
handleSuccess(response, file, fileList) {
this.replayImgList.push(file);
this.selImgUrl = response.data.url;
},
handleOfflineSuccess() {
this.$refs.basePage.refresh();
this.offlineShowed = false;
},
async handleClickDraft (fmData) {
async handleClickDraft(fmData) {
let url = this.addUrl;
let params = {
...fmData,
@ -541,4 +698,18 @@ export default {
};
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/form-main.scss";
.avatar-uploader {
margin: 0 0 0 20px;
}
</style>
<style lang="scss">
.hide {
.el-upload--picture-card {
display: none !important;
}
}
</style>

441
src/views/modules/communityParty/heart/heartForm.vue

@ -183,7 +183,7 @@
<el-form-item label="签到有效范围(米)"
prop="signInRadius"
style="display: block"
label-width="160px">
label-width="150px">
<el-input-number class="item_width_2"
:min="0"
v-model="formData.signInRadius"
@ -193,80 +193,74 @@
</div>
<div class="form_flex">
<div class="form_item">
<el-form-item label="活动位置"
prop="longitude"
label-width="150px"
style="display: block">
<div style="width: 500px">
<el-select v-model="searchValueAct"
filterable
style="width: 330px"
remote
:reserve-keyword="true"
placeholder="请输入关键词"
:remote-method="remoteMethodAct"
:loading="loadingAct">
<el-option v-for="(item,index) in searchOptionsAct"
@click.native="handleClickKeyAct(index)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<div id="app_heart_act"
<el-form-item label="活动地点"
prop="actAddress"
label-width="150px">
<div style="width: 400px">
<el-input class="item_width_4"
maxlength="100"
style="width: 330px"
show-word-limit
placeholder="请输入所在地址"
v-model="formData.actAddress">
</el-input>
<el-button style="margin-left: 10px"
type="default"
size="small"
@click="handleSearchMapAct">查询</el-button>
<div id="map_act_id"
class="div_map"></div>
<!-- <div style="margin-top: 10px">
<span>经度</span>
<el-input class="item_width_3"
maxlength="50"
placeholder="请输入经度"
v-model="formData.actLatitude">
</el-input>
<span style="margin-left: 20px">纬度</span>
<el-input class="item_width_3"
maxlength="50"
placeholder="请输入纬度"
v-model="formData.actLongitude">
</el-input>
</div> -->
</div>
</el-form-item>
<el-form-item label="活动地址 "
prop="actAddress"
label-width="150px"
style="display: block">
<el-input class="item_width_1"
maxlength="50"
show-word-limit
placeholder="请输入位置 "
v-model="formData.actAddress">
</el-input>
</el-form-item>
</div>
<div class="form_item">
<el-form-item label="签到位置"
prop="longitude"
label-width="150px"
style="display: block">
<div style="width: 500px">
<el-select v-model="searchValueSignin"
filterable
style="width: 500px"
remote
:reserve-keyword="true"
placeholder="请输入关键词"
:remote-method="remoteMethodSignin"
:loading="loadingSignin">
<el-option v-for="(item,index) in searchOptionsSignin"
@click.native="handleClickKeySignin(index)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<div id="app_heart_signin"
<el-form-item label="签到地点"
prop="signInAddress"
label-width="150px">
<div style="width: 400px">
<el-input class="item_width_4"
maxlength="100"
style="width: 330px"
show-word-limit
placeholder="请输入所在地址"
v-model="formData.signInAddress">
</el-input>
<el-button style="margin-left: 10px"
type="default"
size="small"
@click="handleSearchMapSignin">查询</el-button>
<div id="map_signin_id"
class="div_map"></div>
<!-- <div style="margin-top: 10px">
<span>经度</span>
<el-input class="item_width_3"
maxlength="50"
placeholder="请输入经度"
v-model="formData.signInLatitude">
</el-input>
<span style="margin-left: 20px">纬度</span>
<el-input class="item_width_3"
maxlength="50"
placeholder="请输入纬度"
v-model="formData.signInLongitude">
</el-input>
</div> -->
</div>
</el-form-item>
<el-form-item label="签到地址 "
prop="signInAddress"
label-width="150px"
style="display: block">
<el-input class="item_width_1"
maxlength="50"
show-word-limit
placeholder="请输入位置 "
v-model="formData.signInAddress">
</el-input>
</el-form-item>
</div>
</div>
<el-form-item label="活动详情"
@ -340,12 +334,20 @@ import { Loading } from "element-ui"; // 引入Loading服务
import { requestPost } from "@/js/dai/request";
import Tinymce from "@c/tinymce2/index.vue";
import daiMap from "@/utils/dai-map";
let loading; //
var map_act;
var search_act;
var markers_act;
var infoWindowList_act;
var geocoder_act; //
var map_signin;
var search_signin;
var markers_signin;
var infoWindowList_signin;
var geocoder_signin; //
export default {
data () {
@ -384,16 +386,6 @@ export default {
};
return {
formType: "add", // addeditdetail
searchOptionsAct: [],
searchValueAct: '',
resultListAct: [],
loadingAct: false,
searchOptionsSignin: [],
searchValueSignin: '',
resultListSignin: [],
loadingSignin: false,
btnDisable: false,
customerId: "",
actId: "",
@ -476,13 +468,15 @@ export default {
mounted () {
this.customerId = localStorage.getItem("customerId");
this.loadSponsorlist();
this.initMap();
// this.replayImgList.push()
},
methods: {
async initForm (type, actId) {
this.$refs.ref_form.resetFields();
let { latitude, longitude } = this.$store.state.user;
this.formType = type;
if (actId) {
this.startLoading();
@ -493,26 +487,9 @@ export default {
} else {
this.actId = "";
this.formData.actId = "";
this.formData.actLatitude = latitude
this.formData.actLongitude = longitude
this.formData.signInLatitude = latitude
this.formData.signInLongitude = longitude
// this.formData = JSON.parse(JSON.stringify(this.formDataTemp));
// this.agencyIdArray = this.formData.sponsorPath.split(',')
}
this.$nextTick(() => {
if (!map_act) {
this.initMap(this.formData.actLatitude, this.formData.actLongitude, this.formData.signInLatitude, this.formData.signInLongitude)
} else {
map_act.setCenter(this.formData.actLatitude, this.formData.actLongitude);
map_act.setMarker(this.formData.actLatitude, this.formData.actLongitude);
map_signin.setCenter(this.formData.signInLatitude, this.formData.signInLongitude);
map_signin.setMarker(this.formData.signInLatitude, this.formData.signInLongitude);
}
})
},
//
@ -712,170 +689,188 @@ export default {
},
// init
initMap (latitude1, longitude1, latitude2, longitude2) {
map_act = new daiMap(
document.getElementById("app_heart_act"),
{ latitude1, longitude1 },
{
zoom: 16.2, //
pitch: 43.5, //
rotation: 45, //
}
);
map_signin = new daiMap(
document.getElementById("app_heart_signin"),
{ latitude2, longitude2 },
initMap () {
//
var center = new window.TMap.LatLng(36.0722275, 120.38945519);
// map TMap.Map()
map_act = new window.TMap.Map(document.getElementById("map_act_id"), {
center: center, //
zoom: 16.2, //
pitch: 43.5, //
rotation: 45, //
});
map_signin = new window.TMap.Map(
document.getElementById("map_signin_id"),
{
center: center, //
zoom: 16.2, //
pitch: 43.5, //
rotation: 45, //
}
);
search_act = new window.TMap.service.Search({ pageSize: 10 });
//
markers_act = new TMap.MultiMarker({
map: map_act,
geometries: [],
});
infoWindowList_act = Array(10);
geocoder_act = new TMap.service.Geocoder(); //
search_signin = new window.TMap.service.Search({ pageSize: 10 });
//
markers_signin = new TMap.MultiMarker({
map: map_signin,
geometries: [],
});
infoWindowList_signin = Array(10);
geocoder_signin = new TMap.service.Geocoder(); //
//
map_act.on("dragend", (e) => {
map_act.on("panend", (e) => {
this.handleMoveCenterAct(e);
});
map_act.setCenter(latitude1, longitude1);
map_act.setMarker(latitude1, longitude1);
this.handleMoveCenterAct();
//
map_signin.on("dragend", (e) => {
map_signin.on("panend", (e) => {
this.handleMoveCenterSignin(e);
});
this.handleMoveCenterSignin();
},
map_signin.setCenter(latitude2, longitude2);
map_signin.setMarker(latitude2, longitude2);
setMarkerAct (lat, lng) {
markers_act.setGeometries([]);
markers_act.add([
{
id: "4",
styleId: "marker",
position: new TMap.LatLng(lat, lng),
properties: {
title: "marker4",
},
},
]);
},
handleSearchMapAct () {
infoWindowList_act.forEach((infoWindow) => {
infoWindow.close();
});
infoWindowList_act.length = 0;
markers_act.setGeometries([]);
//
search_act
.searchNearby({
keyword: this.formData.actAddress,
radius: 1000,
autoExtend: true,
center: map_act.getCenter(),
})
.then((result) => {
let { data } = result;
if (Array.isArray(data) && data.length > 0) {
const {
location: { lat, lng },
} = data[0];
map_act.setCenter(new TMap.LatLng(lat, lng));
this.setMarkerAct(lat, lng);
this.formData.actLatitude = lat;
this.formData.actLongitude = lng;
} else {
this.$message.error("未检索到相关位置坐标");
}
});
},
async handleMoveCenterAct () {
handleMoveCenterAct (e) {
//
const { lat, lng } = map_act.getCenter();
const center = map_act.getCenter();
const lat = center.getLat();
const lng = center.getLng();
this.formData.actLatitude = lat;
this.formData.actLongitude = lng;
map_act.setMarker(lat, lng);
let { msg, data } = await map_act.getAddress(lat, lng);
if (msg == "success") {
this.formData.actAddress = data.address
this.searchValueAct = data.address
this.searchOptionsAct = []
this.setMarkerAct(lat, lng);
if (e && e.originalEvent) {
geocoder_act
.getAddress({ location: new TMap.LatLng(lat, lng) }) //
.then((result) => {
this.formData.actAddress = result.result.address;
});
}
},
async handleMoveCenterSignin () {
//
const { lat, lng } = map_signin.getCenter();
this.formData.signInLatitude = lat;
this.formData.signInLongitude = lng;
map_signin.setMarker(lat, lng);
let { msg, data } = await map_signin.getAddress(lat, lng);
if (msg == "success") {
this.formData.signInAddress = data.address
this.searchValueSignin = data.address
this.searchOptionsSignin = []
}
setMarkerSignin (lat, lng) {
markers_signin.setGeometries([]);
markers_signin.add([
{
id: "4",
styleId: "marker",
position: new TMap.LatLng(lat, lng),
properties: {
title: "marker4",
},
},
]);
},
async remoteMethodAct (query) {
if (query !== '') {
this.loadingAct = true;
const { msg, data } = await map_act.searchNearby(query);
this.loadingAct = false;
this.resultListAct = []
if (msg == "success" && data.resultList && data.resultList.length > 0) {
if (data.resultList && data.resultList.length > 0) {
this.resultListAct = data.resultList
this.searchOptionsAct = this.resultListAct.map(item => {
return { value: `${item.hotPointID}`, label: `${item.address + item.name}` };
});
handleSearchMapSignin () {
infoWindowList_signin.forEach((infoWindow) => {
infoWindow.close();
});
infoWindowList_signin.length = 0;
markers_signin.setGeometries([]);
//
search_signin
.searchNearby({
keyword: this.formData.signInAddress,
radius: 1000,
autoExtend: true,
center: map_signin.getCenter(),
})
.then((result) => {
let { data } = result;
if (Array.isArray(data) && data.length > 0) {
const {
location: { lat, lng },
} = data[0];
map_signin.setCenter(new TMap.LatLng(lat, lng));
this.setMarkerSignin(lat, lng);
this.formData.signInLatitude = lat;
this.formData.signInLongitude = lng;
} else {
this.$message.error("未检索到相关位置坐标");
}
} else {
this.searchOptionsAct = [
{
value: '0',
label: '未检索到结果'
}
]
}
} else {
this.searchOptionsAct = [];
}
});
},
async remoteMethodSignin (query) {
if (query !== '') {
this.loadingSign = true;
const { msg, data } = await map_signin.searchNearby(query);
this.loadingSign = false;
this.resultListSignin = []
if (msg == "success" && data.resultList && data.resultList.length > 0) {
if (data.resultList && data.resultList.length > 0) {
this.resultListSignin = data.resultList
this.searchOptionsSignin = this.resultListSignin.map(item => {
return { value: `${item.hotPointID}`, label: `${item.address + item.name}` };
});
}
} else {
this.searchOptionsSignin = [
{
value: '0',
label: '未检索到结果'
}
]
}
} else {
this.searchOptionsSignin = [];
handleMoveCenterSignin (e) {
//
const center = map_signin.getCenter();
const lat = center.getLat();
const lng = center.getLng();
this.formData.signInLatitude = lat;
this.formData.signInLongitude = lng;
this.setMarkerSignin(lat, lng);
if (e && e.originalEvent) {
geocoder_signin
.getAddress({ location: new TMap.LatLng(lat, lng) }) //
.then((result) => {
this.formData.signInAddress = result.result.address;
});
}
},
handleClickKeyAct (index) {
let selPosition = this.resultListAct[index]
let lonlat = selPosition.lonlat.split(" ")
map_act.setCenter(lonlat[1], lonlat[0]);
map_act.setMarker(lonlat[1], lonlat[0]);
this.formData.actLatitude = lonlat[1];
this.formData.actLongitude = lonlat[0];
this.formData.actAddress = selPosition.address + selPosition.name
},
handleClickKeySignin (index) {
let selPosition = this.resultListSignin[index]
let lonlat = selPosition.lonlat.split(" ")
map_signin.setCenter(lonlat[1], lonlat[0]);
map_signin.setMarker(lonlat[1], lonlat[0]);
this.formData.signInLatitude = lonlat[1];
this.formData.signInLongitude = lonlat[0];
this.formData.signInAddress = selPosition.address + selPosition.name
},
handleCancle () {
this.resetData();
this.$emit("dialogCancle");
},
resetData () {
this.searchValueAct = ''
this.searchOptionsAct = []
this.resultListAct = []
this.searchValueSignin = ''
this.searchOptionsSignin = []
this.resultListSignin = []
this.actId = "";
this.replayImgList = [];
this.agencyIdArray = [];

11
src/views/modules/cpts/base/index.vue

@ -720,13 +720,18 @@ export default {
const { tableData, idName } = this;
const idValue = tableData[rowIndex][idName];
let param = {
[idName]: idValue,
};
if (url.endsWith("/")) {
url += idValue;
}
if (url.endsWith("批量")) {
url = url.slice(0, -2);
param = [idValue];
}
const { data, code, msg } = await requestPost(url, {
[idName]: idValue,
});
const { data, code, msg } = await requestPost(url, param);
if (code === 0) {
this.$message.success("删除成功!");

94
src/views/modules/plugins/rent/rentcontractinfo-add-or-update.vue

@ -97,6 +97,53 @@
<el-form-item label="房主姓名" prop="ownerName">
<el-input v-model="dataForm.ownerName" placeholder="房主姓名" style="width: 210px;" disabled></el-input>
</el-form-item>
<div style="margin-left: 30px;height: 30px;font-weight: bold;">合同信息</div>
<div style="margin-left: 50px;height: 30px;">出租人信息</div>
<el-form-item label="出租人姓名" prop="lessorName" label-width="140px">
<el-input v-model="dataForm.lessorName" placeholder="出租人姓名"></el-input>
</el-form-item>
<el-form-item label="出租人证件号" prop="lessorIdCard" label-width="140px">
<el-input v-model="dataForm.lessorIdCard" placeholder="出租人证件号"></el-input>
</el-form-item>
<el-form-item label="出租人手机" prop="lessorMobile" label-width="140px">
<el-input v-model="dataForm.lessorMobile" placeholder="出租人手机"></el-input>
</el-form-item>
<el-form-item label="与房主关系" prop="lessorRelation" label-width="140px">
<!--<el-input v-model="dataForm.lessorRelation" placeholder="与房主关系"></el-input>-->
<el-select v-model="dataForm.lessorRelation" placeholder="与房主关系">
<el-option v-for="item in lessorRelationArr" :key="item.dictValue" :label="item.dictName" :value="item.dictValue">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="出租人现居住地" prop="lessorLiveAddress" label-width="140px">
<el-input v-model="dataForm.lessorLiveAddress" placeholder="出租人现居住地" ></el-input>
</el-form-item>
<br/>
<el-form-item label="中介合同附件" prop="agencyImgList" v-if="dataForm.lessorRelation ==='中介'" label-width="140px">
<template>
<upload-image :defaultFileList="dataForm.agencyImgList" :limit="6" @change="onChangeAgencyImgList"></upload-image>
</template>
</el-form-item>
<br/>
<div style="margin-left: 50px;height: 30px;">承租人信息</div>
<el-form-item label="承租人姓名" prop="lesseeName" label-width="140px">
<el-input v-model="dataForm.lesseeName" placeholder="承租人姓名" ></el-input>
</el-form-item>
<el-form-item label="承租人证件号" prop="lesseeIdCard" label-width="140px">
<el-input v-model="dataForm.lesseeIdCard" placeholder="承租人证件号" ></el-input>
</el-form-item>
<el-form-item label="承租人手机" prop="lesseeMobile" label-width="140px">
<el-input v-model="dataForm.lesseeMobile" placeholder="承租人手机" ></el-input>
</el-form-item>
<el-form-item label="工作单位" prop="lesseeUnit" label-width="140px">
<el-input v-model="dataForm.lesseeUnit" placeholder="工作单位" ></el-input>
</el-form-item>
<el-form-item label="承租人户籍地" prop="lesseeHouseAddress" label-width="140px">
<el-input v-model="dataForm.lesseeHouseAddress" placeholder="承租人户籍地" ></el-input>
</el-form-item>
<br/>
<div style="padding:20px 30px">
<div style="font-weight: bold;">居住成员信息</div>
<br/>
@ -206,53 +253,6 @@
</el-table-column>
</el-table>
</div>
<div style="margin-left: 30px;height: 30px;font-weight: bold;">合同信息</div>
<div style="margin-left: 50px;height: 30px;">出租人信息</div>
<el-form-item label="出租人姓名" prop="lessorName" label-width="140px">
<el-input v-model="dataForm.lessorName" placeholder="出租人姓名"></el-input>
</el-form-item>
<el-form-item label="出租人证件号" prop="lessorIdCard" label-width="140px">
<el-input v-model="dataForm.lessorIdCard" placeholder="出租人证件号"></el-input>
</el-form-item>
<el-form-item label="出租人手机" prop="lessorMobile" label-width="140px">
<el-input v-model="dataForm.lessorMobile" placeholder="出租人手机"></el-input>
</el-form-item>
<el-form-item label="与房主关系" prop="lessorRelation" label-width="140px">
<!--<el-input v-model="dataForm.lessorRelation" placeholder="与房主关系"></el-input>-->
<el-select v-model="dataForm.lessorRelation" placeholder="与房主关系">
<el-option v-for="item in lessorRelationArr" :key="item.dictValue" :label="item.dictName" :value="item.dictValue">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="出租人现居住地" prop="lessorLiveAddress" label-width="140px">
<el-input v-model="dataForm.lessorLiveAddress" placeholder="出租人现居住地" ></el-input>
</el-form-item>
<br/>
<el-form-item label="中介合同附件" prop="agencyImgList" v-if="dataForm.lessorRelation ==='中介'" label-width="140px">
<template>
<upload-image :defaultFileList="dataForm.agencyImgList" :limit="6" @change="onChangeAgencyImgList"></upload-image>
</template>
</el-form-item>
<br/>
<div style="margin-left: 50px;height: 30px;">承租人信息</div>
<el-form-item label="承租人姓名" prop="lesseeName" label-width="140px">
<el-input v-model="dataForm.lesseeName" placeholder="承租人姓名" ></el-input>
</el-form-item>
<el-form-item label="承租人证件号" prop="lesseeIdCard" label-width="140px">
<el-input v-model="dataForm.lesseeIdCard" placeholder="承租人证件号" ></el-input>
</el-form-item>
<el-form-item label="承租人手机" prop="lesseeMobile" label-width="140px">
<el-input v-model="dataForm.lesseeMobile" placeholder="承租人手机" ></el-input>
</el-form-item>
<el-form-item label="工作单位" prop="lesseeUnit" label-width="140px">
<el-input v-model="dataForm.lesseeUnit" placeholder="工作单位" ></el-input>
</el-form-item>
<el-form-item label="承租人户籍地" prop="lesseeHouseAddress" label-width="140px">
<el-input v-model="dataForm.lesseeHouseAddress" placeholder="承租人户籍地" ></el-input>
</el-form-item>
<br/>
<div style="margin-left: 30px;height: 30px;font-weight: bold;">合同内容</div>
<el-form-item label="签署日期" prop="signDate" label-width="140px">
<!--<el-input v-model="dataForm.signDate" placeholder="签署日期" ></el-input>-->

66
src/views/modules/plugins/rent/rentcontractinfo-look-or-check.vue

@ -18,38 +18,7 @@
<el-input v-model="dataForm.ownerName" placeholder="房主姓名" disabled></el-input>
</el-form-item>
</div>
<div style="padding:20px 30px">
<div style="height: 30px;font-weight: bold;">居住成员信息</div>
<el-table v-loading="dataListLoading" :data="dataForm.tenantList" border style="width: 100%">
<el-table-column label="序号" header-align="center" align="center" width="50px">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" header-align="center" align="center"></el-table-column>
<el-table-column prop="yfzgx" label="与户主关系" header-align="center" align="center" width="120"></el-table-column>
<el-table-column prop="mobile" label="手机" header-align="center" align="center" width="120"></el-table-column>
<el-table-column prop="idCard" label="证件号" header-align="center" align="center" width="180"></el-table-column>
<el-table-column prop="unit" label="工作单位" header-align="center" align="center" width="180" show-overflow-tooltip></el-table-column>
<el-table-column prop="politicalStatus" label="政治面貌" header-align="center" align="center"></el-table-column>
<el-table-column prop="isMilitary" label="是否服过兵役" header-align="center" align="center" width="120"></el-table-column>
<el-table-column prop="nation" label="国籍" header-align="center" align="center"></el-table-column>
<el-table-column prop="idCardImgList" label="证件照片" header-align="center" align="center">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.idCardImgList" :key="index">
<img :src="item.fileUrl" @click="imgShow(item.fileUrl)" width="40" height="40" />
</div>
</template>
</el-table-column>
<el-table-column prop="imgList" label="照片" header-align="center" align="center">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.imgList" :key="index">
<img :src="item.fileUrl" @click="imgShow(item.fileUrl)" width="40" height="40" />
</div>
</template>
</el-table-column>
</el-table>
</div>
<div style="margin-left: 50px;height: 30px;font-weight: bold;">合同信息</div>
<div style="margin-left: 50px;height: 30px;">出租人信息</div>
<el-form-item label="出租人姓名" prop="lessorName">
@ -103,7 +72,38 @@
</el-form-item>
<br/>
<div style="padding:20px 30px">
<div style="height: 30px;font-weight: bold;">居住成员信息</div>
<el-table v-loading="dataListLoading" :data="dataForm.tenantList" border style="width: 100%">
<el-table-column label="序号" header-align="center" align="center" width="50px">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" header-align="center" align="center"></el-table-column>
<el-table-column prop="yfzgx" label="与户主关系" header-align="center" align="center" width="120"></el-table-column>
<el-table-column prop="mobile" label="手机" header-align="center" align="center" width="120"></el-table-column>
<el-table-column prop="idCard" label="证件号" header-align="center" align="center" width="180"></el-table-column>
<el-table-column prop="unit" label="工作单位" header-align="center" align="center" width="180" show-overflow-tooltip></el-table-column>
<el-table-column prop="politicalStatus" label="政治面貌" header-align="center" align="center"></el-table-column>
<el-table-column prop="isMilitary" label="是否服过兵役" header-align="center" align="center" width="120"></el-table-column>
<el-table-column prop="nation" label="国籍" header-align="center" align="center"></el-table-column>
<el-table-column prop="idCardImgList" label="证件照片" header-align="center" align="center">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.idCardImgList" :key="index">
<img :src="item.fileUrl" @click="imgShow(item.fileUrl)" width="40" height="40" />
</div>
</template>
</el-table-column>
<el-table-column prop="imgList" label="照片" header-align="center" align="center">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.imgList" :key="index">
<img :src="item.fileUrl" @click="imgShow(item.fileUrl)" width="40" height="40" />
</div>
</template>
</el-table-column>
</el-table>
</div>
<div style="margin-left: 50px;height: 30px;font-weight: bold;">合同内容</div>
<el-form-item label="签署日期" prop="signDate">
<el-input v-model="dataForm.signDate" placeholder="签署日期" disabled></el-input>

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

@ -75,6 +75,12 @@
<div class="line"
@click="handleToDemand">查看需求</div>
</div>
<div v-if="info.operationType==='3'"
:class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">已转议题</span>
<div class="line"
@click="handleToIssue">查看议题</div>
</div>
<div v-if="info.satisfactionName"
:class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">满意度</span>
@ -287,6 +293,9 @@ export default {
handleToDemand () {
this.$emit("handleToDemand")
},
handleToIssue () {
this.$emit("handleToIssue")
},
//
handleSatisfy () {

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

@ -43,6 +43,7 @@
:source="source"
@handleToProject="handleToProject"
@handleToDemand="handleToDemand"
@handleToIssue="handleToIssue"
@handleClose="handleClose"></event-detail>
<div v-if="!eventDetailData.operationId &&pageTypeCopy == 'dispose' "
@ -97,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>
@ -151,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>
@ -180,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>
@ -201,6 +213,15 @@
:demandRecId="eventDetailCopy.operationId"
@close="handleCloseProject" />
</div>
<div v-if="pageTypeCopy == 'issue'">
<issue-info-origin ref="eleEditForm"
:pageType="issuePageType"
:issueId="eventDetailCopy.operationId"
:issueDetailData="issueDetailData"
@handleClose="handleCloseProject"
@handleOk="handleCloseProject"
@dialogOk="handleCloseProject" />
</div>
</div>
</template>
@ -211,6 +232,7 @@ import { Loading } from "element-ui"; // 引入Loading服务
import foldText from "@/views/components/foldText";
import projectInfoOrigin from "../../xiangmu/cpts/project-info";
import demandInfoOrigin from "@/views/modules/communityService/measure/info";
import issueInfoOrigin from "../../issue/cpts/issue-info";
import dateFormat from "dai-js/tools/dateFormat";
import eventAdd from "./add";
import eventDetail from "./event-detail";
@ -227,6 +249,7 @@ function iniData () {
replayInfo: {},
demand: {},
project: {},
issueInfo: {},
//
demandUserId: '',
@ -238,7 +261,10 @@ function iniData () {
projectProcess: [],
projectPageType: 'info',
pageTypeCopy: ''
pageTypeCopy: '',
issuePageType: '',
issueDetailData: {},
};
}
@ -274,7 +300,8 @@ export default {
eventDetail,
processForm,
projectInfoOrigin,
demandInfoOrigin
demandInfoOrigin,
issueInfoOrigin
},
data: iniData,
@ -423,6 +450,18 @@ export default {
// this.eventInfoData.categoryList = []
// this.eventInfoData.categoryList.push(this.demand.categoryId)
console.log('demond', this.demand)
} else if (this.formData.operationType === '3') {
this.project = {}
this.demand = {}
this.replayInfo = {}
this.issueInfo = this.$refs.ref_processinfo_add.issueInfo
if (this.issueInfo.categoryList && this.issueInfo.categoryList.length > 0) {
this.eventInfoData.categoryList = []
this.eventInfoData.categoryList.push(this.issueInfo.categoryList[0].id)
}
console.log('issueInfo', this.issueInfo)
}
}
@ -431,7 +470,8 @@ export default {
...this.eventInfoData,
// replayInfo: this.replayInfo,
project: this.project,
demand: this.demand
demand: this.demand,
issueInfo: this.issueInfo
}
console.log('this.formData', this.formData)
@ -496,6 +536,17 @@ export default {
console.log('demond', this.demand)
let url = '/gov/project/icEvent/icEventToDemand'
await this.submitDispose(url, this.demand)
} else if (this.formData.operationType === '3') {
this.replayInfo = {}
this.demand = {}
this.project = {}
this.issueInfo = this.$refs.ref_processinfo_dispose.issueInfo
//
console.log('issueInfo', this.issueInfo)
let url = '/gov/project/icEvent/icEventToIssue'
await this.submitDispose(url, this.issueInfo)
} else {
this.$message.info("请选择一种处理方式");
}
@ -545,6 +596,28 @@ export default {
this.pageTypeCopy = 'demand'
},
async handleToIssue () {
const url = "/gov/issue/manage/votingissuedetail";
const { data, code, msg } = await requestPost(url, {
issueId: this.eventDetailCopy.operationId,
});
if (code === 0) {
this.issueDetailData = { ...data };
} else {
this.$message.error(msg);
}
if (this.issueDetailData.issueStatus === 'voting') {
this.issuePageType = 'dispose'
} else {
this.issuePageType = 'info'
}
this.pageTypeCopy = 'issue'
},
handleCloseProject () {
this.getProjectProcess()
this.pageTypeCopy = 'info'

253
src/views/modules/shequzhili/event/cpts/process-form-issue.vue

@ -0,0 +1,253 @@
<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="issueTitle"
label-width="150px"
:class="{'form-item':source==='visiual'}"
style="display: block">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.issueTitle"
class="cell-width-2"
clearable
placeholder="请输入议题标题">
</el-input>
</div>
</el-form-item>
<el-form-item label="处理意见"
prop="suggestion"
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.suggestion"></el-input>
</div>
</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: '3',//[0: 1: 2: 3:]
suggestion: '',
issueTitle: '',
},
okflag: false,
eventDetailCopy: {},
casOptions: [],
iscascaderShow: 0,
selCategoryArray: [],
selCateObj: {},
optionProps: {
multiple: false,
value: 'id',
label: 'name',
children: 'subCategory',
},
};
},
components: {},
computed: {
dataRule () {
return {
issueTitle: [
{ required: true, message: "议题标题不能为空", trigger: "blur" },
],
suggestion: [
{ 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 getIssueInfo () {
this.okflag = false
this.$refs["ref_form1"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
} else {
this.formData.icEventId = this.eventId
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>

23
src/views/modules/shequzhili/event/cpts/process-form.vue

@ -19,6 +19,7 @@
<el-radio label="0">回复</el-radio>
<el-radio label="1">立项</el-radio>
<el-radio label="2">转服务</el-radio>
<el-radio label="3">转议题</el-radio>
</el-radio-group>
</el-form-item>
@ -50,6 +51,13 @@
:eventDetailData="eventDetailData"></process-form-demand>
</div>
<div v-if="operationType==='3'">
<process-form-issue ref="ref_process_form_issue"
:source="source"
:eventDetailData="eventDetailData"
:eventId="eventId"></process-form-issue>
</div>
</div>
@ -62,6 +70,7 @@ import { requestPost } from "@/js/dai/request";
import processFormReplay from "./process-form-replay";
import processFormProject from "./process-form-project";
import processFormDemand from "./process-form-demand";
import processFormIssue from "./process-form-issue";
let loading; //
@ -87,6 +96,7 @@ export default {
replayInfo: {},
demand: {},
project: {},
issueInfo: {},
okflag: false,
eventDetailCopy: {}
@ -96,7 +106,8 @@ export default {
components: {
processFormReplay,
processFormProject,
processFormDemand
processFormDemand,
processFormIssue
},
computed: {
dataRule () {
@ -201,6 +212,16 @@ export default {
this.okflag = true
} else {
return false
}
} else if (this.operationType === '3') {
this.$refs.ref_process_form_issue.getIssueInfo()
if (this.$refs.ref_process_form_issue.okflag) {
this.issueInfo = this.$refs.ref_process_form_issue.formData
this.okflag = true
} else {
return false
}

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

@ -268,7 +268,7 @@
:show-overflow-tooltip="true"
label="发生时间">
</el-table-column>
<el-table-column prop="operationTypeShow"
<el-table-column prop="operationTypeName"
align="center"
width="100"
:show-overflow-tooltip="true"
@ -744,18 +744,18 @@ export default {
})
: [];
this.tableData.forEach(item => {
if (item.operationType === '2') {
item.operationTypeShow = '已转服务'
}
if (item.operationType === '1') {
item.operationTypeShow = '已立项'
}
if (item.operationType === '0') {
item.operationTypeShow = '已回复'
}
// this.tableData.forEach(item => {
// if (item.operationType === '2') {
// item.operationTypeShow = ''
// }
// if (item.operationType === '1') {
// item.operationTypeShow = ''
// }
// if (item.operationType === '0') {
// item.operationTypeShow = ''
// }
});
// });
} else {
this.$message.error(msg);
}

778
src/views/modules/shequzhili/issue/cpts/add.vue

@ -0,0 +1,778 @@
<template>
<div class="g-add">
<div class="g-add-page">
<div class="g-left">
<el-form
ref="ref_form1"
:inline="true"
:model="formData"
:rules="dataRule"
class="form"
>
<el-form-item
label="所属网格 "
prop="gridId"
label-width="150px"
style="display: block"
>
<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>
</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-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"
>
</el-input>
</el-form-item>
<el-form-item
label="身份证号"
prop="idCard"
label-width="150px"
style="display: block"
>
<el-input
class="cell-width-1"
maxlength="30"
placeholder="请输入身份证号"
v-model="formData.idCard"
></el-input>
</el-form-item>
<el-form-item label="反应渠道" label-width="150px" prop="sourceType">
<el-select
v-model="formData.sourceType"
placeholder="请选择"
size="small"
clearable
class="cell-width-1"
>
<el-option
v-for="item in qudaoArray"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</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"
>
</el-date-picker>
</el-form-item>
<el-form-item
label="事件内容"
prop="eventContent"
label-width="150px"
style="display: block"
>
<el-input
class="cell-width-2"
type="textarea"
maxlength="500"
show-word-limit
:rows="5"
placeholder="请输入事件内容,不超过500字"
v-model="formData.eventContent"
></el-input>
</el-form-item>
</el-form>
</div>
<div class="g-right">
<el-form
ref="ref_form2"
:inline="true"
:model="formData"
:rules="dataRule"
class="form"
>
<el-form-item label="图片" label-width="150px" style="display: block">
<el-upload
:headers="$getElUploadHeaders()"
:class="['avatar-uploader', { hide: hideUploadBtn }]"
ref="uploadPic"
:action="uploadUlr"
list-type="picture-card"
:on-exceed="exceedPic"
:on-remove="removePic"
:file-list="replayImgList"
:on-change="handleEditChange"
:on-success="handleSuccess"
:limit="3"
>
<span class="font-14">选择图片</span>
<div slot="tip" class="upload_tip">
最多上传3张图片图片支持jpgjpegbmpgit或png格式
</div>
</el-upload>
</el-form-item>
<el-form-item
label="地理位置"
prop="address"
label-width="150px"
style="display: block"
>
<el-input class="cell-width-1" v-model="formData.address">
</el-input>
</el-form-item>
<el-form-item
label="位置坐标"
prop="longitude"
label-width="150px"
style="display: block"
>
<div style="width: 500px">
<div class="div_map">
<div id="app"></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>
</div>
</div>
<!-- 新增弹出框 -->
<el-dialog
:visible.sync="personTableShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:destroy-on-close="true"
title="选择居民"
width="550px"
top="5vh"
class="dialog-h"
@closed="diaClose"
>
<div style="padding: 10px 30px">
<el-form :inline="false" ref="ref_formSearch" :label-width="'90px'">
<el-form-item label="所属网格" label-width="150px">
<el-select
class="cell-width-1"
v-model.trim="selGridId"
placeholder="请选择"
clearable
>
<el-option
v-for="item in gridList"
@click.native="handleChangeGrid"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="居民" label-width="150px" prop="selPersonIndex">
<el-select
v-model="selPersonIndex"
class="cell-width-1"
filterable
placeholder="请选择"
clearable
>
<el-option
v-for="(item, index) in demandUserList"
:key="item.demandUserId"
:label="item.label"
:value="index"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<div class="div-btn">
<el-button
style="margin-left: 20px"
type="primary"
size="small"
@click="handleComfirmSelPerson"
>确定</el-button
>
</div>
</div>
</el-dialog>
</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 {
gridId: "", //
reportUserId: "", // ID
name: "", //
mobile: "", //
idCard: "", //
sourceType: "", //
happenTime: "", //
eventContent: "", //
imageList: [], //
// categoryList: [],// Id
address: "", //
latitude: "", //
longitude: "", //
// operationType: '',//
// content: '',//
// status: '',// processingclosed_case
};
}
export default {
data() {
return {
formType: "add", // addeditdetail
btnDisable: false,
gridList: [], //list--
qudaoArray: [
{
value: "1",
label: "多媒体反应",
},
{
value: "2",
label: "社区电话",
},
{
value: "3",
label: "12345",
},
{
value: "4",
label: "网络员手持终端",
},
],
formData: iniFmData(),
//
keyWords: "",
isFirst: true, //
// oss/file/uploadvariedfile
dialogImageUrl: "oss/file/uploadvariedfile",
uploadUlr: window.SITE_CONFIG["apiURL"] + "/oss/file/uploadvariedfile",
// upload_url: '', // URL
upload_name: "", //
replayImgList: [],
okflag: false,
formDataSearch: {
gridId: "",
name: "",
},
personTableShow: false,
selGridId: "",
selPersonIndex: "",
selPerson: {},
demandUserList: [],
hideUploadBtn: false,
};
},
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" },
],
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" },
],
eventContent: [
{ required: true, message: "事件内容不能为空", trigger: "blur" },
],
happenTime: [
{ required: true, message: "发生时间不能为空", trigger: "blur" },
],
address: [
{ required: true, message: "事件地址不能为空", trigger: "blur" },
],
longitude: [
{ required: true, message: "坐标位置不能为空", trigger: "blur" },
],
};
},
},
props: {},
watch: {
"formData.name": function (val) {
this.$emit("changeName", val);
},
"formData.mobile": function (val) {
this.$emit("changeMobile", val);
},
"formData.reportUserId": function (val) {
this.$emit("changeUserId", val);
},
"formData.gridId": function (val) {
this.selGridId = val;
this.$emit("changeGridId", val);
},
},
async mounted() {
const { user } = this.$store.state;
this.agencyId = user.agencyId;
let { latitude, longitude } = this.$store.state.user;
if (!latitude || latitude == "" || latitude == "0") {
latitude = 39.9088810666821;
longitude = 116.39743841556731;
}
this.formData.latitude = latitude;
this.formData.longitude = longitude;
this.initMap();
this.loadGrid();
this.getCategoryList();
},
methods: {
async handleShowPersonList() {
if (this.formData.gridId) {
await this.handleChangeGrid();
this.personTableShow = true;
} else {
this.$message.info("请先选择网格");
}
},
diaClose() {
this.personTableShow = false;
},
handleComfirmSelPerson() {
if (this.selPersonIndex === 0 || this.selPersonIndex) {
let selPerson = this.demandUserList[this.selPersonIndex];
this.formData.name = selPerson.demandUserName;
this.formData.mobile = selPerson.demandUserMobile;
this.formData.reportUserId = selPerson.demandUserId;
this.formData.idCard = selPerson.idCard;
this.personTableShow = false;
} else {
this.$message.info("请选择人员");
}
},
async handleChangeGrid() {
const url = "/epmetuser/icresiuser/demandusers";
// const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/epidemicPrevention/page"
let params = {
agencyId: "",
gridId: this.selGridId,
name: "",
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.demandUserList = data;
} else {
this.$message.error(msg);
}
this.tableLoading = false;
},
async loadGrid() {
const url = "/gov/org/customergrid/gridoption";
let params = {
agencyId: this.agencyId,
purpose: "addorupdate",
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.gridList = data;
} else {
this.$message.error(msg);
}
},
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.categrayList = data
//
++this.iscascaderShow;
this.casOptions = [];
this.selCategoryArray = [];
this.casOptions = treeDataNew;
} else {
this.$message.error(msg);
}
},
//
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;
},
handleChangeAgency(value) {
// this.agencyName = this.$refs["myCascader"].getCheckedNodes()[0].label
// this.orgId = this.selCategoryArray.length > 0 ? this.selCategoryArray[this.selCategoryArray.length - 1] : ''
},
async getEventInfo() {
this.okflag = false;
this.$refs["ref_form1"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
return false;
} else {
this.$refs["ref_form2"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
return false;
} else {
if (!formVltHelper.userOrMobile(this.formData.mobile)) {
this.$message({
type: "error",
message: "手机号格式有误",
});
return false;
}
const regCard = /(^\d{15}$)|(^\d{17}(\d|X)$)/; //1518151817X
if (
this.formData.idCard &&
regCard.test(this.formData.idCard) === false
) {
this.$message({
type: "warning",
message: "请输入正确的身份证号码",
});
return false;
}
this.okflag = true;
}
});
}
});
},
removePic(file, fileList) {
this.formData.imageList.splice(
this.formData.imageList.findIndex((item) => item === file.url),
1
);
this.replayImgList.splice(
this.replayImgList.findIndex((item) => item.uid === file.uid),
1
);
this.hideUploadBtn = fileList.length >= 3;
},
// 3
handleEditChange(file, fileList) {
this.hideUploadBtn = fileList.length >= 3;
},
exceedPic() {
this.$message.warning("最多上传3张预览图片");
},
handleSuccess(response, file, fileList) {
this.replayImgList.push(file);
this.formData.imageList.push(response.data.url);
},
// init
initMap() {
//
var center = new window.TMap.LatLng(
this.formData.latitude,
this.formData.longitude
);
// map TMap.Map()
map = new window.TMap.Map(document.getElementById("app"), {
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) => {
if (!this.isFirst) {
//
this.formData.address = result.result.address;
}
if (this.isFirst) {
this.isFirst = false;
}
});
},
resetData() {
this.formData = iniFmData();
this.replayImgList = [];
},
//
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/event-info.scss"
scoped
></style>
<style lang="scss">
.el-dialog__body {
padding: 0 10px 20px !important;
}
.hide {
.el-upload--picture-card {
display: none !important;
}
}
</style>

216
src/views/modules/shequzhili/issue/cpts/evaluationDetail.vue

@ -0,0 +1,216 @@
<template>
<div class="epidemic-form">
<div class="dialog-h-content scroll-h">
<el-table :data="commentList"
border
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
class="table"
style="width: 100%"
:height="maxTableHeight">
<el-table-column label="序号"
fixed="left"
type="index"
align="center"
width="50" />
<el-table-column prop="userNickName"
align="center"
min-width="120"
label="评价人"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="evaluateTimeShow"
align="center"
min-width="170"
label="评价时间"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="satisfaction"
align="center"
min-width="180"
:show-overflow-tooltip="true"
label="评价结果">
<template slot-scope="scope">
<el-image v-if="scope.row.satisfaction=='bad'"
style="width: 40px; height: 40px"
:src="badurl_light">
</el-image>
<el-image v-else-if="scope.row.satisfaction=='good'"
style="width: 40px; height: 40px"
:src="goodurl_light">
</el-image>
<el-image v-else
style="width: 40px; height: 40px"
:src="perfecturl_light">
</el-image>
</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">
</el-pagination>
</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";
import { mapGetters } from "vuex";
let loading //
export default {
data () {
return {
initLoading: false,
commentList: [],
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
badurl_light: require('@/assets/img/satisfy-images/face1_light.png'),
goodurl_light: require('@/assets/img/satisfy-images/face2_light.png'),
perfecturl_light: require('@/assets/img/satisfy-images/face3_light.png'),
}
},
components: {},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
},
methods: {
async initForm () {
this.startLoading()
await this.getList()
this.initLoading = true
this.endLoading()
},
async getList () {
const url = "/gov/issue/manage/evaluationlist"
let params = {
issueId: this.issueId,
pageNo: this.pageNo,
pageSize: this.pageSize,
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
data.forEach(element => {
element.evaluateTimeShow = dateFormat(
new Date(element.evaluateTime * 1000),
"yyyy-MM-dd hh:mm"
);
});
this.commentList = data
} else {
this.$message.error(msg)
}
},
handleSizeChange (val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getSuggestion();
},
handleCurrentChange (val) {
this.pageNo = val;
this.getSuggestion();
},
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: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 410 + this.iframeHeigh
: this.clientHeight - 410;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
props: {
issueId: {
type: String,
default: ''
},
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/detail-main.scss";
</style>

204
src/views/modules/shequzhili/issue/cpts/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>

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

@ -0,0 +1,498 @@
<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.belongsGridName||'--' }}</span>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">议题发表人</span>
<span>{{ issueInfo.issueInitiator||'--' }}</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 :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">意见和建议</span>
<div class="line"
@click="handleToSuggest">查看全部</div>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">分类</span>
<fold-text v-if="issueCate.length > 0"
style="width: 250px"
:row="3">
<div :key="item.name"
v-for="item in issueCate">
{{ item.name }}
</div>
</fold-text>
<span style="width: 250px"
v-else>--</span>
<el-popover v-if="issueInfo.issueStatus == 'voting'"
placement="bottom"
width="400"
height="400"
v-model="visibleCatePanel">
<div class="f"
style="min-height: 120px">
<h2>更改分类</h2>
<el-cascader v-model="selectedCateData"
:options="cateOptions"
:props="{
multiple: true,
label: 'name',
value: 'id',
children: 'subCategory',
}"
clearable></el-cascader>
<el-button style="margin-left: 10px"
size="small"
type="danger"
@click="updateIssueCate">确定</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>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">标签</span>
<fold-text v-if="issueTag.length > 0"
style="width: 250px"
:row="3">
<div :key="item.name"
v-for="item in issueTag">
{{ item.name }}
</div>
</fold-text>
<span style="width: 250px"
v-else>--</span>
<el-popover v-if="issueInfo.issueStatus == 'voting'"
placement="bottom"
width="450"
height="400"
v-model="visibleTagPanel">
<div class="f"
style="min-height: 120px">
<h2>更改标签</h2>
<el-select v-model="selectedTagData"
multiple
allow-create
filterable
placeholder="请选择"
@change="handleTagChange"
size="medium"
style="width: 350px">
<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="updateIssueTag">确定</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>
</div>
<div v-if="issueInfo.issueStatus==='closed'"
:class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">满意度评价</span>
<div class="line"
@click="handleToEvaluation">查看全部</div>
</div>
</div>
<div class="m-line">
<div class="stat">
<div class="stat-item">
<div>
{{ issueTrend.realityVoteCount }}/{{
issueTrend.shouldVoteCount
}}
</div>
<div class="z-weak">已表决/应表决</div>
</div>
<div class="stat-item">
<div>{{ issueTrend.supportAmount }}</div>
<div class="z-weak">支持</div>
</div>
<div class="stat-item">
<div>{{ issueTrend.oppositionAmount }}</div>
<div class="z-weak">反对</div>
</div>
</div>
<div v-if="issueChartData.length > 0"
class="m-chart">
<line-chart :list="issueChartData" />
</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";
import lineChart from "@/views/modules/visual/cpts/line-chart";
function iniData () {
return {
user: {},
projectPageType: 'info',
issueInfo: {},
showType: '',
popSelIssueCate: [],
issueCate: [],
cateOptions: [],
visibleCatePanel: false,
selectedCateData: [],
issueTag: [],
tagOptions: [],
visibleTagPanel: false,
selectedTagData: [],
issueTrend: {},
issueChartData: [],
};
}
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, lineChart
},
data: iniData,
computed: {},
watch: {
selectedCateData (val) {
const { cateOptions } = this;
this.popSelIssueCate = val
.filter((arr) => arr.length > 0)
.map((arr) => {
let ele1 = cateOptions.find((item) => item.id == arr[0]);
let ele2 = ele1.subCategory.find((item) => item.id == arr[1]);
return {
id: ele2.id,
name: ele1.name + "-" + ele2.name,
};
});
},
async selectedTagData (val) {
const { tagOptions } = this;
this.issueTag = 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.issueTag = this.issueTag.filter((item) => item.id);
},
},
created () { },
mounted () {
this.user = this.$store.state.user
if (this.issueId) {
this.issueInfo = JSON.parse(JSON.stringify(this.issueDetailData));
}
this.getChartInfo();
this.getIssueCate();
},
methods: {
watchImg (src) {
window.open(src);
},
handleClose () {
this.showType = ''
},
handleCloseEvent () {
this.$emit("handleClose");
},
async getApiData () {
},
handleToTopic () {
this.$emit("handleToTopic")
},
handleToEvent () {
this.$emit("handleToEvent")
},
handleToSuggest () {
this.$emit("handleToSuggest")
},
handleToEvaluation () {
this.$emit("handleToEvaluation")
},
async getChartInfo () {
const url = "/gov/issue/manage/votingTrendV2";
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
});
if (code === 0) {
this.issueTrend = data;
let chartData = [];
data.polyLine.forEach((item) => {
let date = dateFormat(new Date(item.voteDate * 1000), "yyyy-MM-dd");
// console.log("date:" + date);
chartData.push(
{
date,
value: item.supportIncrement,
type: "支持",
},
{
date,
value: item.oppositionIncrement,
type: "反对",
}
);
});
this.issueChartData = chartData;
} else {
this.$message.error(msg);
}
},
async getIssueCate () {
const url = "/gov/issue/issuecategory/categorytaglist";
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
});
if (code === 0) {
this.issueCate = data.categoryList;
this.issueTag = data.tagList;
if (this.issueInfo.issueStatus == "voting") {
this.getCateOptions();
this.getTagOptions();
}
} else {
this.$message.error(msg);
}
},
async getCateOptions () {
const url = "/gov/issue/issueprojectcategorydict/list";
const { data, code, msg } = await requestPost(url, {});
if (code === 0) {
this.cateOptions = data.map((item) => {
item.subCategory.forEach((subitem) => {
delete subitem.subCategory;
});
return item;
});
} else {
this.$message.error(msg);
}
},
async getTagOptions () {
const url = "/gov/issue/issueprojecttagdict/list";
const { data, code, msg } = await requestPost(url, {
categoryList: this.issueCate,
});
if (code === 0) {
this.tagOptions = {
customized: data.customized,
defaulted: data.defaulted,
};
this.selectedTagData = this.issueTag.map((item) => item.id);
} else {
this.$message.error(msg);
}
},
async updateIssueCate () {
const url = "/gov/issue/issuecategory/save";
const { popSelIssueCate } = this;
if (popSelIssueCate.length == 0) {
return this.$message.error("分类不能为空");
}
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
categoryList: popSelIssueCate,
});
if (code === 0) {
this.$message.success("更改成功");
this.visibleCatePanel = false;
this.issueCate = popSelIssueCate
this.getTagOptions();
} else {
this.$message.error(msg);
}
},
async updateIssueTag () {
const url = "/gov/issue/issuetags/save";
const { issueTag } = this;
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
tagList: issueTag,
});
if (code === 0) {
this.$message.success("更改成功");
this.visibleTagPanel = false;
} else {
this.$message.error(msg);
}
},
handleTagChange (val) {
console.log(val);
},
},
};
</script>
<style
lang="scss"
src="@/assets/scss/modules/shequzhili/project-info.scss"
scoped
></style>
<style lang="scss" scoped>
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>

451
src/views/modules/shequzhili/issue/cpts/issue-info.vue

@ -0,0 +1,451 @@
<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"
@handleToSuggest="handleToSuggest"
@handleToEvaluation="handleToEvaluation"
@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">{{ item.processName }}</div>
<div class="date">
{{ item.processTime }}
</div>
</div>
<div v-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|| item.progressDesc}}</div>
</div>
</div>
<div v-else-if="item.type==='project'">
<div v-if="item.processName==='回复'">
<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 v-else>
<div class="detail">
<div class="detail-field">处理部门</div>
<div class="detail-value">{{ item.departmentName }}</div>
</div>
<!-- <div class="detail"
v-if="item.assistanceUnitName">
<div class="detail-field">协办单位</div>
<div class="detail-value">
<fold-text :row="3">{{ item.assistanceUnitName }}</fold-text>
</div>
</div> -->
<div class="detail"
v-if="item.processName != '转项目' && item.publicReply">
<div class="detail-field"> </div>
<div class="detail-value">
<fold-text :row="3">{{ item.publicReply }}</fold-text>
</div>
</div>
<div class="detail"
v-if="item.processName != '转项目' && item.internalRemark">
<div class="detail-field">内部备注</div>
<div class="detail-value">
<fold-text :row="3">{{ item.internalRemark }}</fold-text>
</div>
</div>
<div v-if="item.internalFile&&item.internalFile.length>0"
class="detail">
<div class="attachement-list">
<a :href="att.url"
target="_blank"
:key="att.url"
v-for="att in item.internalFile">
<i class="el-icon-folder-opened"></i>
{{ att.name }}
</a>
</div>
</div>
</div>
</div>
<div v-else>
<div class="detail">
<div class="detail-field">处理部门</div>
<div class="detail-value">{{ item.departmentName }}</div>
</div>
<div class="detail">
<div class="detail-field">说明</div>
<div class="detail-value">{{ item.progressDesc }}</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>
<el-dialog :visible.sync="suggestShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'意见和建议'"
width="1150px"
top="5vh"
class="dialog-h"
@closed="diaDetailClose">
<suggest-detail ref="ref_detail_suggest"
:issueId="issueId"
@diaDetailClose="diaDetailClose"></suggest-detail>
</el-dialog>
<el-dialog :visible.sync="evaluationShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'满意度评价'"
width="1150px"
top="5vh"
class="dialog-h"
@closed="diaDetailClose">
<evaluation-detail ref="ref_detail_evaluation"
:issueId="issueId"
@diaDetailClose="diaDetailClose"></evaluation-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";
import suggestDetail from "./suggestDetail";
import evaluationDetail from "./evaluationDetail";
let loading; //
function iniData () {
return {
formData: {
operationType: '',
},
issueInfoData: {},
closeInfo: {},
demand: {},
project: {},
//
demandUserId: '',
demandUserName: '',
demandUserMobile: '',
gridId: '',
issueDetailCopy: {},
projectProcess: [],
projectPageType: 'info',
pageTypeCopy: '',
//
topicShow: false,
eventShow: false,
suggestShow: false,
evaluationShow: 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,
suggestDetail,
evaluationDetail,
},
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
this.suggestShow = false
this.evaluationShow = false
},
//
async getProjectProcess () {
const url = "/gov/issue/manage/progress";
// const url = "http://yapi.elinkservice.cn/mock/245/gov/project/icEvent/process";
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
});
if (code === 0) {
this.projectProcess = data.map((item) => {
item.processTime = dateFormat(
new Date(item.processTime * 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.formData.operationType = this.$refs.ref_processinfo_dispose.operationType
if (this.formData.operationType === '0') {
let categoryList = this.$refs.ref_detail.issueCate
if (categoryList.length === 0) {
this.$message.info("请先选择议题分类");
return false
}
this.closedInfo = {}
this.project = this.$refs.ref_processinfo_dispose.project
//
this.project.issueId = this.issueId
console.log('projectInfo', this.project)
let url = '/gov/issue/manage/shiftproject-v2'
await this.submitDispose(url, this.project)
} else if (this.formData.operationType === '1') {
this.project = {}
this.closedInfo = this.$refs.ref_processinfo_dispose.closedInfo
this.closedInfo.issueId = this.issueId
console.log('closedInfo', this.closedInfo)
//
let url = '/gov/issue/manage/closeissue'
await this.submitDispose(url, this.closedInfo)
} else {
this.$message.info("请选择一种处理方式");
}
} 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)
})
},
handleToSuggest () {
// this.pageTypeCopy = 'topic'
this.suggestShow = true
this.$nextTick(() => {
this.$refs.ref_detail_suggest.initForm()
})
},
handleToEvaluation () {
// this.pageTypeCopy = 'topic'
this.evaluationShow = true
this.$nextTick(() => {
this.$refs.ref_detail_evaluation.initForm()
})
},
//
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>

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

@ -0,0 +1,330 @@
<template>
<div class="">
<div>
<el-form ref="ref_form1"
:inline="false"
class="form">
<el-form-item label="处理方式"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="operationType">
<el-radio-group :class="{'form-item':source==='visiual'}"
v-model="operationType"
@change="handleChangeOperationType">
<el-radio label="0">转项目</el-radio>
<el-radio label="1">关闭</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div v-if="operationType==='0'">
<el-form ref="ref_project_form"
:inline="false"
:model="project"
:rules="projectDataRule">
<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) => (project.staffList = ret)"
@close="visibleStaffPanel = false" />
</div>
<div slot="reference">
<a v-if="project.staffList.length == 0"
style="cursor: pointer">点击选择</a>
<a v-else
style="cursor: pointer">已选 {{ project.staffList.length }} </a>
</div>
</el-popover>
</el-form-item>
<el-form-item label="项目方案"
prop="publicReply"
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="project.publicReply"></el-input>
</div>
</el-form-item>
<el-form-item label="内部备注"
prop="internalRemark"
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="project.internalRemark"></el-input>
</div>
</el-form-item>
</el-form>
</div>
<div v-if="operationType==='1'">
<el-form ref="ref_close_form"
:inline="false"
:model="closedInfo"
:rules="closeDataRule">
<el-form-item label="处理结果"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="resolveType">
<el-radio-group :class="{'form-item':source==='visiual'}"
v-model="closedInfo.resolveType">
<el-radio label="resolved">已解决</el-radio>
<el-radio label="unresolved">无需解决</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="关闭原因"
prop="closeReason"
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="closedInfo.closeReason"></el-input>
</div>
</el-form-item>
</el-form>
</div>
</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 {
casOptions: [],
iscascaderShow: 0,
selCategoryArray: [],
selCateObj: {},
optionProps: {
multiple: false,
value: 'id',
label: 'name',
children: 'subCategory',
},
operationType: '0',
visibleStaffPanel: false,
okflag: false,
eventDetailCopy: {},
closedInfo: {
resolveType: 'resolved',
closeReason: '',//
},
project: {
staffList: [],
internalRemark: '',
publicReply: '',
}
};
},
components: {
selectStaff,
},
computed: {
closeDataRule () {
return {
resolveType: [
{ required: true, message: "处理结果不能为空", trigger: "change" },
],
closeReason: [
{ required: true, message: "关闭原因不能为空", trigger: "change" },
],
};
},
projectDataRule () {
return {
staffList: [
{ required: true, message: "处理部门不能为空", trigger: "change" },
],
publicReply: [
{ required: true, message: "项目方案不能为空", trigger: "change" },
],
};
},
},
props: {
demandUserId: {
type: String,
default: "",
},
demandUserName: {
type: String,
default: "",
},
demandUserMobile: {
type: String,
default: "",
},
gridId: {
type: String,
default: "",
},
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) {
if (val === '0') {
this.$refs['ref_project_form'].resetFields()
} else {
this.$refs['ref_close_form'].resetFields()
}
},
async getProcessInfo () {
this.okflag = false
if (this.operationType === '0') {
this.$refs["ref_project_form"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
} else {
this.okflag = true
}
});
} else if (this.operationType === '1') {
this.$refs["ref_close_form"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
} else {
this.okflag = true
}
});
}
},
handleCancle () {
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>

202
src/views/modules/shequzhili/issue/cpts/suggestDetail.vue

@ -0,0 +1,202 @@
<template>
<div class="epidemic-form">
<div class="dialog-h-content scroll-h">
<el-table :data="suggestionList"
border
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
class="table"
style="width: 100%"
:height="maxTableHeight">
<el-table-column label="序号"
fixed="left"
type="index"
align="center"
width="50" />
<el-table-column prop="userShowName"
align="center"
width="80"
label="姓名"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="aititudeShow"
label="投票"
width="80"
align="center"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="timeShow"
align="center"
width="150"
label="时间"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="suggestion"
align="center"
min-width="180"
:show-overflow-tooltip="true"
label="建议">
</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">
</el-pagination>
</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";
import { mapGetters } from "vuex";
let loading //
export default {
data () {
return {
initLoading: false,
suggestionList: [],
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
}
},
components: {},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
},
methods: {
async initForm () {
this.startLoading()
await this.getSuggestion()
this.initLoading = true
this.endLoading()
},
async getSuggestion () {
const url = "/gov/issue/issuesuggestion/list"
let params = {
issueId: this.issueId,
pageNo: this.pageNo,
pageSize: this.pageSize,
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
data.forEach(element => {
element.userShowName = element.userShowName || '匿名'
element.aititudeShow = element.aititude === 'opposition' ? '反对' : '支持'
element.timeShow = dateFormat(
new Date(element.publishTime * 1000),
"yyyy-MM-dd hh:mm"
);
});
this.suggestionList = data
} else {
this.$message.error(msg)
}
},
handleSizeChange (val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getSuggestion();
},
handleCurrentChange (val) {
this.pageNo = val;
this.getSuggestion();
},
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: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 410 + this.iframeHeigh
: this.clientHeight - 410;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
props: {
issueId: {
type: String,
default: ''
},
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/detail-main.scss";
</style>

190
src/views/modules/shequzhili/issue/cpts/topicDetail.vue

@ -0,0 +1,190 @@
<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.topicPublisher||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">发布时间</span>
<span>{{ topicInfo.topicPublisherTimeShow||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">联系方式</span>
<span>{{ topicInfo.topicPublisherMobile||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">发布小组</span>
<span>{{ topicInfo.groupName||'--' }}</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.topicPublishTime) {
this.topicInfo.topicPublisherTimeShow = dateFormat(
new Date(this.topicInfo.topicPublishTime * 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>

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>

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

@ -0,0 +1,213 @@
<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>
<span>{{ topicInfo.topicContent||'--' }}</span>
</div>
<div v-if="topicInfo.photoList&&topicInfo.photoList.length>0"
:class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">图片</span>
<img :src="src.url"
:key="src.url"
style="width:150px;height:150px;padding-right:10px"
v-for="src in topicInfo.photoList"
@click="watchImg(src.url)" />
</div>
<div v-if="voiceList&&voiceList.length>0"
:class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<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',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">发布人</span>
<span>{{ topicInfo.publishedUser||'--' }}</span>
</div>
<div :class="['info-prop',{'info-prop-vis':source==='visiual'}]">
<span class="info-title-2">发布时间</span>
<span>{{ topicInfo.publishedTime||'--' }}</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
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: {},
topicInfo: {},
voiceList: {},
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));
this.topicInfo = JSON.parse(JSON.stringify(this.issueDetailData.topicInfo));
if (this.topicInfo.publishedTime) {
this.topicInfo.publishedTime = dateFormat(
new Date(this.topicInfo.publishedTime * 1000),
"yyyy-MM-dd hh:mm"
);
}
this.getAttechment()
}
},
methods: {
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)
}
},
watchImg (src) {
window.open(src);
},
handleClose () {
this.showType = ''
},
handleCloseEvent () {
this.$emit("handleClose");
},
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>

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

@ -0,0 +1,319 @@
<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'">
<div class="detail">
<div class="detail-field">驳回时间</div>
<div class="detail-value">{{ item.operateTime }}</div>
</div>
<div class="detail">
<div class="detail-field">驳回人</div>
<div class="detail-value">{{ item.staffName }}</div>
</div>
<div class="detail">
<div class="detail-field">驳回理由</div>
<div class="detail-value">{{ item.reason }}</div>
</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>

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

@ -0,0 +1,510 @@
<template>
<div class="div_main">
<div v-show="pageType == 'list'">
<div class="div_search">
<el-form :inline="true"
:model="formData"
ref="ref_searchform"
:label-width="'90px'">
<div>
<el-form-item label="所属组织"
prop="orgId">
<el-cascader class="item_width_2"
ref="myCascader"
size="small"
v-model="agencyIdArray"
:options="orgOptions"
:props="orgOptionProps"
:show-all-levels="false"
@change="handleChangeAgency"></el-cascader>
</el-form-item>
<el-form-item label="议题标题"
prop="issueTitle">
<el-input v-model="formData.issueTitle"
class="item_width_2"
size="small"
clearable
placeholder="请输入">
</el-input>
</el-form-item>
<el-form-item label="转议题时间"
prop="startTime">
<el-date-picker v-model="formData.startTime"
:picker-options="startPickerOptions"
class="item_width_2"
size="small"
type="date"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="开始时间">
</el-date-picker>
<span class="data-tag"></span>
<el-date-picker v-model="formData.endTime"
:picker-options="endPickerOptions"
class="item_width_2 data-tag"
size="small"
type="date"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="状态"
prop="applyStatus">
<el-select class="item_width_2"
v-model="formData.applyStatus"
placeholder="全部"
size="small"
clearable>
<el-option v-for="item in statusArray"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-button style="margin-left:30px"
size="small"
class="diy-button--search"
@click="handleSearch">查询</el-button>
<el-button style="margin-left:10px"
size="small"
class="diy-button--reset"
@click="resetSearch">重置</el-button>
</div>
</el-form>
</div>
<div class="div_table">
<div class="div_btn">
<el-button @click="handleExport"
class="diy-button--reset"
size="small">导出</el-button>
</div>
<el-table :data="tableData"
border
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
class="table"
style="width: 100%"
: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="gridName"
align="center"
label="所属网格"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="issueTitle"
label="议题标题"
min-width="150"
align="center"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="suggestion"
align="center"
min-width="150"
label="处理建议"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="applyTime"
align="center"
width="180"
:show-overflow-tooltip="true"
label="提交审核时间">
</el-table-column>
<el-table-column prop="applyStatusName"
align="center"
label="状态"
width="80"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column fixed="right"
label="操作"
align="center"
width="100">
<template slot-scope="scope">
<el-button v-if="scope.row.applyStatus==='under_auditing'"
@click="handleAudit(scope.row)"
type="text"
size="small"
class="div-table-button--edit">审核</el-button>
<el-button @click="handleWatch(scope.row)"
type="text"
size="small">查看</el-button>
</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>
<div v-if="pageType == 'dispose' || pageType == 'info'">
<issue-info ref="eleEditForm"
:pageType="pageType"
:issueId="issueId"
:issueDetailData="issueDetailData"
@handleClose="handleClose"
@handleOk="handleOk"
@dialogOk="handleEditSuccess" />
</div>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import { mapGetters } from "vuex";
import issueInfo from "./cptsAudit/issue-info";
import axios from "axios";
export default {
components: { issueInfo },
data () {
let endDisabledDate = (time) => {//datareturn
let nowData = Date.now()
if (this.formData.startTime) {
let startTime = new Date(this.formData.startTime)
return time.getTime() > nowData || time.getTime() < startTime || time.getTime() === startTime
} else {
return time.getTime() > nowData
}
}
let startDisabledDate = (time) => {//datareturn
let nowData = Date.now()
return time.getTime() > nowData
}
return {
pageType: "list", // list add dispose info
user: {},
agencyId: '',
gridList: [],//list--
tableData: [],
statusArray: [
{
value: "under_auditing",
label: "待审核",
},
{
value: "rejected",
label: "驳回",
},
],
formData: {
orgId: '',
orgType: '',
issueTitle: '',
startTime: '',
endTime: '',
applyStatus: '',
},
orgOptions: [],
orgOptionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
children: 'subAgencyList',
checkStrictly: true
},
agencyIdArray: [],
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
endPickerOptions: {
// disabledDate: endDisabledDate
},
startPickerOptions: {
// disabledDate: startDisabledDate
},
issueId: '',
issueDetailData: {},
};
},
computed: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 360 + this.iframeHeigh
: this.clientHeight - 360;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
watch: {
"formData.endTime": function (val) {
if (val && val != '') {
let arrayTemp = val.split(' ')
this.formData.endTime = arrayTemp[0] + ' 23:59:59'
}
},
},
mounted () {
console.log(this.$store.state)
this.user = this.$store.state.user
this.agencyId = this.user.agencyId
this.getOrgTreeList();
this.getTableData();
},
methods: {
handleSearch (val) {
console.log(this.formData);
this.pageNo = 1;
this.getTableData();
},
handleChangeAgency (val) {
let obj = this.$refs["myCascader"].getCheckedNodes()[0].data
if (obj) {
this.formData.orgType = obj.level === 'grid' ? 'grid' : 'agency'
this.formData.orgId = obj.agencyId
} else {
this.form.orgType = ''
this.form.orgId = ''
}
},
async getOrgTreeList () {
const url = "/gov/org/customeragency/agencygridtree"
let params = {
agencyId: this.agencyId,
purpose: "query"
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.orgOptions = []
this.orgOptions.push(data)
} else {
this.$message.error(msg)
}
},
async handleExport () {
const url = "/gov/issue/issueaudit/auditListExport";
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]
);
console.log("filename", fileName);
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) => {
console.log("获取导出情失败", err);
return this.$message.error("网络错误");
});
},
async handleWatch (row) {
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, {
issueApplicationId: this.issueId,
});
if (code === 0) {
this.issueDetailData = { ...data };
this.pageType = "info";
} else {
this.$message.error(msg);
}
},
//
async handleAudit (row) {
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, {
issueApplicationId: this.issueId,
});
if (code === 0) {
this.issueDetailData = { ...data };
this.pageType = "dispose";
} else {
this.$message.error(msg);
}
},
handleClose () {
this.pageType = "list";
this.issueId = ""
this.getTableData()
},
handleOk () {
this.pageType = "list";
this.issueId = ""
this.pageNo = 1
this.getTableData()
},
handleEditSuccess () {
this.handleClose();
this.getTableData();
},
async getTableData () {
const url = "/gov/issue/issueaudit/auditList";
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);
}
},
handleSizeChange (val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange (val) {
this.pageNo = val;
this.getTableData();
},
resetSearch () {
this.agencyIdArray = []
this.formData = {
orgId: '',
orgType: '',
issueTitle: '',
startTime: '',
endTime: '',
applyStatus: '',
}
this.pageNo = 1
// this.getTableData();
},
deepTree (arr, child) {
if (Array.isArray(arr) && arr.length > 0) {
return arr.map(item => {
// if (child === 'subAgencyList') item.value = item.orgType + '-' + item.orgId
return {
...item,
[child]: item[child] && item[child].length > 0 && this.deepTree(item[child], child) || null
}
})
}
}
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
@import "@/assets/scss/modules/management/list-main.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
.div_search {
.item_width_2 {
width: 200px;
}
}
</style>

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

@ -0,0 +1,558 @@
<template>
<div class="div_main">
<div v-show="pageType == 'list'">
<div class="div_search">
<el-form :inline="true"
:model="formData"
ref="ref_searchform"
:label-width="'90px'">
<div>
<el-form-item label="所属组织"
prop="orgId">
<el-cascader class="item_width_2"
ref="myCascader"
size="small"
v-model="agencyIdArray"
:options="orgOptions"
:props="orgOptionProps"
:show-all-levels="false"
@change="handleChangeAgency"></el-cascader>
</el-form-item>
<el-form-item label="议题标题"
prop="issueTitle">
<el-input v-model="formData.issueTitle"
class="item_width_2"
size="small"
clearable
placeholder="请输入">
</el-input>
</el-form-item>
<el-form-item label="转议题时间"
prop="startTime">
<el-date-picker v-model="formData.startTime"
:picker-options="startPickerOptions"
class="item_width_2"
size="small"
type="date"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="开始时间">
</el-date-picker>
<span class="data-tag"></span>
<el-date-picker v-model="formData.endTime"
:picker-options="endPickerOptions"
class="item_width_2 data-tag"
size="small"
type="date"
value-format="yyyyMMdd"
value="yyyy-MM-dd"
placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="状态"
prop="issueStatus">
<el-select class="item_width_2"
v-model="formData.issueStatus"
placeholder="全部"
size="small"
clearable>
<el-option v-for="item in statusArray"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-button style="margin-left:30px"
size="small"
class="diy-button--search"
@click="handleSearch">查询</el-button>
<el-button style="margin-left:10px"
size="small"
class="diy-button--reset"
@click="resetSearch">重置</el-button>
</div>
</el-form>
</div>
<div class="div_table">
<div class="div_btn">
<el-button @click="handleExport"
class="diy-button--reset"
size="small">导出</el-button>
</div>
<el-table :data="tableData"
border
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
class="table"
style="width: 100%"
: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="gridName"
align="center"
label="所属网格"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="issueTitle"
label="议题标题"
min-width="150"
align="center"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="suggestion"
align="center"
min-width="150"
label="处理建议"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="createdTime"
align="center"
width="180"
:show-overflow-tooltip="true"
label="转议题时间">
</el-table-column>
<el-table-column prop="sourceTypeName"
label="来源"
width="60"
align="center"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="supportCount"
align="center"
width="60"
label="支持"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="oppositionCount"
align="center"
width="60"
label="反对"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="issueStatusName"
align="center"
label="状态"
width="80"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column fixed="right"
label="操作"
align="center"
width="100">
<template slot-scope="scope">
<!-- <el-button v-if="scope.row.issueStatus==='voting'&& agencyId===scope.row.orgId"
@click="handleDispose(scope.row)"
type="text"
size="small"
class="div-table-button--edit">处理</el-button> -->
<el-button v-if="scope.row.issueStatus==='voting'"
@click="handleDispose(scope.row)"
type="text"
size="small"
class="div-table-button--edit">处理</el-button>
<el-button @click="handleWatch(scope.row)"
type="text"
size="small">查看</el-button>
</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>
<div v-if="pageType == 'dispose' || pageType == 'info'">
<issue-info ref="eleEditForm"
:pageType="pageType"
:issueId="issueId"
:issueDetailData="issueDetailData"
@handleClose="handleClose"
@handleOk="handleOk"
@dialogOk="handleEditSuccess" />
</div>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import { mapGetters } from "vuex";
import issueInfo from "./cpts/issue-info";
import axios from "axios";
export default {
components: { issueInfo },
data () {
let endDisabledDate = (time) => {//datareturn
let nowData = Date.now()
if (this.formData.startTime) {
let startTime = new Date(this.formData.startTime)
return time.getTime() > nowData || time.getTime() < startTime || time.getTime() === startTime
} else {
return time.getTime() > nowData
}
}
let startDisabledDate = (time) => {//datareturn
let nowData = Date.now()
return time.getTime() > nowData
}
return {
pageType: "list", // list add dispose info
user: {},
agencyId: '',
gridList: [],//list--
tableData: [],
statusArray: [
{
value: "voting",
label: "表决中",
},
{
value: "shift_project",
label: "已转项目",
},
{
value: "closed",
label: "已关闭",
},
],
formData: {
orgId: '',
orgType: '',
issueTitle: '',
startTime: '',
endTime: '',
issueStatus: '',
},
orgOptions: [],
orgOptionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
children: 'subAgencyList',
checkStrictly: true
},
agencyIdArray: [],
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
endPickerOptions: {
// disabledDate: endDisabledDate
},
startPickerOptions: {
// disabledDate: startDisabledDate
},
issueId: '',
issueDetailData: {},
};
},
computed: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 360 + this.iframeHeigh
: this.clientHeight - 360;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
watch: {
"formData.endTime": function (val) {
if (val && val != '') {
let arrayTemp = val.split(' ')
this.formData.endTime = arrayTemp[0] + ' 23:59:59'
}
},
},
mounted () {
console.log(this.$store.state)
this.user = this.$store.state.user
this.agencyId = this.user.agencyId
this.getOrgTreeList();
this.getTableData();
},
methods: {
handleSearch (val) {
console.log(this.formData);
this.pageNo = 1;
this.getTableData();
},
handleChangeAgency (val) {
let obj = this.$refs["myCascader"].getCheckedNodes()[0].data
if (obj) {
this.formData.orgType = obj.level === 'grid' ? 'grid' : 'agency'
this.formData.orgId = obj.agencyId
} else {
this.form.orgType = ''
this.form.orgId = ''
}
},
async getOrgTreeList () {
const url = "/gov/org/customeragency/agencygridtree"
let params = {
agencyId: this.agencyId,
purpose: "query"
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.orgOptions = []
this.orgOptions.push(data)
} else {
this.$message.error(msg)
}
},
async handleExport () {
const url = "/gov/issue/issue/allIssueListExport";
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]
);
console.log("filename", fileName);
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) => {
console.log("获取导出情失败", err);
return this.$message.error("网络错误");
});
},
async handleWatch (row) {
this.issueId = row.issueId
const url = "/gov/issue/manage/votingissuedetail";
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
});
if (code === 0) {
this.issueDetailData = { ...data };
this.pageType = "info";
} else {
this.$message.error(msg);
}
},
//
async handleDispose (row) {
this.issueId = row.issueId
// this.issueId = '29bbec4b08bb11edbb6b0050568f8cf7'
const url = "/gov/issue/manage/votingissuedetail";
// const url = "http://yapi.elinkservice.cn/mock/245/gov/project/icEvent/detail";
const { data, code, msg } = await requestPost(url, {
issueId: this.issueId,
});
if (code === 0) {
this.issueDetailData = { ...data };
this.pageType = "dispose";
} else {
this.$message.error(msg);
}
},
handleClose () {
this.pageType = "list";
this.issueId = ""
this.getTableData()
},
handleOk () {
this.pageType = "list";
this.issueId = ""
this.pageNo = 1
this.getTableData()
},
handleEditSuccess () {
this.handleClose();
this.getTableData();
},
async getTableData () {
const url = "/gov/issue/issue/allIssueList";
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;
})
: [];
this.tableData.forEach(item => {
if (item.sourceType === 'ic_event') {
item.sourceTypeName = '事件'
} else if (item.sourceType === 'resi_topic') {
item.sourceTypeName = '话题'
} else {
item.sourceTypeName = '--'
}
if (item.operationType === '2') {
item.operationTypeShow = '已转服务'
}
if (item.operationType === '1') {
item.operationTypeShow = '已立项'
}
if (item.operationType === '0') {
item.operationTypeShow = '已回复'
}
});
} else {
this.$message.error(msg);
}
},
handleSizeChange (val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange (val) {
this.pageNo = val;
this.getTableData();
},
resetSearch () {
this.agencyIdArray = []
this.formData = {
orgId: '',
orgType: '',
issueTitle: '',
startTime: '',
endTime: '',
issueStatus: '',
}
this.pageNo = 1
// this.getTableData();
},
deepTree (arr, child) {
if (Array.isArray(arr) && arr.length > 0) {
return arr.map(item => {
// if (child === 'subAgencyList') item.value = item.orgType + '-' + item.orgId
return {
...item,
[child]: item[child] && item[child].length > 0 && this.deepTree(item[child], child) || null
}
})
}
}
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
@import "@/assets/scss/modules/management/list-main.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
.div_search {
.item_width_2 {
width: 200px;
}
}
</style>

47
src/views/modules/shequzhili/xiangmu/cpts/project-info.vue

@ -308,11 +308,11 @@
</el-input>
</el-form-item>
<el-form-item
label="图片/附件:"
<el-form-item label="图片/附件:"
:class="{'form-item':source==='visiual'}"
prop="internalFile">
<el-upload :headers="$getElUploadHeaders()" class="avatar-uploader"
<el-upload :headers="$getElUploadHeaders()"
class="avatar-uploader"
:action="uploadUrl"
:data="{ customerId: customerId }"
:show-file-list="true"
@ -439,9 +439,17 @@
</div>
<div v-if="pageType == 'origin-info'">
<issue-info v-if="projectInfo.origin == 'issue'"
<issue-info-origin v-if="projectInfo.origin == 'issue'"
ref="eleEditForm"
:pageType="issuePageType"
:issueId="projectInfo.originId"
:issueDetailData="issueDetailData"
@handleClose="handleBackInfo"
@handleOk="handleBackInfo"
@dialogOk="handleBackInfo" />
<!-- <issue-info v-if="projectInfo.origin == 'issue'"
@close="handleBackInfo"
:issue-id="projectInfo.originId" />
:issue-id="projectInfo.originId" /> -->
<event-info v-if="projectInfo.origin == 'resi_event'"
@close="handleBackInfo"
:event-id="projectInfo.originId" />
@ -470,6 +478,7 @@ import issueInfo from "./issue-info";
import eventInfo from "./event-info";
import projectEvaluation from "./project-evaluation";
import dateFormat from "dai-js/tools/dateFormat";
import issueInfoOrigin from "../../issue/cpts/issue-info";
function iniData () {
return {
@ -587,6 +596,9 @@ function iniData () {
tagOptions: [],
visibleTagPanel: false,
selectedTagData: [],
issuePageType: '',
issueDetailData: {},
};
}
@ -613,6 +625,7 @@ export default {
eventInfo,
projectEvaluation,
selectStaff,
issueInfoOrigin
},
data: iniData,
@ -853,8 +866,30 @@ export default {
}
},
handleWatchOrigin () {
async handleWatchOrigin () {
const url = "/gov/issue/manage/votingissuedetail";
const { data, code, msg } = await requestPost(url, {
issueId: this.projectInfo.originId,
});
if (code === 0) {
this.issueDetailData = { ...data };
} else {
this.$message.error(msg);
}
this.pageType = "origin-info";
if (this.issueDetailData.issueStatus === 'voting') {
this.issuePageType = 'dispose'
} else {
this.issuePageType = 'info'
}
this.pageTypeCopy = 'issue'
},
handleBackInfo () {
this.pageType = "info";

432
src/views/modules/shequzhili/xiangmu/index.vue

@ -1,80 +1,67 @@
<template>
<div class="resi-container">
<div class="g-page" v-show="pageType == 'list'">
<el-card ref="searchCard" class="search-card">
<el-form
ref="searchForm"
:inline="true"
:model="fmData"
:label-width="'100px'"
class="demo-form-inline"
>
<div class="g-page"
v-show="pageType == 'list'">
<el-card ref="searchCard"
class="search-card">
<el-form ref="searchForm"
:inline="true"
:model="fmData"
:label-width="'100px'"
class="demo-form-inline">
<div>
<el-form-item label="项目标题" prop="title">
<el-input
v-model="fmData.title"
class="resi-cell-input"
size="small"
clearable
placeholder="请输入"
>
<el-form-item label="项目标题"
prop="title">
<el-input v-model="fmData.title"
class="resi-cell-input"
size="small"
clearable
placeholder="请输入">
</el-input>
</el-form-item>
<el-form-item label="转项目时间" prop="date">
<el-date-picker
v-model="fmData.startDate"
size="small"
type="date"
value-format="yyyy-MM-dd"
style="width: 150px"
placeholder="开始时间"
>
<el-form-item label="转项目时间"
prop="date">
<el-date-picker v-model="fmData.startDate"
size="small"
type="date"
value-format="yyyy-MM-dd"
style="width: 150px"
placeholder="开始时间">
</el-date-picker>
<span style="margin:0 8px;"></span>
<el-date-picker
v-model="fmData.endDate"
size="small"
type="date"
style="width: 150px"
value-format="yyyy-MM-dd"
placeholder="结束时间"
>
<el-date-picker v-model="fmData.endDate"
size="small"
type="date"
style="width: 150px"
value-format="yyyy-MM-dd"
placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model.trim="fmData.status"
placeholder="请选择"
size="small"
clearable
style="width: 150px"
class="resi-cell-select"
>
<el-option
v-for="item in optionsStatus"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-form-item label="状态"
prop="status">
<el-select v-model.trim="fmData.status"
placeholder="请选择"
size="small"
clearable
style="width: 150px"
class="resi-cell-select">
<el-option v-for="item in optionsStatus"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item style="margin-left: 35px">
<el-button
class="diy-button--search"
size="small"
@click="handleSearch"
>查询</el-button
>
<el-button
class="diy-button--reset"
size="small"
@click="resetForm('searchForm')"
>重置</el-button
>
<el-button class="diy-button--search"
size="small"
@click="handleSearch">查询</el-button>
<el-button class="diy-button--reset"
size="small"
@click="resetForm('searchForm')">重置</el-button>
</el-form-item>
</div>
</el-form>
@ -82,185 +69,147 @@
<el-card class="resi-card-table">
<div class="resi-row-btn">
<el-button
v-if="false"
class="diy-button--add"
size="small"
@click="handleAdd"
>新增</el-button
>
<el-button
v-if="false"
class="diy-button--export"
size="small"
@click="handleExportModule('room')"
>下载模板</el-button
>
<el-upload :headers="$getElUploadHeaders()"
v-if="false"
ref="upload"
class="upload-btn"
action="uploadUlr"
:limit="1"
:accept="'.xls,.xlsx'"
:with-credentials="true"
:show-file-list="false"
:auto-upload="true"
:on-progress="handleProgress"
:on-success="handleExcelSuccess"
:before-upload="beforeExcelUpload"
:http-request="uploadHttpRequest"
>
<el-button
size="small"
class="diy-button--delete"
:loading="importLoading"
>{{ importBtnTitle }}</el-button
>
<el-button v-if="false"
class="diy-button--add"
size="small"
@click="handleAdd">新增</el-button>
<el-button v-if="false"
class="diy-button--export"
size="small"
@click="handleExportModule('room')">下载模板</el-button>
<el-upload :headers="$getElUploadHeaders()"
v-if="false"
ref="upload"
class="upload-btn"
action="uploadUlr"
:limit="1"
:accept="'.xls,.xlsx'"
:with-credentials="true"
:show-file-list="false"
:auto-upload="true"
:on-progress="handleProgress"
:on-success="handleExcelSuccess"
:before-upload="beforeExcelUpload"
:http-request="uploadHttpRequest">
<el-button size="small"
class="diy-button--delete"
:loading="importLoading">{{ importBtnTitle }}</el-button>
</el-upload>
<el-button @click="handleChu" class="diy-button--reset" size="small"
>导出</el-button
>
<el-button @click="handleChu"
class="diy-button--reset"
size="small">导出</el-button>
</div>
<el-table
:data="tableData"
border
style="width: 100%"
class="resi-table"
:height="maxTableHeight"
>
<el-table-column
label="序号"
fixed="left"
type="index"
align="center"
width="50"
/>
<el-table-column
prop="gridName"
align="center"
label="所属网格"
:show-overflow-tooltip="true"
>
<el-table :data="tableData"
border
style="width: 100%"
class="resi-table"
:height="maxTableHeight">
<el-table-column label="序号"
fixed="left"
type="index"
align="center"
width="50" />
<el-table-column prop="gridName"
align="center"
label="所属网格"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="title"
label="项目标题"
align="center"
:show-overflow-tooltip="true"
>
<el-table-column prop="title"
label="项目标题"
align="center"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="shiftProjectTime"
width="100"
align="center"
label="转项目时间"
:show-overflow-tooltip="true"
>
<el-table-column prop="shiftProjectTime"
width="100"
align="center"
label="转项目时间"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="projectScheme"
align="center"
label="项目方案"
:show-overflow-tooltip="true"
>
<el-table-column prop="projectScheme"
align="center"
label="项目方案"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="internalRemark"
align="center"
label="内部备注"
:show-overflow-tooltip="true"
>
<el-table-column prop="internalRemark"
align="center"
label="内部备注"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="originName"
align="center"
label="来源"
width="100"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="departmentNameList"
align="center"
label="当前处理部门 "
:show-overflow-tooltip="true"
>
<el-table-column prop="departmentNameList"
align="center"
label="当前处理部门 "
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="detentionDays"
align="center"
label="滞留工作日 "
:show-overflow-tooltip="true"
>
<el-table-column prop="detentionDays"
align="center"
label="滞留工作日 "
:show-overflow-tooltip="true">
</el-table-column>
<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 == 'pending' && scope.row.processable"
@click="handleEdit(scope.$index)"
type="text"
size="small"
class="div-table-button--edit"
>处理</el-button
>
<el-button
v-else
@click="handleWatch(scope.$index)"
type="text"
size="small"
>查看</el-button
>
<el-popconfirm
v-if="false"
title="删除之后无法回复,确认删除?"
@onConfirm="handleDel(scope.row, scope.$index)"
@confirm="handleDel(scope.row, scope.$index)"
>
<el-button
slot="reference"
type="text"
size="small"
class="div-table-button--delete"
style="margin-left: 10px"
>删除</el-button
>
<el-button v-if="scope.row.status == 'pending' && scope.row.processable"
@click="handleEdit(scope.$index)"
type="text"
size="small"
class="div-table-button--edit">处理</el-button>
<el-button v-else
@click="handleWatch(scope.$index)"
type="text"
size="small">查看</el-button>
<el-popconfirm v-if="false"
title="删除之后无法回复,确认删除?"
@onConfirm="handleDel(scope.row, scope.$index)"
@confirm="handleDel(scope.row, scope.$index)">
<el-button slot="reference"
type="text"
size="small"
class="div-table-button--delete"
style="margin-left: 10px">删除</el-button>
</el-popconfirm>
</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 @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>
</el-card>
</div>
<div class="g-page" v-if="pageType == 'edit' || pageType == 'info'">
<project-info
ref="eleEditForm"
:type="pageType"
:projectId="currentProject.projectId"
@close="handleClose"
@afterEdit="handleEditSuccess"
/>
<div class="g-page"
v-if="pageType == 'edit' || pageType == 'info'">
<project-info ref="eleEditForm"
:type="pageType"
:projectId="currentProject.projectId"
@close="handleClose"
@afterEdit="handleEditSuccess" />
</div>
</div>
</template>
@ -275,7 +224,7 @@ import axios from "axios";
export default {
components: { projectInfo },
data() {
data () {
return {
pageType: "list", // list dispose info issue-info
@ -315,7 +264,7 @@ export default {
};
},
computed: {
maxTableHeight() {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 360 + this.iframeHeigh
: this.clientHeight - 360;
@ -333,11 +282,11 @@ export default {
}
},
},
mounted() {
mounted () {
this.getTableData();
},
methods: {
async handleExportModule() {
async handleExportModule () {
let url = "/heart/iccommunityselforganization/import-template-download";
let params = {};
@ -374,18 +323,18 @@ export default {
});
},
//
handleExcelSuccess(res, file) {
handleExcelSuccess (res, file) {
if (res.code === 0 && res.msg === "success") {
console.log("resss---ppp", res);
} else {
this.$message.error(res.msg);
}
},
handleProgress(event, file, fileList) {
handleProgress (event, file, fileList) {
console.log("percentage", file.percentage);
},
beforeExcelUpload(file) {
beforeExcelUpload (file) {
console.log("file", file);
const isType = file.type === "application/vnd.ms-excel";
const isTypeComputer =
@ -402,7 +351,7 @@ export default {
}
return fileType && isLt1M;
},
async uploadHttpRequest(file) {
async uploadHttpRequest (file) {
this.importLoading = true;
this.importBtnTitle = "正在上传中...";
this.$message({
@ -457,29 +406,29 @@ export default {
this.$refs.upload.clearFiles();
},
handleSizeChange(val) {
handleSizeChange (val) {
console.log(`每页 ${val}`);
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange(val) {
handleCurrentChange (val) {
console.log(`当前页: ${val}`);
this.pageNo = val;
this.getTableData();
},
handleSearch(val) {
handleSearch (val) {
console.log(this.fmData);
this.pageNo = 1;
this.getTableData();
},
resetForm(formName) {
resetForm (formName) {
this.$refs[formName].resetFields();
this.handleSearch();
},
async handleChu() {
async handleChu () {
const url = "/gov/project/project/project-list-export";
const { pageSize, pageNo, fmData } = this;
axios({
@ -514,8 +463,8 @@ export default {
});
},
async handleAdd() {},
async handleWatch(rowIndex) {
async handleAdd () { },
async handleWatch (rowIndex) {
let item = this.tableData[rowIndex];
this.currentProject = {
projectId: item.projectId,
@ -523,7 +472,7 @@ export default {
this.pageType = "info";
},
async handleEdit(rowIndex) {
async handleEdit (rowIndex) {
let item = this.tableData[rowIndex];
this.currentProject = {
projectId: item.projectId,
@ -531,19 +480,19 @@ export default {
this.pageType = "edit";
},
handleClose() {
handleClose () {
this.pageType = "list";
this.currentProject = {
projectId: "",
};
},
handleEditSuccess() {
handleEditSuccess () {
this.handleClose();
this.getTableData();
},
async handleDel(rowData, rowIndex) {
async handleDel (rowData, rowIndex) {
console.log(rowData, rowIndex);
const url =
"/heart/iccommunityselforganization/delcommunityselforganization";
@ -561,7 +510,7 @@ export default {
}
},
async getTableData() {
async getTableData () {
// const url = "http://yapi.elinkservice.cn/mock/245/gov/project/project/project-list";
const url = "/gov/project/project/project-list";
const { pageSize, pageNo, fmData } = this;
@ -575,9 +524,28 @@ export default {
this.total = data.total || 0;
this.tableData = data.list
? data.list.map((item) => {
return item;
})
return item;
})
: [];
this.tableData.forEach(item => {
if (item.origin === 'issue') {
item.originName = '议题 '
} else if (item.origin === 'agency') {
item.originName = '项目立项'
} else if (item.origin === 'resi_event') {
item.originName = '旧版事件上报'
} else if (item.origin === 'work_event') {
item.originName = '巡查上报'
} else if (item.origin === 'ic_event') {
item.originName = '事件'
} else {
item.sourceTypeName = '--'
}
});
} else {
}
},

6
src/views/modules/shujuduibi/canji.vue

@ -19,7 +19,11 @@
</template>
<template v-slot:listBtnSup="{ item }">
<el-button type="text" @click="handleSync(item)" size="small"
<el-button
type="text"
v-if="item.dealStatus != 1"
@click="handleSync(item)"
size="small"
>全部更新</el-button
>
</template>

6
src/views/modules/shujuduibi/siwang.vue

@ -19,7 +19,11 @@
</template>
<template v-slot:listBtnSup="{ item }">
<el-button type="text" @click="handleSync(item)" size="small"
<el-button
type="text"
v-if="item.dealStatus != 1"
@click="handleSync(item)"
size="small"
>全部更新</el-button
>
</template>

3
src/views/modules/workPc/guidance/addForm.vue

@ -106,7 +106,8 @@
<el-form-item class="block"
label="附件"
prop="attach">
<el-upload class="upload-demo"
<el-upload :headers="$getElUploadHeaders()"
class="upload-demo"
:action="uploadUlr"
:data="{customerId:customerId}"
accept=".doc,.pdf,.xls,.docx,.xlsx"

Loading…
Cancel
Save