Browse Source

项目分类统计

preview
jiangyy 4 years ago
parent
commit
3b8403a74c
  1. 182
      epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/classifyList copy 2.vue
  2. 11
      epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/classifyList.vue
  3. 219
      epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/projectList copy 2.vue
  4. 36
      epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/projectList.vue
  5. 454
      epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/searchBar.vue

182
epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/classifyList copy 2.vue

@ -0,0 +1,182 @@
<template>
<div>
<div v-if="flag==='classify'">
<el-table :data="tableData"
ref="ref_table"
style="width: 100%;margin-bottom: 20px;"
row-key="categoryCode"
border
:default-expand-all="false"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column prop="categoryName"
label="所属类别"
min-width="280px"
header-align="center">
</el-table-column>
<el-table-column prop="projectTotal"
label="项目总数"
header-align="center"
align="center"
min-width="180px">
<template slot-scope="scope">
<el-button type="text"
style="color:#1C6AFD;"
size="small"
@click="handleToProjectList(scope.row,'all')">{{scope.row.projectTotal}}</el-button>
</template>
</el-table-column>
<el-table-column prop="totalRatio"
header-align="center"
align="center"
min-width="180px"
label="项目总数占比">
</el-table-column>
<el-table-column prop="closedProjectTotal"
header-align="center"
align="center"
min-width="180px"
label="结案项目数">
<template slot-scope="scope">
<el-button type="text"
style="color:#1C6AFD;"
size="small"
@click="handleToProjectList(scope.row,'closed')">{{scope.row.closedProjectTotal}}</el-button>
</template>
</el-table-column>
<el-table-column prop="closedRatio"
header-align="center"
align="center"
min-width="180px"
label="项目结案率">
</el-table-column>
</el-table>
</div>
<project-list ref="ref_projectList"
v-if="flag==='project'"
@back="backToClassify"></project-list>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
import ProjectList from "./projectList"
let loading //
export default {
data () {
return {
flag: "classify",//
tableData: [],
tableParams: {
orgId: '', //ID
orgType: '', // agencygrid
startTime: '', //yyyymmdd ,
endTime: '', //yyyymmdd,
},
}
},
mounted () {
},
methods: {
async loadTable (tableParams) {
this.startLoading()
this.tableParams = JSON.parse(JSON.stringify(tableParams))
const url = '/data/report/screen/project/selectprojectcategory'
const { data, code, msg } = await requestPost(url, tableParams)
this.endLoading()
if (code === 0) {
this.tableData = data
} else {
this.$message.error(msg)
}
},
//
handleToProjectList (row, type) {
this.flag = "project"
this.$emit("changeSource", 'project')
this.$nextTick(() => {
this.$refs.ref_projectList.initData(row, type, this.tableParams)
})
},
//
backToClassify () {
this.flag = "classify"
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
tableHeight () {
return this.clientHeight - 60 - 80 - 80 - 100
},
...mapGetters(['clientHeight', 'env'])
},
components: {
ProjectList
},
activated () {
this.$nextTick(() => {
this.$refs.ref_table.doLayout() //
})
},
}
</script>
<style lang="css" scoped>
.myNote {
display: -webkit-box;
text-overflow: ellipsis;
overflow: hidden;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
/* .register .el-table .el-table__header-wrapper {
position: absolute;
top: 0;
left: 0;
}*/
/*
.register .el-table .el-table__fixed-body-wrapper {
height: calc(100% - 44px);
margin-top: 44px;
overflow-y: auto !important;
} */
</style>

11
epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/classifyList.vue

@ -18,8 +18,7 @@
:key="iscascaderShow"
:options="casOptions"
:props="optionProps"
@change="handleChange"
clearable></el-cascader>
@change="handleChange"></el-cascader>
</el-form-item>
<div>
@ -170,11 +169,12 @@ export default {
endTime: '', //yyyymmdd,
},
timeArray: ['', ''],
endTimeModel: new Date() - 60 * 60 * 24 * 2,
//
startTimeShow: '',//
endTimeShow: '', //
endTimeModel: new Date() - 60 * 60 * 24 * 2,
}
},
@ -253,7 +253,10 @@ export default {
handleToProjectList (row, type) {
this.flag = "project"
this.$nextTick(() => {
this.$refs.ref_projectList.initData(this.agencyIdArray, row, type, this.casOptions, this.selAgencyObj)
this.$refs.ref_projectList.loadDate(this.tableParams, this.staticType, this.timeArray, this.endTimeModel, this.startTimeShow, this.endTimeShow)
//
this.$refs.ref_projectList.initTable(this.agencyIdArray, row, type, this.casOptions)
})
},

219
epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/projectList copy 2.vue

@ -0,0 +1,219 @@
<template>
<div>
<el-table :data="tableData"
border
style="width: 100%">
<el-table-column prop="category"
label="类别"
min-width="280">
</el-table-column>
<el-table-column prop="projectTitle"
label="项目标题"
min-width="200">
</el-table-column>
<el-table-column prop="gridName"
label="所属网格"
min-width="200">
</el-table-column>
<el-table-column prop="projectStatus"
label="状态">
<template slot-scope="scope">
<span v-if="scope.row.projectStatus==='pending'"
style="color:#feb349;"
size="small">处理中</span>
<span v-if="scope.row.projectStatus==='closed'"
style="color:#00A7A9;"
size="small">已结案</span>
</template>
</el-table-column>
<el-table-column prop="createTime"
label="创建时间"
min-width="140">
</el-table-column>
<el-table-column label="操作"
fixed="right"
width="140"
header-align="center"
align="center"
class="operate">
<template slot-scope="scope">
<el-button type="text"
style="color:#D51010;"
size="small"
@click="handleDetail(scope.row)">查看详情</el-button>
</template>
</el-table-column>
</el-table>
<div>
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="tableParams.pageNo"
:page-sizes="[20, 30, 50]"
:page-size="tableParams.pageSize"
layout="sizes, prev, pager, next"
:total="total">
</el-pagination>
</div>
<!-- 修改弹出框 -->
<el-dialog :visible.sync="diaShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'项目详情'"
top="5vh"
width="50%"
@closed="diaClose">
<project-Detail ref="ref_projectDetail">
</project-Detail>
</el-dialog>
</div>
</template>
<script>
import util from '@js/util.js';
import ProjectDetail from "./projectDetail"
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
let loading //
export default {
data () {
return {
tableData: [],
tableParams: {
status: '', //closedall
categoryCode: '', //code
orgId: '', //ID
pageSize: 20,
pageNo: 1,
startTime: '', //yyyymmdd ,
endTime: '', //yyyymmdd,
},
total: 0,
//
diaShow: false,
}
},
mounted () {
},
methods: {
async initData (row, type, params) {
this.startLoading()
Object.assign(this.tableParams, params)
this.tableParams.status = type
this.tableParams.categoryCode = row.categoryCode
await this.loadTable()//
this.endLoading()
},
async loadTable (params) {
const url = '/data/report/screen/project/selectcategoryprojectlist'
Object.assign(this.tableParams, params)
const { data, code, msg } = await requestPost(url, this.tableParams)
if (code === 0) {
this.total = data.total
this.tableData = data.list
} else {
this.$message.error(msg)
}
},
//
handleDetail (row) {
this.diaShow = true
this.$nextTick(() => {
this.$refs.ref_projectDetail.initData(row.projectId)
})
},
//
diaClose () {
this.$refs.ref_projectDetail.setShowDetail()
this.diaShow = false
},
handleSizeChange (val) {
this.tableParams.pageSize = val
this.tableParams.pageNo = 1
this.loadTable()
},
handleCurrentChange (val) {
this.tableParams.pageNo = val
this.loadTable()
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
tableHeight () {
return this.clientHeight - 60 - 80 - 80 - 100
},
...mapGetters(['clientHeight', 'env'])
},
components: {
ProjectDetail
},
activated () {
this.$nextTick(() => {
this.$refs.ref_table.doLayout() //
})
},
}
</script>
<style lang="css" scoped>
.myNote {
display: -webkit-box;
text-overflow: ellipsis;
overflow: hidden;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
/* .register .el-table .el-table__header-wrapper {
position: absolute;
top: 0;
left: 0;
}*/
/*
.register .el-table .el-table__fixed-body-wrapper {
height: calc(100% - 44px);
margin-top: 44px;
overflow-y: auto !important;
} */
</style>

36
epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/projectList.vue

@ -24,8 +24,7 @@
:key="iscascaderShow"
:options="casOptions"
:props="optionProps"
@change="handleChange"
clearable></el-cascader>
@change="handleChange"></el-cascader>
</el-form-item>
<div>
@ -166,7 +165,7 @@ export default {
labelWidth: '70px',
casOptions: [],
agencyIdArray: [],
selAgencyObj: {},
iscascaderShow: 0,
optionProps: {
@ -214,21 +213,35 @@ export default {
},
methods: {
async initData (agencyIdArray, row, type, casOptions, selAgencyObj) {
this.startLoading()
//
loadDate (tableParams, staticType, timeArray, endTimeModel, startTimeShow, endTimeShow) {
//
this.initDate()
let params = JSON.parse(JSON.stringify(tableParams))
Object.assign(this.tableParams, params)
this.timeArray = JSON.parse(JSON.stringify(timeArray))
this.endTimeModel = JSON.parse(JSON.stringify(endTimeModel))
this.startTimeShow = startTimeShow
this.endTimeShow = endTimeShow
this.staticType = staticType
},
async initTable (agencyIdArray, row, type, casOptions) {
this.startLoading()
//
this.initAgencyList(casOptions)
this.tableParams.status = type
this.tableParams.categoryCode = row.categoryCode
this.categoryName = row.categoryName
this.parentCategoryName = row.parentCategoryName
this.agencyIdArray = agencyIdArray
this.selAgencyObj = selAgencyObj
this.tableParams.orgId = this.selAgencyObj.agencyId
await this.loadTable()//
@ -239,7 +252,6 @@ export default {
++this.iscascaderShow
this.casOptions = []
this.agencyIdArray = []
this.tableParams.orgId = ''
if (casOptions) {
this.casOptions = casOptions
}
@ -281,11 +293,11 @@ export default {
handleChange (value) {
if (value && value.length > 0) {
this.selAgencyObj = this.$refs["myCascader"].getCheckedNodes()[0].data
this.tableParams.orgId = this.selAgencyObj.agencyId
this.agencyName = this.selAgencyObj.agencyName
let agencyObj = this.$refs["myCascader"].getCheckedNodes()[0].data
this.tableParams.orgId = agencyObj.agencyId
this.agencyName = agencyObj.agencyName
} else {
this.selAgencyObj = {}
this.tableParams.orgId = ''
this.agencyName = ''
}

454
epmet-oper-web/src/views/modules/workPc/projectClassifyStatic/searchBar.vue

@ -0,0 +1,454 @@
<template>
<div>
<el-card shadow="never"
class="aui-card--fill">
<div class="mod-demo__demo}">
<el-form :inline="true"
:model="tableParams"
@keyup.enter.native="loadTable()">
<div>
<el-form-item v-if="source==='project'"
style="margin-left:10px">
<el-button @click="handleBack()"
size="mini"
icon="el-icon-back"
type="warning"
plain>返回</el-button>
</el-form-item>
<el-form-item label="所属组织"
:label-width="labelWidth">
<el-cascader ref="myCascader"
v-model="agencyIdArray"
style="width:480px"
:key="iscascaderShow"
:options="casOptions"
:props="optionProps"
@change="handleChange"></el-cascader>
</el-form-item>
<div>
<el-form-item label="统计类型"
:label-width="labelWidth">
<el-radio v-model="staticType"
label="end">截止累计值</el-radio>
<el-radio v-model="staticType"
label="Interval">区间新增值</el-radio>
<el-date-picker style="margin-left:30px"
v-if="staticType==='Interval'"
v-model="timeArray"
type="daterange"
range-separator="至"
@change="handleTimeChange"
format="yyyy-MM-dd"
:picker-options="pickerOptions"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
<el-date-picker style="margin-left:30px"
v-if="staticType==='end'"
v-model="endTimeModel"
@change="handleEndTimeChange"
:picker-options="pickerOptions"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
<el-form-item style="margin-left:10px">
<el-button @click="loadTable()"
type="primary">查询</el-button>
</el-form-item>
<el-form-item style="margin-left:10px">
<el-button @click="handelExport()"
type="primary">导出</el-button>
</el-form-item>
</div>
</div>
</el-form>
<classify-list v-if="source==='classify'"
ref="ref_classify"
@changeSource="changeSource"></classify-list>
<project-list v-if="source==='project'"
ref="ref_project"></project-list>
</div>
</el-card>
</div>
</template>
<script>
import util from '@js/util.js';
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
import ClassifyList from "./classifyList"
import ProjectList from "./projectList"
let loading //
export default {
data () {
return {
source: "classify",// classify project
downloadLoading: false,
//
labelWidth: '70px',
casOptions: [],
agencyIdArray: [],
selAgencyObj: {},
iscascaderShow: 0,
optionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
children: 'subAgencyList',
checkStrictly: true
},
pickerOptions: { //
disabledDate (time) {
return time.getTime() > (Date.now() - (24 * 60 * 60 * 1000))
}
},
staticType: 'end',
tableParams: {
orgId: '', //ID
orgType: '', // agencygrid
startTime: '', //yyyymmdd ,
endTime: '', //yyyymmdd,
},
timeArray: ['', ''],
endTimeModel: new Date() - 60 * 60 * 24 * 2,
//
startTimeShow: '',//
endTimeShow: '', //
oldParams: {}//
}
},
props: {
},
mounted () {
this.customerId = localStorage.getItem('customerId')
this.initData()
},
methods: {
async initData () {
this.startLoading()
this.initDate()
await this.getAgencylist()//
this.loadTable()
this.endLoading()
},
async getAgencylist () {
const url = '/gov/org/customeragency/agencygridtree'
// const url = 'http://yapi.elinkservice.cn/mock/102/gov/org/agency/agencylist'
const params = {
// customerId: this.customerId
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
++this.iscascaderShow
this.casOptions = []
this.agencyIdArray = []
this.tableParams.orgId = ''
if (data) {
//
this.selAgencyObj = {
agencyId: data.agencyId,
agencyName: data.agencyName,
level: data.level,
pid: data.pid,
}
this.casOptions.push(data)
this.agencyIdArray.push(data.agencyId)
}
} else {
this.$message.error(msg)
}
},
async loadTable () {
if (this.validate()) {
this.tableParams.orgId = this.selAgencyObj.agencyId
this.tableParams.orgType = this.selAgencyObj.level
if (this.staticType === 'end') {
this.tableParams.startTime = ''
}
console.log(this.tableParams)
if (this.source === 'classify') {
this.$nextTick(() => {
this.$refs.ref_classify.loadTable(this.tableParams)
})
} else {
this.$nextTick(() => {
this.$refs.ref_project.loadTable(this.tableParams)
})
}
}
},
//
changeSource (source) {
this.source = source
if (source === 'project') {//
this.oldParams = {
staticType: this.staticType,
tableParams: this.tableParams,
timeArray: ['', ''],
endTimeModel: new Date() - 60 * 60 * 24 * 2,
//
startTimeShow: '',//
endTimeShow: '', //
}
} else {
}
},
//
handelExport () {
if (!this.validate()) {
return false
}
let title = this.selAgencyObj.agencyName
if (this.staticType === 'Interval') {
title = title + ' ' + this.startTimeShow + '-' + this.endTimeShow + '区间增长值'
} else {
title = title + ' 截止至' + this.endTimeShow + '累计值'
}
console.log(title)
if (this.source === 'classify') {
this.$nextTick(() => {
this.exportClassify()
})
} else {
this.$nextTick(() => {
this.exportProject()
})
}
},
async exportProject () {
const params = {
status: this.tableParams.status,
categoryCode: this.tableParams.categoryCode,
categoryName: this.categoryName,
orgId: this.tableParams.orgId,
startTime: this.tableParams.startTime,
endTime: this.tableParams.endTime,
parentCategoryName: this.parentCategoryName,
}
const url = "/data/report/screen/project/selectcategoryprojectlist/export"
app.ajax.exportFilePost(
url,
params,
(data, rspMsg) => {
this.download(data, title + '.xls')
},
(rspMsg, data) => {
this.$message.error(rspMsg);
}
);
},
async exportClassify () {
const url = "/data/report/screen/project/selectprojectcategory/export"
app.ajax.exportFilePost(
url,
this.tableParams,
(data, rspMsg) => {
this.download(data, title + '.xls')
},
(rspMsg, data) => {
this.$message.error(rspMsg);
}
);
},
handleBack () {
this.$emit('back')
this.changeSource('classify')
},
handleChange (value) {
if (value && value.length > 0) {
this.selAgencyObj = this.$refs["myCascader"].getCheckedNodes()[0].data
} else {
this.selAgencyObj = {}
}
},
initDate () {
//
const date = new Date()
const month = date.getMonth() + 1 > 9 ? (date.getMonth() + 1) : '0' + (date.getMonth() + 1)
const day = date.getDate() - 1 > 9 ? (date.getDate() - 1) : '0' + (date.getDate() - 1)
const yesterday = date.getFullYear() + '-' + month + '-' + day
this.timeArray = ['', yesterday]
this.endTimeModel = yesterday
let yesterdayArray = yesterday.split('-')
this.tableParams.endTime = yesterdayArray[0] + yesterdayArray[1] + yesterdayArray[2]
this.endTimeShow = yesterdayArray[0] + '年' + yesterdayArray[1] + '月' + yesterdayArray[2] + '日'
},
handleEndTimeChange (item) {
if (item) {
const endTimeArray = util.dateFormatter(item, 'date').split('-')
this.tableParams.endTime = endTimeArray[0] + endTimeArray[1] + endTimeArray[2]
this.endTime = endTimeArray[0] + '年' + endTimeArray[1] + '月' + endTimeArray[2] + '日'
} else {
this.tableParams.endTime = ''
this.endTimeShow = ''
}
},
handleTimeChange (time) {
if (time) {
const startTimeArray = util.dateFormatter(time[0], 'date').split('-')
const endTimeArray = util.dateFormatter(time[1], 'date').split('-')
this.tableParams.startTime = startTimeArray[0] + startTimeArray[1] + startTimeArray[2]
this.tableParams.endTime = endTimeArray[0] + endTimeArray[1] + endTimeArray[2]
this.startTimeShow = startTimeArray[0] + '年' + startTimeArray[1] + '月' + startTimeArray[2] + '日'
this.endTimeShow = endTimeArray[0] + '年' + endTimeArray[1] + '月' + endTimeArray[2] + '日'
} else {
this.tableParams.startTime = ''
this.tableParams.endTime = ''
this.startTimeShow = ''
this.endTimeShow = ''
}
},
validate () {
if (this.staticType === 'Interval' && (!this.tableParams.endTime || !this.tableParams.startTime)) {
this.$message.info("请选择起止日期")
return false
}
if (this.staticType === 'end' && !this.tableParams.endTime) {
this.$message.info("请选择结束日期")
return false
}
return true
},
//
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);
}
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
...mapGetters(['clientHeight', 'env'])
},
components: {
ClassifyList, ProjectList
},
activated () {
},
}
</script>
<style lang="css" scoped>
.myNote {
display: -webkit-box;
text-overflow: ellipsis;
overflow: hidden;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
/* .register .el-table .el-table__header-wrapper {
position: absolute;
top: 0;
left: 0;
}*/
/*
.register .el-table .el-table__fixed-body-wrapper {
height: calc(100% - 44px);
margin-top: 44px;
overflow-y: auto !important;
} */
</style>
Loading…
Cancel
Save