first commit

This commit is contained in:
2026-09-09 09:14:28 +08:00
commit 5343198112
5199 changed files with 1052895 additions and 0 deletions
@@ -0,0 +1,187 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<el-row type="flex">
<el-col>
<span>教代会:</span>
<el-select @change="meetingChange" filterable placeholder="请选择教代会"
style="width: 80%;margin-right: 20px" v-model="pageForm.meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-col>
<el-col>
<span>承办单位:</span>
<el-select @change="pageData()" clearable
filterable
placeholder="请选择承办单位" style="width: 80%" v-model="pageForm.undertakeId">
<el-option
:label="item.unitName"
:value="item.id"
v-for="item in undertakeOptions">
</el-option>
</el-select>
</el-col>
</el-row>
</el-card>
<el-table :data="tableData" class="mt20" show-summary>
<el-table-column align="center" header-align="center" label="序号" type="index"></el-table-column>
<el-table-column align="center" header-align="center" label="单位名称" prop="unitName">
<template scope="{row}">
<el-link @click="selectProposalByUnit(row)" type="primary">{{ row.unitName }}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="提案总数" prop="totalCount" sortable></el-table-column>
<el-table-column align="center" header-align="center" label="主办提案">
<el-table-column align="center" header-align="center" label="提案数量"
prop="masterTotalCount"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="已答复"
prop="masterHasReplyCount" sortable></el-table-column>
<el-table-column align="center" header-align="center" label="未答复"
prop="masterNotReplyCount" sortable></el-table-column>
<el-table-column align="center" header-align="center" label="已结案"
prop="masterFinishCount" sortable></el-table-column>
</el-table-column>
<el-table-column align="center" header-align="center" label="协办提案" v-if="showSlaveTableColumn">
<el-table-column align="center" header-align="center" label="提案数量"
prop="slaveTotalCount"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="已答复"
prop="slaveHasReplyCount" sortable></el-table-column>
<el-table-column align="center" header-align="center" label="未答复"
prop="slaveNotReplyCount" sortable></el-table-column>
<el-table-column align="center" header-align="center" label="已结案"
prop="slaveFinishCount" sortable></el-table-column>
</el-table-column>
</el-table>
<el-dialog :title="dialogTitle" :visible.sync="undertakeVisible" width="70%">
<el-table :data="undertakeTableData" :size="tableSize" align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{ row.proposalName }}</el-link>
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
dialogTitle: '',
undertakeVisible: false,
undertakeOptions: [],
meetingOptions: [],
undertakeTableData: [],
pageForm: {},
tableColumns: [
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}],
showSlaveTableColumn: false
}
},
components: {
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
async meetingChange() {
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
await this.pageData()
},
async selectProposalByUnit(row) {
const resp = await $.get(loc() + '/selectProposalByUnit', {
meetingId: this.pageForm.meetingId,
underTakeId: row.id
})
this.dialogTitle = row.unitName + '所承办提案'
this.undertakeVisible = true
if (resp.code === 0) {
this.undertakeTableData = resp.data
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
this.undertakeVisible = false
},
async pageData() {
sublime.showLoadingbar()
this.tableLoading = true
const resp = await $.post(loc() + "/pageData", this.pageForm)
sublime.closeLoadingbar()
this.tableLoading = false
if (resp.code === 0) {
resp.data.forEach(v => {
v.satisfiedRate = isNaN((v.satisfied / v.total) * 100) ? 0 : ((v.satisfied / v.total) * 100).toFixed(1)
})
this.tableData = resp.data
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
},
async initTableSlaveColumns() {
const config = await proposal.getProposalConfig()
this.showSlaveTableColumn = config.slaveUnitConfig && config.slaveUnitConfig.isNeedReply
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
await this.pageData()
this.initTableSlaveColumns()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,388 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.tr {
text-align: right;
}
.tl {
text-align: left;
}
.top_block {
background-color: rgb(240, 240, 240);
}
.top_card {
border: none;
border-top: 5px solid;
cursor: pointer;
min-width: 200px;
margin-right: 10px;
margin-bottom: 10px;
}
.top_title {
color: rgb(120, 120, 120);
white-space: nowrap;
}
.top_num {
font-size: 32px;
margin-top: 10px;
}
.v-tab .el-card__header {
padding: 10px 15px;
font-weight: bold;
}
.v-tab .el-table-containe {
padding-top: 0 !important;
}
.chart-card .el-card__header {
border: none;
padding: 10px 15px;
}
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<el-select @change="getNumData();changeType('all');drawChat()" placeholder="请选择教代会"
style="width: 100%;font-weight:bold;" v-model="pageForm.meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in allJdhOptions">
</el-option>
</el-select>
</el-card>
<div class="top_block mt10 mb10" v-loading="topBlockLoading">
<el-row :gutter="20" style="flex-wrap: wrap" type="flex">
<template v-for="item in types">
<el-col :span="4">
<el-card :style="'border-color:'+ item.color" class="top_card" shadow="hover">
<div @click="changeType(item.key)" style="width: 100%;height: 100%">
<div class="top_title">
<span :style="'color:'+ item.color">
<i :class="pageForm.type===item.key?'fa fa-flag':'fa fa-flag-o'"></i>
</span>
{{item.name}}
<el-popover trigger="hover">
<ul style="list-style-type: none;padding: 0;margin: 0">
<li :style="{color:pageForm.type===litem.key?'red':''}"
@click="childClick(item,litem)"
style="border-bottom: 1px solid #f0f0f0;cursor: pointer;padding: 5px 0"
v-for="(litem,lindex) in item.list">
{{litem.name}}
</li>
</ul>
<i class="el-icon-s-operation text-primary"
slot="reference"
v-if="item.list"
></i>
</el-popover>
</div>
<div class="top_num">{{numData[item.key]?numData[item.key]:'--'}}</div>
</div>
</el-card>
</el-col>
</template>
</el-row>
</div>
<el-card shadow="never">
<table-tool :app="this" label="提案列表">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center" header-align="center"
ref="multipleTable">
<el-table-column type="expand">
<template scope="scope">
<el-card shadow="never">
<el-table :data="scope.row.replyInfo" header-align="center" size="mini">
<el-table-column label="承办单位" prop="unitName" width="200"></el-table-column>
<el-table-column label="承办类型" prop="unitName" width="100">
<template scope="{row}">
<span style="color: #106898" v-if="row.underTakeType===1">主办</span>
<span style="color: #156c20" v-else>协办</span>
</template>
</el-table-column>
<el-table-column label="答复次数" prop="replyNumber" width="100"></el-table-column>
<el-table-column label="负责人" prop="fzrxx" show-overflow-tooltip></el-table-column>
<el-table-column label="答复情况" prop="isReply" width="100">
<template scope="{row}">
<span class="text-success" v-if="row.isReply">已答复</span>
<span class="text-danger" v-else>未答复</span>
</template>
</el-table-column>
<el-table-column label="分管领导" prop="xldxx"></el-table-column>
<el-table-column label="审批情况" prop="isLeaderAudit" width="100px">
<template scope="{row}">
<span class="text-success" v-if="row.isLeaderAudit">已审批</span>
<span class="text-danger" v-else>未审批</span>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:align="column.align?column.align:'center'"
:label="column.label"
:min-width="column.width"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{row.proposalName}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
<span :style="row.isConjoin === 1 ? 'color: #236eb4' : ''">{{[proposal.CASE].includes(row.stateCode) ? '暂无' : row.isConjoin === 1 ? '是' : '否'}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='auditState'">
<span v-if="![proposal.CASE].includes(row.stateCode)">已审核</span>
<span v-else>待审核</span>
</template>
<template scope="{row}" v-else-if="column.prop=='resultName'">
<el-link type="primary">
{{row.resultName ? row.resultName:'暂未审核'}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='laLevelName'">
<span>
{{[proposal.CASE].includes(row.stateCode) ? '暂无' : !row.determineTypeCode ? '否' : row.determineTypeCode === 'emphasis' ? '重点' : '普通'}}
</span>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<!-- <el-row class="chart-card" v-loading="chatLoading">-->
<!-- <el-card shadow="never">-->
<!-- <div slot="header" class="clearfix">-->
<!-- <span style="font-weight: bold">提案类型统计</span><br>-->
<!-- <span style="font-size: 12px">单位(个)</span>-->
<!-- </div>-->
<!-- <div id="chart" style="width: 100%;height: 400px;"></div>-->
<!-- </el-card>-->
<!-- </el-row>-->
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
let chart
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
types: [{
key: 'all',
name: '提案总数',
color: '#409EFF'
}, {
key: 'delegation',
name: '待团长审核(附议完成)',
color: '#00a2ae'
}, {
key: 'case',
name: '待立案审核',
color: '#F56C6C'
}, {
key: 'determine',
name: '确定立案',
color: '#67C23A'
}, {
key: 'opinion',
name: '作为意见',
color: '#E6A23C'
}, {
key: 'notGive',
name: '不予立案',
color: '#7265e6'
}, {
key: 'waitUnitReply',
name: '待承办单位答复',
color: '#F56C6C',
list: [
{
key: 'waitUnitReply',
name: '待承办单位答复',
color: '#F56C6C',
},
{
key: 'unitReplyFinish',
name: '承办单位已答复',
color: '#00a854',
}
]
}, {
key: 'awaitLeaderAuditReply',
name: '待校领导审批答复',
color: '#F56C6C',
list: [
{
key: 'awaitLeaderAuditReply',
name: '待校领导审批答复',
color: '#F56C6C',
},
{
key: 'LeaderAuditReplyFinish',
name: '校领导已审批答复',
color: '#00a854',
}
]
}, {
key: 'feedback',
name: '待反馈评分',
color: '#ffbf00'
}, {
key: 'caseCheck',
name: '待提案委员会审查',
color: '#ffbf00'
}, {
key: 'finish',
name: '已完结',
color: '#00a854'
}, {
key: 'other',
name: '其它',
color: '#00a854'
}],
chatLoading: true,
topBlockLoading: true,
tabLoading: false,
allJdhOptions: [],
tableData: [],
numData: {},
pageForm: {
pageSize: 5,
type: 'all',
totalCount: 0
},
tableColumns: [
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提案方式', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true, checked: 0},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true, checked: 0},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'isConjoin', label: '是否并案', sortable: true},
{prop: 'laLevelName', label: '是否重点', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
// {prop: 'auditState', label: '审核状态', sortable: true},
],
replyPopVisible: false
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
methods: {
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
changeType(type) {
this.pageForm.type = type
this.doSearch()
},
childClick(item, litem) {
item.name = litem.name
item.key = litem.key
item.color = litem.color
this.pageForm.type = item.key
this.doSearch()
},
async getNumData() {
this.topBlockLoading = true
const resp = await $.post(loc() + "/numData", {meetingId: this.pageForm.meetingId})
requestLaterFun(resp, () => {
this.numData = resp.data
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.topBlockLoading = false
})
},
async drawChat() {
this.chatLoading = true
const resp = await $.post(loc() + "/getChatData", {meetingId: this.pageForm.meetingId})
requestLaterFun(resp, () => {
const {data} = resp
if (!chart) {
chart = new G2Plot.Area('chart', {
data,
forceFit: true,
xField: 'typeName',
yField: 'num',
seriesField: 'type',
legend: {
"position": "top-right",
"flipPage": false
}
});
chart.render();
} else {
chart.changeData(data)
}
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.chatLoading = false
})
},
},
async created() {
this.allJdhOptions = await getAllJdh()
this.pageForm.meetingId = this.allJdhOptions.length ? this.allJdhOptions[0].id : ''
await this.getNumData()
this.pageData()
// await this.drawChat()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,304 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.clearfix {
font-weight: 600;
padding: 5px;
}
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<el-select @change="initData" placeholder="请选择教代会" v-model="meetingId">
<el-option
:key="item.id"
:label="item.jdhallname"
:value="item.id"
v-for="item in allJdhOptions">
</el-option>
</el-select>
</el-card>
<el-row :gutter="20" style="margin: 15px 0">
<el-col :span="12" v-loading="loading.satisfiedLoading">
<el-card class="box-card" shadow="hover">
<div class="clearfix" slot="header">
<span>提案满意度</span>
</div>
<div class="text item">
<div id="satisfiedChart"></div>
</div>
</el-card>
</el-col>
<el-col :span="12" v-loading="loading.typeLoading">
<el-card class="box-card" shadow="hover">
<div class="clearfix" slot="header">
<span>提案类型</span>
</div>
<div class="text item">
<div id="typeChart"></div>
</div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="20" style="margin: 15px 0">
<el-col :span="12" v-loading="loading.resultLoading">
<el-card class="box-card" shadow="hover">
<div class="clearfix" slot="header">
<span>立案结果</span>
</div>
<div class="text item">
<div id="resultChart"></div>
</div>
</el-card>
</el-col>
<el-col :span="12" v-loading="loading.stateLoading">
<el-card class="box-card" shadow="hover">
<div class="clearfix" slot="header">
<span>提案状态</span>
</div>
<div class="text item">
<div id="stateChart"></div>
</div>
</el-card>
</el-col>
</el-row>
</guava>
</div>
<script>
const chart = {
satisfiedChart: undefined,
resultChart: undefined,
typeChart: undefined,
stateChart: undefined
}
const vue = new Vue({
el: '#app',
data() {
return {
meetingId: '',
allJdhOptions: [],
tableData: [],
chatLoading: true,
topBlockLoading: true,
tabLoading: false,
loading: {
satisfiedLoading: false,
resultLoading: false,
typeLoading: false,
stateLoading: false
}
}
},
methods: {
/**
* 提案满意度
* @returns {Promise<void>}
*/
async satisfiedData() {
this.loading.satisfiedLoading = true
const resp = await $.get(loc() + '/satisfiedData', {meetingId: this.meetingId})
requestLaterFun(resp, (data) => {
this.loading.satisfiedLoading = false
if (chart.satisfiedChart) {
chart.satisfiedChart.changeData(data)
return
}
chart.satisfiedChart = new G2Plot.Pie('satisfiedChart', {
data,
appendPadding: 10,
angleField: 'num',
colorField: 'name',
radius: 0.75,
color: ['#9661BC', '#5B8FF9', '#61DDAA'],
label: {
type: 'spider',
labelHeight: 28,
content: '{name}\n{percentage}',
},
interactions: [{type: 'element-selected'}, {type: 'element-active'}],
});
chart.satisfiedChart.render();
})
},
/**
* 立案结果
* @returns {Promise<void>}
*/
async resultData() {
this.loading.resultLoading = true
const resp = await $.get(loc() + '/resultData', {meetingId: this.meetingId})
requestLaterFun(resp, (data) => {
this.loading.resultLoading = false
if (chart.resultChart) {
chart.resultChart.changeData(data)
return
}
chart.resultChart = new G2Plot.Radar('resultChart', {
data,
xField: 'name',
yField: 'num',
seriesField: 'type',
meta: {
num: {
alias: '数量',
min: 0
},
},
xAxis: {
line: null,
tickLine: null,
grid: {
line: {
style: {
lineDash: null,
},
},
},
},
yAxis: {
line: null,
tickLine: null,
grid: {
line: {
type: 'line',
style: {
lineDash: null,
},
},
},
},
area: {},
point: {
size: 2,
},
});
chart.resultChart.render();
})
},
/**
* 提案类型
* @returns {Promise<void>}
*/
async typeData() {
this.loading.typeLoading = true
const resp = await $.get(loc() + '/typeData', {meetingId: this.meetingId})
requestLaterFun(resp, (data) => {
this.loading.typeLoading = false
if (chart.typeChart) {
chart.typeChart.changeData(data)
return
}
chart.typeChart = new G2Plot.Column('typeChart', {
data,
xField: 'typeName',
yField: 'num',
meta: {
type: {
alias: '类别',
},
sales: {
alias: '数量',
},
},
xAxis: {
label: {
autoRotate: true,
autoHide: false,
autoEllipsis: false,
},
}
});
chart.typeChart.render();
})
},
/**
* 提案状态
* @returns {Promise<void>}
*/
async stateData() {
this.loading.stateLoading = true
const resp = await $.get(loc() + '/stateData', {meetingId: this.meetingId})
requestLaterFun(resp, (data) => {
this.loading.stateLoading = false
if (chart.stateChart) {
chart.stateChart.changeData(data)
return
}
chart.stateChart = new G2Plot.Radar('stateChart', {
data,
xField: 'stateName',
yField: 'num',
xAxis: {
line: null,
tickLine: null,
grid: {
line: {
style: {
lineDash: null,
},
},
},
},
yAxis: {
line: null,
tickLine: null,
grid: {
line: {
type: 'line',
style: {
lineDash: null,
},
},
},
},
point: {
size: 2,
},
});
chart.stateChart.render();
})
},
async initData() {
await this.satisfiedData()
await this.resultData()
await this.typeData()
await this.stateData()
}
},
async created() {
this.allJdhOptions = await getAllJdh()
this.meetingId = this.allJdhOptions.length ? this.allJdhOptions[0].id : ''
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,134 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.chart-card .el-card__header {
border: none;
/*padding: 20px;*/
}
</style>
<div id="app" v-cloak>
<guava>
<el-row class="chart-card" v-loading="chartOneLoading">
<el-card class="box-card" shadow="never">
<div class="clearfix" slot="header">
<div style="float:left">
<span style="font-weight: bold">提案综合统计</span><br>
<span style="font-size: 12px">单位(个)</span>
</div>
<div style="float: right;z-index: 999">
<span style="margin-right: 50px" v-if="searchForm.switchType === 'delegation'">
<el-select @change="getData" filterable placeholder="请选择教代会" style="width: 400px"
v-model="searchForm.meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</span>
<span style="margin-right: 50px">
<el-radio-group @change="getData" v-model="searchForm.switchType">
<el-radio-button label="type">提案类型</el-radio-button>
<el-radio-button label="union">工会</el-radio-button>
<el-radio-button label="unit">单位</el-radio-button>
<el-radio-button label="delegation">代表团</el-radio-button>
</el-radio-group>
</span>
<span>
<el-date-picker
:clearable="false"
@change="getData()"
class="year"
placeholder="选择年" style="width: 120px;"
type="year"
v-model="searchForm.startYear"
value-format="yyyy">
</el-date-picker>
<el-date-picker
:clearable="false"
@change="getData()"
class="year"
placeholder="选择年" style="width: 120px;"
type="year"
v-model="searchForm.endYear"
value-format="yyyy">
</el-date-picker>
</span>
</div>
</div>
<div id="chart" style="width: 100%;height: 600px"></div>
</el-card>
</el-row>
</guava>
</div>
<script>
let chart
const vue = new Vue({
el: '#app',
data: () => {
return {
meetingOptions: [],
chartOneLoading: false,
searchForm: {
switchType: 'type',
startYear: new Date().getFullYear() - 3 + '',
endYear: new Date().getFullYear() + '',
}
}
},
methods: {
async getData() {
this.chartOneLoading = true
const resp = await $.post(loc() + "/getData", this.searchForm)
requestLaterFun(resp, (data) => {
if (!chart) {
chart = new G2Plot.Area('chart', {
data,
xField: "name",
yField: "num",
seriesField: "type",
forceFit: true,
legend: {
"position": "top-right",
"flipPage": false
},
xAxis: {
label: {
autoRotate: true,
autoHide: false,
autoEllipsis: false,
},
}
});
chart.render();
} else {
chart.changeData(data)
}
this.chartOneLoading = false
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
});
},
async getMeetingByYear() {
const {startYear, endYear} = this.searchForm
const {data} = await $.post(loc() + "/getMeetingByYear", {startYear, endYear})
return data
}
},
async created() {
this.meetingOptions = await this.getMeetingByYear()
this.$set(this.searchForm, "meetingId", this.meetingOptions.length ? this.meetingOptions[0].id : '')
this.getData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,171 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<el-row justify="center" type="flex">
<el-select @change="corpsPageData()" filterable placeholder="请选择教代会"
style="width: 100%" v-model="meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-row>
</el-card>
<el-table :data="corpsTableData" :summary-method="getSummaries" class="mt20" show-summary>
<el-table-column align="center" header-align="center" label="序号" type="index"></el-table-column>
<el-table-column align="center" header-align="center" label="代表团名称" prop="dbtname">
<template scope="{row}">
<el-link @click="findProposal(row)" type="primary">{{ row.dbtname }}</el-link>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="提案总数" prop="total"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="立案数" prop="determine"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="作为意见" prop="opinion"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="不予立案" prop="notGive"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="立案率" prop="caseRate" sortable>
<template scope="{row}">{{row.caseRate}}%</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="不予立案率" prop="withdrawRate" sortable>
<template scope="{row}">{{row.withdrawRate}}%</template>
</el-table-column>
</el-table>
<el-dialog :title="dialogTitle" :visible.sync="delegationVisible" width="70%">
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @view="openView">
</proposal-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-dialog>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
meetingId: '',
dialogTitle: '',
delegationVisible: false,
meetingOptions: [],
corpsTableData: [],
pageForm: {}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
findProposal(row) {
this.pageForm.delegationId = row.id
this.pageData()
this.dialogTitle = row.dbtname + '所属提案'
this.delegationVisible = true
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
this.delegationVisible = false
},
getSummaries(param) {
const {columns, data} = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = this.corpsTableData.length + 1;
return;
} else if (index === 1) {
sums[index] = '合计';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
if (index === 6) {
let a = ((sums[3] + sums[4]) / sums[2]) * 100
sums[index] = isNaN(a) ? 0 + ' %' : (a).toFixed(1) + ' %';
}
if (index === 7) {
let b = (sums[5] / sums[2]) * 100
sums[index] = isNaN(b) ? 0 + ' %' : (b).toFixed(1) + ' %';
}
} else {
sums[index] += 'NaN';
}
});
return sums;
},
async corpsPageData() {
sublime.showLoadingbar();
this.tableLoading = true
const resp = await $.post(loc() + "/corpsPageData", {meetingId: this.meetingId})
const {data, msg} = resp
requestLaterFun(resp, () => {
data.forEach(v => {
v.caseRate = ((v.determine + v.opinion) / v.total) * 100
v.withdrawRate = (v.notGive / v.total) * 100
v.caseRate = isNaN(v.caseRate) ? 0 : v.caseRate.toFixed(1)
v.withdrawRate = isNaN(v.withdrawRate) ? 0 : v.withdrawRate.toFixed(1)
})
this.corpsTableData = data;
}, () => {
this.$notify.error({title: '失败', message: msg});
}, () => {
sublime.closeLoadingbar();
this.tableLoading = false
})
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
await this.corpsPageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,186 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-select @change="getData()" filterable placeholder="请选择教代会"
style="width: 100%" v-model="meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="6" class="text-center">
<el-radio-group v-model="analysisType">
<el-radio-button :label="1">按征集分析</el-radio-button>
<el-radio-button :label="2">按办理分析</el-radio-button>
</el-radio-group>
</el-col>
<el-col :span="6" class="text-center">
<el-radio-group @change="displayTypeChange" v-model="displayType">
<el-radio-button :label="1">显示数量</el-radio-button>
<el-radio-button :label="2">显示占比</el-radio-button>
</el-radio-group>
</el-col>
</el-row>
</el-card>
<el-card class="mt20" shadow="never">
<el-table :data="displayType===1?tableData:tableData2" show-summary v-loading="loading">
<el-table-column align="center" header-align="center" label="序号" type="index"
width="50"></el-table-column>
<el-table-column align="center" header-align="center" label="提案类型" prop="typeName">
<template scope="{row}">
<el-link @click="selectProposalByType(row)" type="primary">{{ row.typeName }}</el-link>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="数量" prop="totalCount"></el-table-column>
<el-table-column align="center" header-align="center" label="占比" prop="proportion"></el-table-column>
<el-table-column align="center" header-align="center" label="立案情况" v-if="analysisType==2">
<el-table-column align="center" header-align="center" label="立案" prop="laCount"></el-table-column>
<el-table-column align="center" header-align="center" label="重点提案" prop="zdCount"></el-table-column>
<el-table-column align="center" header-align="center" label="意见建议" prop="jyCount"></el-table-column>
<el-table-column align="center" header-align="center" label="不予立案" prop="caCount"></el-table-column>
</el-table-column>
<el-table-column align="center" header-align="center" label="代表反馈情况" v-if="analysisType===2">
<el-table-column align="center" header-align="center" label="满意" prop="myCount"
v-if="feedBackNames.includes('满意')"></el-table-column>
<el-table-column align="center" header-align="center" label="比较满意" prop="bjmyCount"
v-if="feedBackNames.includes('比较满意')"></el-table-column>
<el-table-column align="center" header-align="center" label="基本满意" prop="jbmyCount"
v-if="feedBackNames.includes('基本满意')"></el-table-column>
<el-table-column align="center" header-align="center" label="不满意" prop="bmyCount"
v-if="feedBackNames.includes('不满意')"></el-table-column>
</el-table-column>
</el-table>
</el-card>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
<el-dialog :title="typeDialogTitle" :visible.sync="typeDialogVisible" width="70%">
<el-table :data="typeTableData" :size="tableSize" align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{ row.proposalName }}</el-link>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
meetingOptions: [],
meetingId: '',
tableData: [],
tableData2: [],
loading: false,
analysisType: 1,
displayType: 1,
feedBackNames: [],
typeDialogVisible: false,
typeDialogTitle: null,
typeTableData: [],
tableColumns: [
{prop: 'oldProposalCode', label: '草案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}],
}
},
methods: {
async getData() {
this.loading = true
const {data} = await $.post(loc() + '/getData', {teacherMeetingId: this.meetingId})
this.tableData = data
const data2 = JSON.parse(JSON.stringify(data))
this.tableData2 = data2.map(v => {
v.zdCount = (isNaN((v.zdCount / v.laCount * 100).toFixed(2)) ? '0.00' : (v.zdCount / v.laCount * 100).toFixed(2)) + "%"
v.jyCount = (v.jyCount / v.totalCount * 100).toFixed(2) + "%"
v.caCount = (v.caCount / v.totalCount * 100).toFixed(2) + "%"
v.laCount = (v.laCount / v.totalCount * 100).toFixed(2) + "%"
return v
})
setTimeout(() => {
this.loading = false
}, 200)
},
displayTypeChange(val) {
},
async getFeedBackNames() {
const data = await getDictOptions("proposal_feedback")
this.feedBackNames = data.map(v => v.name)
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
this.typeDialogVisible = false
},
async selectProposalByType(row) {
const resp = await $.get(loc() + '/selectProposalByType', {
meetingId: this.meetingId,
typeId: row.typeId
})
this.typeDialogTitle = '<' + row.typeName + '>类型提案'
this.typeDialogVisible = true
if (resp.code === 0) {
this.typeTableData = resp.data
}
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : null
if (this.meetingId != null) {
this.getData()
}
this.getFeedBackNames()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,294 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.zb_reply_card {
border-top: 5px solid #106898;
}
.xb_reply_card {
border-top: 5px solid #156c20;
}
.reply_card .el-form-item {
margin-bottom: 0 !important;
}
.reply_card .el-card__body {
padding: 5px !important;
}
.text-overflow {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.el-table .warning-row {
background: oldlace;
}
.el-table .success-row {
background: #f0f9eb;
}
.el-table .hover-row {
background-color: unset !important;
}
.searchCard .el-card__body {
padding: 0 20px !important;
}
.query-row {
height: 70px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @finished="searchFinished"
@search="doSearch"></proposal-search>
<el-card class="mt10 searchCard" shadow="never">
<el-row class="query-row" type="flex">
<el-col class="query-row-title">征集状态:</el-col>
<el-col class="query-row-content">
<el-tag :effect="pageForm.stateCnd.includes(item)?'dark':'plain'"
@click="tagClick(item)"
style="margin: 5px;min-width: 120px;text-align: center;cursor: pointer"
v-for="item in searchCnd">
{{item}}
</el-tag>
</el-col>
</el-row>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="提案信息"></table-tool>
<el-table :data="tableData" :row-class-name="tableRowClassName"
:size="tableSize"
@sort-change="pageOrder"
header-align="center">
<el-table-column type="expand">
<template scope="scope">
<el-card shadow="never">
<el-table :data="scope.row.replyInfo" header-align="center" size="mini">
<el-table-column label="承办单位" prop="unitName" width="200"></el-table-column>
<el-table-column label="承办类型" prop="unitName" width="100">
<template scope="{row}">
<span style="color: #106898" v-if="row.underTakeType===1">主办</span>
<span style="color: #156c20" v-else>协办</span>
</template>
</el-table-column>
<el-table-column label="答复次数" prop="replyNumber" width="100"></el-table-column>
<el-table-column label="负责人" prop="fzrxx" show-overflow-tooltip></el-table-column>
<el-table-column label="答复情况" prop="isReply" width="100">
<template scope="{row}">
<span class="text-success" v-if="row.isReply">已答复</span>
<span class="text-danger" v-else>未答复</span>
</template>
</el-table-column>
<el-table-column label="分管领导" prop="xldxx"></el-table-column>
<el-table-column label="审批情况" prop="isLeaderAudit" width="100px">
<template scope="{row}">
<span class="text-success" v-if="row.isLeaderAudit">已审批</span>
<span class="text-danger" v-else>未审批</span>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- <el-row :gutter="20" justify="start" style="flex-wrap: wrap" type="flex"-->
<!-- v-if="scope.row.replyInfo && scope.row.replyInfo.length>0">-->
<!-- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8"-->
<!-- v-for="reply in scope.row.replyInfo">-->
<!-- <el-card class="mb10 reply_card" shadow="hover"-->
<!-- :class="reply.underTakeType===1?'zb_reply_card':'xb_reply_card'">-->
<!-- <el-form label-width="80px">-->
<!-- <el-form-item label="承办单位">{{reply.unitName}}</el-form-item>-->
<!-- <el-form-item label="承办类型">-->
<!-- <span v-if="reply.underTakeType===1" style="color: #106898">主办</span>-->
<!-- <span v-else style="color: #156c20">协办</span>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="答复次数">-->
<!-- {{reply.replyNumber}}-->
<!-- </el-form-item>-->
<!-- <el-form-item label="负责人">-->
<!-- <el-popover-->
<!-- placement="top-start"-->
<!-- title="标题"-->
<!-- width="200"-->
<!-- trigger="hover">-->
<!-- <div #content v-html="reply.fzrxx && reply.fzrxx.split(',').join('</br>')"></div>-->
<!-- <div slot="reference" class="text-overflow">{{reply.fzrxx}}</div>-->
<!-- </el-popover>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="答复情况">-->
<!-- <span v-if="reply.isReply" class="text-success">已答复</span>-->
<!-- <span v-else class="text-danger">未答复</span>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="分管领导">{{reply.xldxx}}</el-form-item>-->
<!-- <el-form-item label="审批情况">-->
<!-- <span v-if="reply.isLeaderAudit" class="text-success">已审批</span>-->
<!-- <span v-else class="text-danger">未审批</span>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<!-- </el-card>-->
<!-- </el-col>-->
<!-- </el-row>-->
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:align="column.align?column.align:'center'"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="$refs.info.openView(row.id);$refs.guava.view()" type="primary">
{{row.proposalName}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='resultName'">
<el-link type="primary">
{{row.resultName ? row.resultName:'暂未审核'}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
<span :style="row.isConjoin === 1 ? 'color: #236eb4' : ''">{{[proposal.CASE].includes(row.stateCode) ? '暂无' : row.isConjoin === 1 ? '是' : '否'}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='laLevelName'">
<span>
{{[proposal.CASE].includes(row.stateCode) ? '暂无' : !row.determineTypeCode ? '否' : row.determineTypeCode === 'emphasis' ? '重点' : '普通'}}
</span>
</template>
</el-table-column>
<!-- <el-table-column align="center" header-align="center" label="操作" fixed="right" width="200px">-->
<!-- <template scope="{row}">-->
<!-- <el-button size="mini" @click="openView(row)">查看</el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
},
data() {
return {
tableColumns: [
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'isConjoin', label: '是否并案', sortable: true},
{prop: 'laLevelName', label: '是否重点', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}
],
pageForm: {
searchName: 'proposalName',
meetingId: '',
stateCnd: []
},
searchCnd: []
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
searchFinished() {
this.pageData()
},
async pageData() {
const pageForm = clone(this.pageForm)
pageForm.stateCnd = JSON.stringify(pageForm.stateCnd)
const resp = await $.post(loc() + '/pageData', pageForm)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.notifyError(resp.msg)
}
},
tagClick(item) {
const item_index = this.pageForm.stateCnd.findIndex(v => v === item)
if (item_index > -1) {
this.pageForm.stateCnd.splice(item_index, 1)
} else {
this.pageForm.stateCnd.push(item)
}
this.doSearch()
},
async initSearchCnd() {
this.searchCnd = ['主办已答复', '主办未答复', '主办领导已审批', '主办领导未审批']
const config = await proposal.getProposalConfig()
if (config.slaveUnitConfig && config.slaveUnitConfig.isNeedReply) {
this.searchCnd = this.searchCnd.concat(['协办已答复', '协办未答复', '协办领导已审批', '协办领导未审批',])
}
},
tableRowClassName({rowIndex}) {
if (rowIndex % 2 === 0) {
return 'warning-row';
} else {
return 'success-row';
}
return '';
}
},
async created() {
this.initSearchCnd()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,457 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 50px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row .el-col {
overflow: hidden;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
.el-table-container {
padding-top: 0;
}
.search-card .el-card__body {
padding: 5px 20px !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card class="search-card" shadow="never">
<el-row align="middle" class="query-row" style="justify-content: center" type="flex">
<el-col style="width: 130px">
请输入搜索内容
</el-col>
<el-col :span="8" style="display: flex">
<el-input @keyup.enter.native="doSearch" clearable placeholder="可选择查询条件,输入关键字查询,多个关键字请使用空格分隔"
v-model="pageForm.searchKeyword">
</el-input>
</el-col>
<el-col :span="2" class="text-center">
<el-button @click="pageData" icon="el-icon-search" type="primary">搜索</el-button>
</el-col>
</el-row>
<el-row align="middle" class="query-row" justify="center" type="flex">
<el-col class="query-row-title">提案要素:</el-col>
<el-col class="query-row-content">
<el-tag :effect="pageForm.searchNames.includes(item.key)?'dark':'plain'"
:key="item.key"
:type="item.typeName"
@click="clickSearchNames(item.key)"
style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;"
v-for="item in searchNames">
{{item.label}}
</el-tag>
<el-link :underline="false" @click="pageForm.searchNames=[];doSearch()"
type="danger" v-if="pageForm.searchNames.length">清空
</el-link>
<!-- <el-checkbox-group style="width: 350px" v-model="pageForm.searchNames">-->
<!-- <el-checkbox-button :key="item.key" :label="item.key" v-for="item in searchNames">-->
<!-- {{item.label}}-->
<!-- </el-checkbox-button>-->
<!-- </el-checkbox-group>-->
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">提案类型:</el-col>
<el-col class="query-row-content">
<el-tag
:effect="pageForm.proposalTypes.includes(item.id)?'dark':'plain'"
:key="item.id"
:type="item.typeName"
@click="checkProposalType(item.id)"
style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;"
v-for="item in typeOptions">
{{ item.typeName }}
</el-tag>
<el-link :underline="false" @click="pageForm.proposalTypes=[];doSearch()"
type="danger" v-if="typeOptions.length&&pageForm.proposalTypes.length">清空
</el-link>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">立案结果:</el-col>
<el-col class="query-row-content">
<el-tag
:effect="pageForm.proposalResult.includes(item.code)?'dark':'plain'"
:key="item.code"
:type="item.name"
@click="checkProposalResult(item.code)"
style="margin-right: 10px;cursor: pointer;"
v-for="item in resultOptions">
{{ item.name }}
</el-tag>
<el-link :underline="false" @click="pageForm.proposalResult=[];doSearch()"
type="danger"
v-if="resultOptions.length&&pageForm.proposalResult.length">清空
</el-link>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex"
v-if="pageForm.proposalResult.includes('determine')">
<el-col class="query-row-title">是否重点:</el-col>
<el-col class="query-row-content">
<el-tag
:effect="pageForm.proposalDetermineTypes.includes(item.code)?'dark':'plain'"
:key="item.code"
:type="item.name"
@click="tagToggle('proposalDetermineTypes',item.code)"
style="margin-right: 10px;cursor: pointer"
v-for="item in determineTypeOptions">
{{ item.name }}
</el-tag>
<el-link :underline="false" @click="pageForm.proposalDetermineTypes=[];doSearch()"
type="danger"
v-if="determineTypeOptions.length&&pageForm.proposalDetermineTypes.length">清空
</el-link>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">&ensp;&ensp;会:</el-col>
<el-col class="query-row-content">
<el-tag :effect="pageForm.meetingIds.includes(item.id)?'dark':'plain'"
:key="item.id"
:type="item.typeName"
@click="clickMeetingIds(item.id)"
style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;"
v-for="item in meetingOptions">
{{item.jdhallname}}
</el-tag>
<el-link :underline="false" @click="pageForm.meetingIds=[];doSearch()"
type="danger" v-if="pageForm.meetingIds.length">清空
</el-link>
<!-- <el-row type="flex">-->
<!-- <el-col>-->
<!-- <el-select @change="meetingChange" clearable filterable-->
<!-- placeholder="请选择教代会"-->
<!-- style="width: 80%" v-model="pageForm.meetingId">-->
<!-- <el-option-->
<!-- :label="item.jdhallname"-->
<!-- :value="item.id"-->
<!-- v-for="item in meetingOptions">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-col>-->
<!-- </el-row>-->
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">&ensp;&ensp;团:</el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="8"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('tamanage')||@shiro.hasRole('jdhdbt01')}">
<!-- <span>代表团:</span>-->
<el-select @change="delegationChange" clearable filterable placeholder="所属代表团"
style="width: 350px" v-model="pageForm.delegationName">
<el-option :key="item.id"
:label="item.name"
:value="item.name"
v-for="item in delegationOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="8">
<span>承办单位:</span>
<el-select @change="doSearch()" clearable filterable
placeholder="" style="width: 350px" v-model="pageForm.underTakeId">
<el-option
:key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in underTakeOptions">
</el-option>
</el-select>
</el-col>
<!-- <el-col :span="8">-->
<!-- <span>所属工会:</span>-->
<!-- <el-select @change="unionChange" clearable filterable-->
<!-- placeholder="请选择所属工会" style="width: 350px" v-model="pageForm.unionId">-->
<!-- <el-option-->
<!-- :key="item.id"-->
<!-- :label="item.unionname"-->
<!-- :value="item.id"-->
<!-- v-for="item in unionOptions">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <span>所属单位:</span>-->
<!-- <el-select @change="doSearch" clearable filterable-->
<!-- placeholder="请选择所属单位会" style="width: 350px" v-model="pageForm.unitId">-->
<!-- <el-option-->
<!-- :key="item.id"-->
<!-- :label="item.name"-->
<!-- :value="item.id"-->
<!-- v-for="item in unitOptions">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-col>-->
</el-row>
</el-col>
</el-row>
</el-card>
<!-- <el-card shadow="never" class="search-card">-->
<!-- </el-card>-->
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
</table-tool>
<el-table :data="tableData" :row-key="(row)=>{row.id}" :size="tableSize" @sort-change="pageOrder"
align="center"
header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{ row.proposalName }}</el-link>
</template>
<template scope="{row:{resultName}}" v-else-if="column.prop=='resultName'">
<span>{{ resultName?resultName:'暂无' }}</span>
</template>
<template scope="{row:{pruMaster}}" v-else-if="column.prop==='pruMaster'">
<span>{{ pruMaster?pruMaster:'暂无' }}</span>
</template>
<template scope="{row:{pruSlave}}" v-else-if="column.prop==='pruSlave'">
<span>{{ pruSlave?pruSlave:'暂无' }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" header-align="center" label="操作"
label="操作" width="130px">
<template scope="{row}">
<el-button @click="oneProposalExport(row.id)" icon="el-icon-printer" size="mini"
type="primary">导出提案
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'oldProposalCode', label: '草案编号', width: "120", checked: 0, sortable: true},
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'pruMaster', label: '主办单位', sortable: true},
{prop: 'pruMasterCode', label: '主办单位编码', sortable: true, checked: 0},
{prop: 'pruSlave', label: '协办单位', sortable: true},
],
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
underTakeOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
searchName: "",
stateCode: '',
meetingIds: [],
delegationId: '',
proposalResult: [],
proposalTypes: [],
searchNames: ['info.proposalName'],
delegationName: '',
proposalDetermineTypes: []
},
searchNames: [
{label: '标题', key: 'info.proposalName'},
{label: '案由', key: 'info.brief'},
{label: '答复内容', key: 'zbpr.replyContent'},
{label: '提案人', key: 'su.username'}]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
tagToggle(optionsName, result) {
let idx = this.pageForm[optionsName].indexOf(result)
if (idx !== -1) {
this.pageForm[optionsName].splice(idx, 1)
} else {
this.pageForm[optionsName].push(result)
}
this.doSearch()
},
underTakeChange(val) {
},
clickMeetingIds(val) {
const idx = this.pageForm.meetingIds.indexOf(val)
if (idx !== -1) {
this.pageForm.meetingIds.splice(idx, 1)
} else {
this.pageForm.meetingIds.push(val)
}
this.doSearch()
},
clickSearchNames(val) {
const idx = this.pageForm.searchNames.indexOf(val)
if (idx !== -1) {
this.pageForm.searchNames.splice(idx, 1)
} else {
this.pageForm.searchNames.push(val)
}
this.doSearch()
},
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
},
async meetingChange(val) {
this.pageForm.delegationId = null
// this.delegationOptions = await proposal.getDelegation(val)
this.doSearch()
},
async delegationChange(val) {
this.pageForm.unionId = null
this.unionOptions = await getUnions(val)
this.doSearch()
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await getUnits(val)
this.doSearch()
},
checkProposalResult(result) {
let idx = this.pageForm.proposalResult.indexOf(result)
if (idx !== -1) {
this.pageForm.proposalResult.splice(idx, 1)
} else {
this.pageForm.proposalResult.push(result)
}
this.doSearch()
},
checkProposalType(type) {
let idx = this.pageForm.proposalTypes.indexOf(type)
if (idx !== -1) {
this.pageForm.proposalTypes.splice(idx, 1)
} else {
this.pageForm.proposalTypes.push(type)
}
this.doSearch()
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.searchNames = JSON.stringify(pageForm.searchNames)
pageForm.proposalTypes = JSON.stringify(pageForm.proposalTypes)
pageForm.proposalResult = JSON.stringify(pageForm.proposalResult)
pageForm.meetingIds = JSON.stringify(pageForm.meetingIds)
pageForm.determineTypeOptions = JSON.stringify(pageForm.proposalDetermineTypes)
$.post(loc() + "/pageData", pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
}
},
async created() {
this.meetingOptions = await getAllJdh()
// this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.stateOptions = await proposal.getOpenProposalState()
this.typeOptions = await proposal.getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
// this.delegationOptions = await proposal.getDelegation(this.pageForm.meetingId)
this.delegationOptions = await getDictOptions("dbtmc")
this.underTakeOptions = await proposal.getProposalUndertake()
// this.unionOptions = await getUnions(null)
// this.unitOptions = await getUnits(null)
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,236 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 70px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row .el-col {
overflow: hidden;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<!--# include("/platform/proposal/include/searchCnd.html"){}#-->
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :row-key="(row)=>{row.id}" :size="tableSize" @sort-change="pageOrder"
align="center"
header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{ row.proposalName }}</el-link>
</template>
<template scope="{row:{resultName}}" v-else-if="column.prop=='resultName'">
<span>{{ resultName?resultName:'暂无' }}</span>
</template>
<template scope="{row:{pruMaster}}" v-else-if="column.prop==='pruMaster'">
<span>{{ pruMaster?pruMaster:'暂无' }}</span>
</template>
<template scope="{row:{pruSlave}}" v-else-if="column.prop==='pruSlave'">
<span>{{ pruSlave?pruSlave:'暂无' }}</span>
</template>
<template scope="{row:{feedBackResultName}}" v-else-if="column.prop==='feedBackResultName'">
<span>{{ feedBackResultName?feedBackResultName:'暂无' }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" header-align="center" label="操作"
label="操作" width="130px">
<template scope="{row}">
<el-button @click="oneProposalExport(row.id)" icon="el-icon-printer" size="mini"
type="primary">导出提案
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'mannerName', label: '提交方式', sortable: true},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'laLevelName', label: '是否重点', sortable: true, checked: 0},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'feedBackResultName', label: '反馈意见', sortable: true, checked: 0},
{prop: 'pruMaster', label: '主办单位', sortable: true},
{prop: 'pruMasterCode', label: '主办单位编码', sortable: true, checked: 0},
{prop: 'pruSlave', label: '协办单位', sortable: true},
],
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
undertakeOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
},
async meetingChange(val) {
this.pageForm.delegationId = null
this.delegationOptions = await proposal.getDelegation(val)
this.undertakeOptions = await proposal.getUndertakeByMeeting(val)
this.doSearch()
},
async delegationChange(val) {
this.pageForm.unionId = null
this.unionOptions = await getUnions(val)
this.doSearch()
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await getUnits(val)
this.doSearch()
},
tagToggle(optionsName, result) {
let idx = this.pageForm[optionsName].indexOf(result)
if (idx !== -1) {
this.pageForm[optionsName].splice(idx, 1)
} else {
this.pageForm[optionsName].push(result)
}
this.doSearch()
},
checkProposalResult(result) {
let idx = this.pageForm.proposalResult.indexOf(result)
if (idx !== -1) {
this.pageForm.proposalResult.splice(idx, 1)
} else {
this.pageForm.proposalResult.push(result)
}
this.doSearch()
},
checkProposalType(type) {
let idx = this.pageForm.proposalTypes.indexOf(type)
if (idx !== -1) {
this.pageForm.proposalTypes.splice(idx, 1)
} else {
this.pageForm.proposalTypes.push(type)
}
this.doSearch()
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.proposalTypes = JSON.stringify(pageForm.proposalTypes)
pageForm.proposalResult = JSON.stringify(pageForm.proposalResult)
pageForm.determineTypeOptions = JSON.stringify(pageForm.proposalDetermineTypes)
$.post(loc() + "/pageData", pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.stateOptions = await proposal.getOpenProposalState()
this.typeOptions = await proposal.getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
this.delegationOptions = await proposal.getDelegation(this.pageForm.meetingId)
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,394 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 70px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<!-- <el-row type="flex" justify="center">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
style="width: 50%" @keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 110px;">
<el-option label="提案名称" value="proposalName"></el-option>
<el-option label="提案编号" value="proposalCode"></el-option>
</el-select>
</el-input>
</el-row>-->
<el-row align="middle" class="query-row" justify="center" type="flex">
<el-col :span="8">
<span>教代会:</span>
<el-select @change="meetingChange" filterable placeholder="请选择教代会"
style="width: 80%" v-model="pageForm.meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="8">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 90%" v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 110px;"
v-model="pageForm.searchName">
<el-option label="提案名称" value="proposalName"></el-option>
<el-option label="提案编号" value="proposalCode"></el-option>
</el-select>
</el-input>
</el-col>
<el-col :span="8">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 90%" v-model="pageForm.searchKeyword2">
<el-select placeholder="查询类型" slot="prepend" style="width: 100px;"
v-model="pageForm.searchName2">
<el-option label="提案人" value="su.username"></el-option>
<!-- <el-option label="附议人" value="seconded.username"></el-option>-->
</el-select>
</el-input>
</el-col>
</el-row>
</el-card>
<el-card shadow="never" style="margin-top: 10px">
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">提案状态:</el-col>
<el-col class="query-row-content">
<el-select @change="doSearch()" clearable filterable placeholder="请选择提案状态"
style="width: 400px" v-model="pageForm.stateCode">
<el-option :key="item.stateCode"
:label="item.stateName"
:value="item.stateCode"
v-for="item in stateOptions">
</el-option>
</el-select>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">提案类型:</el-col>
<el-col class="query-row-content">
<el-tag
:effect="pageForm.proposalTypes.includes(item.id)?'dark':'plain'"
:key="item.id"
:type="item.typeName"
@click="checkProposalType(item.id)"
style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;"
v-for="item in typeOptions">
{{ item.typeName }}
</el-tag>
<el-link :underline="false" @click="pageForm.proposalTypes=[];doSearch()"
type="danger" v-if="typeOptions.length&&pageForm.proposalTypes.length">清空
</el-link>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title">&ensp;&ensp;团:</el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="8"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('tamanage')||@shiro.hasRole('jdhdbt01')}">
<!-- <span>代表团:</span>-->
<el-select @change="delegationChange" clearable filterable placeholder="所属代表团"
style="width: 350px" v-model="pageForm.delegationId">
<el-option :key="item.id"
:label="item.dbtname"
:value="item.id"
v-for="item in delegationOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="8">
<span>所属工会:</span>
<el-select @change="unionChange" clearable filterable
placeholder="请选择所属工会" style="width: 350px" v-model="pageForm.unionId">
<el-option
:key="item.id"
:label="item.unionname"
:value="item.id"
v-for="item in unionOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="8">
<span>所属单位:</span>
<el-select @change="doSearch" clearable filterable
placeholder="请选择所属单位会" style="width: 350px" v-model="pageForm.unitId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row class="query-row" type="flex">
<el-col class="query-row-title">征集状态:</el-col>
<el-col class="query-row-content">
<el-tag
:effect="pageForm.levyStates.includes(item.value)?'dark':'plain'"
:key="item.value"
:type="item.label"
@click="checkLevyState(item.value)"
style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;"
v-for="item in levyAuditOptions">
{{ item.label }}
</el-tag>
<el-link :underline="false" @click="pageForm.levyStates=[];doSearch()"
type="danger" v-if="levyAuditOptions.length&&pageForm.levyStates.length">清空
</el-link>
</el-col>
</el-row>
</el-card>
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
<template #func>
<el-button :disabled="!pageForm.meetingId" @click="manualRemind" size="small" type="primary">
一键提醒
</el-button>
</template>
</table-tool>
<el-card class="mt20" shadow="never">
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" align="center"
header-align="center"
row-key="id"
>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{row.proposalName}}</el-link>
</template>
</el-table-column>
<el-table-column fixed="right" header-align="center" label="操作"
label="操作" width="130px">
<template scope="{row}">
<el-button @click="oneProposalExport(row.id)" icon="el-icon-printer" size="mini"
type="primary">导出提案
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
resultOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
levyStates: []
},
tableColumns: [
{prop: 'oldProposalCode', label: '草案编号', width: "120", checked: 0},
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'mobile', label: '联系方式', disabled: true},
{prop: 'unitname', label: '单位', disabled: true},
{prop: 'delegationName', label: '代表团', sortable: true},
// {prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'typeName', label: '提案类型', sortable: true},
// {prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提交方式', sortable: true},
{prop: 'secondedNum', label: '附议人数量', sortable: true},
{prop: 'secondedAgreeNum', label: '已附议', sortable: true},
{prop: 'delegationAudit', label: '团长审核', sortable: true},
],
levyAuditOptions: [
{label: '未提交', value: 0},
{label: '未附议', value: 1},
{label: '附议中', value: 2},
{label: '待团长审核', value: 3},
{label: '团长已审核', value: 4},
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
async manualRemind() {
const confirm = await this.$confirm('请确认是否一键提醒?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/remindProposalCreator', {teacherMeetingId: this.pageForm.meetingId})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
} else {
this.notifyError(resp.msg)
}
}
},
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
},
async meetingChange(val) {
this.pageForm.delegationId = null
this.delegationOptions = await getDelegation(val)
this.doSearch()
},
async delegationChange(val) {
this.pageForm.unionId = null
this.unionOptions = await getUnions(val)
this.doSearch()
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await getUnits(val)
this.doSearch()
},
checkProposalResult(result) {
let idx = this.pageForm.proposalResult.indexOf(result)
if (idx !== -1) {
this.pageForm.proposalResult.splice(idx, 1)
} else {
this.pageForm.proposalResult.push(result)
}
this.doSearch()
},
checkProposalType(type) {
let idx = this.pageForm.proposalTypes.indexOf(type)
if (idx !== -1) {
this.pageForm.proposalTypes.splice(idx, 1)
} else {
this.pageForm.proposalTypes.push(type)
}
this.doSearch()
},
checkLevyState(type) {
this.pageForm.levyStates = [type]
// let idx = this.pageForm.levyStates.indexOf(type)
// if (idx !== -1) {
// this.pageForm.levyStates.splice(idx, 1)
// } else {
// this.pageForm.levyStates.push(type)
// }
this.doSearch()
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.proposalTypes = JSON.stringify(pageForm.proposalTypes)
pageForm.proposalResult = JSON.stringify(pageForm.proposalResult)
pageForm.levyStates = JSON.stringify(pageForm.levyStates)
$.post(loc() + "/pageData", pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.stateOptions = await getOpenProposalState()
this.typeOptions = await getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.delegationOptions = await getDelegation(this.pageForm.meetingId)
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,232 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table {
margin-top: 0 !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<el-row justify="space-between" type="flex">
<el-col>
<el-select @change="meetingChange" filterable placeholder="请选择教代会"
v-model="pageForm.meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
<el-select @change="pageData()" clearable filterable placeholder="请选择代表团"
v-model="pageForm.delegationId">
<el-option :key="item.id" :label="item.dbtname" :value="item.id"
v-for="item in delegationOptions">
</el-option>
</el-select>
<el-select @change="pageData()" clearable filterable
placeholder="请选择承办单位" v-model="pageForm.undertakeId">
<el-option
:label="item.unitName"
:value="item.id"
v-for="item in undertakeOptions">
</el-option>
</el-select>
<el-select @change="pageData()" clearable filterable placeholder="请选择提案类型"
v-model="pageForm.typeId">
<el-option
:key="item.id"
:label="item.typeName"
:value="item.id"
v-for="item in typeOptions">
</el-option>
</el-select>
<el-select @change="pageData()" clearable filterable placeholder="请选择提案状态"
v-model="pageForm.stateCode">
<el-option :key="item.stateCode"
:label="item.stateName"
:value="item.stateCode"
v-for="item in stateOptions">
</el-option>
</el-select>
</el-col>
</el-row>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="提案列表">
<template #func>
<el-button :disabled="!pageForm.meetingId" @click="sessionExport" icon="el-icon-printer"
size="medium"
type="primary">
按条件导出提案
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :row-key="()=>{new Date().getTime()}" :size="tableSize"
@sort-change="pageOrder"
class="vi-table" style="width: 100%;margin-bottom: 20px" v-loading="tableLoading">
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="$refs.info.openView(row.id);$refs.guava.view()" type="primary">
{{row.proposalName}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='stateId'">
<span :style="'color:'+row.stateColor"
v-if="(!row.isReplyPass||!row.isCommitteePass)&&row.isAudit&&!row.isMake&&!row.isReply">退回修改</span>
<vi-table-state :state="row" v-else></vi-table-state>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="100px">
<template scope="{row}">
<el-button @click="oneProposalExport(row.id)" size="mini" type="primary">
导出
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
stateOptions: [],
undertakeOptions: [],
meetingOptions: [],
delegationOptions: [],
typeOptions: [],
proposalIds: [],
pageForm: {
delegationId: "",
stateCode: "",
typeId: ""
},
tableColumns: [
{prop: 'proposalCode', label: '提案编号'},
{prop: 'proposalName', label: '提案名称'},
{prop: 'username', label: '提案人'},
{prop: 'createTime', label: '提案时间'},
{prop: 'typeName', label: '提案类型'},
{prop: 'meetingName', label: '教代会届次'},
{prop: 'delegationName', label: '所属代表团'},
{prop: 'stateId', label: '提案状态'},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'undertake') {
this.undertakeExport()
} else if (type === 'session') {
this.sessionExport()
} else if (type === 'proposal') {
this.proposalExport(data.id)
} else if (type === 'info') {
this.oneProposalExport(data.id)
}
},
async meetingChange(val) {
this.undertakeOptions = await proposal.getUndertakeByMeeting(val)
this.pageData()
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
/**
* 按届次导出提案
*/
sessionExport() {
const {meetingId, undertakeId, stateCode, delegationId} = this.pageForm
let props = {}
this.tableColumns.forEach(v => {
props[v.prop] = v.label
})
if (meetingId) {
window.location.href = loc() + "/sessionExport?meetingId=" + meetingId + "&stateCode=" + stateCode + "&delegationId=" + delegationId + "&props=" + JSON.stringify(props)
}
/* if (undertakeId && meetingId) {
window.location.href = loc() + "/undertakeExport?meetingId=" + meetingId + "&undertakeId=" + undertakeId
}
*/
},
/**
* 按承办单位导出
*/
undertakeExport() {
const {meetingId, undertakeId} = this.pageForm
if (!undertakeId) {
this.$notify.warning({title: '警告', message: '请选择承办单位'});
return
}
window.location.href = loc() + "/undertakeExport?meetingId=" + meetingId + "&undertakeId=" + undertakeId
},
/**
* 按提案导出承办
*/
proposalExport(id) {
window.location.href = loc() + "/proposalExport?proposalId=" + id
},
/**
* 导出单个提案信息
*/
oneProposalExport(id) {
window.location.href = loc() + "/oneProposalExport?proposalId=" + id
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
this.stateOptions = await proposal.getOpenProposalState()
this.delegationOptions = await proposal.getDelegation(this.pageForm.meetingId)
this.typeOptions = await proposal.getProposalType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,224 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<el-row type="flex">
<el-col>
<span>教代会:</span>
<el-select @change="meetingChange" filterable placeholder="请选择教代会"
style="width: 80%;margin-right: 20px" v-model="pageForm.meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-col>
<el-col>
<span>承办单位:</span>
<el-select @change="pageData()" clearable filterable
placeholder="请选择承办单位" style="width: 80%" v-model="pageForm.undertakeId">
<el-option
:label="item.unitName"
:value="item.id"
v-for="item in undertakeOptions">
</el-option>
</el-select>
</el-col>
</el-row>
</el-card>
<el-table :data="tableData" :summary-method="getSummaries" class="mt10" show-summary>
<el-table-column header-align="center" label="序号" type="index"></el-table-column>
<el-table-column header-align="center" label="单位名称" prop="unitName">
<template scope="{row}">
<el-link @click="selectProposalByUnit(row)" type="primary">{{ row.unitName }}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="提案总数" prop="totalCount" sortable></el-table-column>
<el-table-column header-align="center" label="主办提案数"
prop="masterCount" sortable></el-table-column>
<el-table-column header-align="center" label="协办提案数" prop="slaveCount" sortable></el-table-column>
<el-table-column
header-align="center" label="满意" prop="satisfiedCount"
sortable v-if="feedBackNames.includes('满意')"></el-table-column>
<el-table-column
header-align="center" label="比较满意" prop="quiteSatisfiedCount"
sortable v-if="feedBackNames.includes('比较满意')"></el-table-column>
<el-table-column
header-align="center" label="基本满意" prop="basicallySatisfiedCount"
sortable v-if="feedBackNames.includes('基本满意')"></el-table-column>
<el-table-column
header-align="center" label="不满意" prop="notSatisfiedCount"
sortable v-if="feedBackNames.includes('不满意')"></el-table-column>
<el-table-column header-align="center" label="满意度" prop="satisfiedRate"></el-table-column>
</el-table>
<el-dialog :title="dialogTitle" :visible.sync="undertakeVisible" width="70%">
<el-table :data="undertakeTableData" :size="tableSize" align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{ row.proposalName }}</el-link>
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
dialogTitle: '',
undertakeVisible: false,
undertakeOptions: [],
meetingOptions: [],
undertakeTableData: [],
pageForm: {},
tableColumns: [
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}],
showSlaveTableColumn: false,
feedBackNames: []
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
async meetingChange() {
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
await this.pageData()
},
async selectProposalByUnit(row) {
const resp = await $.get(loc() + '/selectProposalByUnit', {
meetingId: this.pageForm.meetingId,
underTakeId: row.id
})
this.dialogTitle = row.unitName + '所承办提案'
this.undertakeVisible = true
if (resp.code === 0) {
this.undertakeTableData = resp.data
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
this.undertakeVisible = false
},
getSummaries(param) {
const {columns, data} = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计'
return;
} else if (index === 1) {
sums[index] = '';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
} else if (index === 9) {
sums[index] = ((sums[5] + sums[6] + sums[7]) / sums[2]).toFixed(2) * 100 + '%'
} else {
sums[index] += 'NaN';
}
});
return sums;
},
async pageData() {
sublime.showLoadingbar()
this.tableLoading = true
const resp = await $.post(loc() + "/pageData", this.pageForm)
sublime.closeLoadingbar()
this.tableLoading = false
if (resp.code === 0) {
resp.data.forEach(v => {
// v.satisfiedRate = isNaN((v.satisfied / v.total) * 100) ? 0 : ((v.satisfied / v.total) * 100).toFixed(1)
v.satisfiedRate = ((v.satisfiedCount + v.quiteSatisfiedCount + v.basicallySatisfiedCount) / v.totalCount).toFixed(2) * 100 + '%'
})
this.tableData = resp.data
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
},
async initTableSlaveColumns() {
const config = await proposal.getProposalConfig()
this.showSlaveTableColumn = config.slaveUnitConfig && config.slaveUnitConfig.isNeedReply
},
async getFeedBackNames() {
const data = await getDictOptions("proposal_feedback")
this.feedBackNames = data.map(v => v.name)
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
await this.pageData()
this.initTableSlaveColumns()
this.getFeedBackNames()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,317 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">届次:</div>
<div class="search-item-option">
<el-select @change="meetingChange"
placeholder="请选择教代会届次" style="width: 300px" v-model="pageForm.meetingId">
<el-option
:label="item.jdhallname"
:value="item.id"
v-for="item in allJdhOptions">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label"></div>
<div class="search-item-option">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 90%" v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 110px;"
v-model="pageForm.searchName">
<el-option label="提案名称" value="proposalName"></el-option>
<el-option label="提案编号" value="proposalCode"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">承办单位:</div>
<div class="search-item-option">
<el-select clearable filterable
placeholder="请选择承办单位" style="width: 300px" v-model="pageForm.unitId">
<el-option
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="pageData" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
<div class="search">
<div class="search-item" style="width: 100%;margin-top: 15px;">
<div class="search-item-label">快捷查询:</div>
<div class="search-item-option">
<el-tag :effect="clickTags.includes(item.name)?'dark':''"
@click="filterData(item)"
class="mr5"
style="cursor: pointer"
v-for="item in searchTags">
{{item.name}}
</el-tag>
<el-link :underline="false" @click="clickTags=[];pageData()"
type="danger" v-if="clickTags.length>0">清空
</el-link>
</div>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="提案列表">
<template #func>
<!-- <el-button type="primary" icon="el-icon-download" size="small"
@click="doExport">
导出提案承办汇总表
</el-button>-->
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
class="vi-table"
row-key="id" style="width: 100%;margin-bottom: 20px" v-loading="tableLoading">
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="$refs.info.openView(row.id);$refs.guava.view()" type="primary">
{{row.proposalName}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='pruMaster'">
<template v-if="row.pruMaster">
<el-popover
@show="getUnitLeader([row.pruMasterId])"
placement="right"
trigger="click"
width="400">
<div v-html="unitLeaderInfo"></div>
<span slot="reference" style="cursor: pointer">
{{row.pruMaster}}<i class="el-icon-phone" style="color: #67c23a"></i>
</span>
</el-popover>
</template>
<span v-else>
暂无
</span>
</template>
<template scope="{row}" v-else-if="column.prop=='pruSlaveReply'">
<template v-if="row.pruSlaveReply">
<el-popover
@show="getUnitLeader(row.pruSlaveId.split(','))"
placement="right"
trigger="click"
width="400">
<div v-html="unitLeaderInfo"></div>
<span slot="reference" style="cursor: pointer">
{{row.pruSlaveReply}}<i class="el-icon-phone" style="color: #67c23a"></i>
</span>
</el-popover>
</template>
<span v-else>
暂无
</span>
</template>
<template scope="{row}" v-else-if="column.prop=='stateCode'">
<vi-table-state :state="row"></vi-table-state>
</template>
<template scope="{row:{feedback}}" v-else-if="column.prop=='feedback'">
<el-tag size="medium" type="success" v-if="feedback">已反馈</el-tag>
<el-tag size="medium" type="danger" v-else>未反馈</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='urgeNum'">
<el-link @click="findUrgeRecord(row.id)" type="primary">{{row.urgeNum}}</el-link>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100px">
<template scope="{row}">
<!-- :disabled="row.isAllReply"-->
<el-button :loading="submitDisabled" @click="doUrge(row)" disabled
size="mini"
type="primary">催办
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
<el-dialog :visible.sync="urgeDialog" title="催办记录">
<el-table :data="urgeRecordList">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80"></el-table-column>
<el-table-column align="center" header-align="center" label="催办人姓名"
property="urgeUserName"></el-table-column>
<el-table-column align="center" header-align="center" label="催办人工号"
property="urgeLoginName"></el-table-column>
<el-table-column align="center" header-align="center" label="催办时间" property="operateTime"></el-table-column>
</el-table>
</el-dialog>
</div>
<script>
let chart
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
urgeDialog: false,
submitDisabled: false,
urgeRecordList: [],
allJdhOptions: [],
tableData: [],
fullTableData: [],
unitOptions: [],
tableColumns: [
{prop: 'oldProposalCode', label: '草案编号', width: "120", checked: 0},
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'resultName', label: '立案结果', disabled: true, sortable: true},
{prop: 'pruMaster', label: '主办单位', sortable: true},
{prop: 'pruMasterReply', label: '主办单位答复', sortable: true},
{prop: 'pruSlaveReply', label: '协办单位'},
{prop: 'pruMasterLeader', label: '分管校领导'},
{prop: 'pruMasterLeaderIsAudit', label: '审批答复'},
{prop: 'feedback', label: '反馈意见'},
{prop: 'stateCode', label: '状态'},
{prop: 'urgeNum', label: '催办次数'},
],
unitLeaderInfo: null,
searchTags: [
{name: '主办已答复', cnd: {key: 'pruMasterReply', value: '已答复'}},
{name: '主办未答复', cnd: {key: 'pruMasterReply', value: '未答复'}},
{name: '协办已答复', cnd: {key: 'pruSlaveReply', value: '已答复'}},
{name: '协办未答复', cnd: {key: 'pruSlaveReply', value: '未答复'}},
{name: '领导已审批', cnd: {key: 'pruMasterLeaderIsAudit', value: '已审批'}},
{name: '领导未审批', cnd: {key: 'pruMasterLeaderIsAudit', value: '未审批'}},
],
clickTags: []
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue')
},
methods: {
filterData(tag) {
const {name, cnd} = tag
if (this.clickTags.indexOf(name) > -1) {
this.clickTags.splice(this.clickTags.indexOf(name), 1)
} else {
this.clickTags.push(name)
}
const choseTags = this.searchTags.filter(v => this.clickTags.includes(v.name))
let tempTableData = this.fullTableData
choseTags.forEach(v => {
tempTableData = tempTableData.filter(t => t[v.cnd.key] && t[v.cnd.key].indexOf(v.cnd.value) > -1)
})
this.tableData = tempTableData
if (choseTags.length === 0) {
this.tableData = this.fullTableData
}
},
async findUrgeRecord(proposalId) {
this.urgeDialog = true
const resp = await $.post("/platform/proposal/senior/urge/findUrgeRecord", {proposalId})
requestLaterFun(resp, (data) => {
this.urgeRecordList = data
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
},
doExport() {
location.href = loc() + '/export?meetingId=' + (this.pageForm.meetingId ? this.pageForm.meetingId : '') + '&unitId=' + (this.pageForm.unitId ? this.pageForm.unitId : '')
},
async doUrge(row) {
this.submitDisabled = true
this.$confirm('确定催办吗?', '提示', {type: 'warning'}).then(async () => {
const resp = await $.post("/platform/proposal/senior/urge/doUrge", {proposalId: row.id})
requestLaterFun(resp, (data) => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.submitDisabled = false
})
}).catch(() => {
this.submitDisabled = false
});
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async pageData() {
sublime.showLoadingbar()
this.tableLoading = true
const resp = await $.post(loc() + "/data", this.pageForm)
sublime.closeLoadingbar()
this.tableLoading = false
if (resp.code === 0) {
this.fullTableData = resp.data
this.tableData = resp.data
this.pageForm.totalCount = resp.data.totalCount
} else {
this.$message.error(resp.msg)
}
},
async meetingChange(val) {
this.unitOptions = await proposal.getUndertakeByMeeting(val)
},
async getUnitLeader(unitIds) {
const resp = await $.get(loc() + '/getUnitLeader', {unitIds: JSON.stringify(unitIds)})
this.unitLeaderInfo = resp.data
}
},
async created() {
this.allJdhOptions = await getAllJdh()
this.$set(this.pageForm, 'meetingId', this.allJdhOptions.length ? this.allJdhOptions[0].id : '')
this.pageData()
this.unitOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
if (proposal.enableState.some(v => v.stateCode === 800)) {
this.tableColumns.splice(9, 0, {prop: 'caseCheckAudit', label: '提案委员会审查'},)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,280 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table {
margin-top: 0 !important;
}
.query-row {
height: 70px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row .el-col {
overflow: hidden;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<!--# include("/platform/proposal/include/searchCnd.html"){}#-->
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="提案列表">
<template #func>
<el-button :disabled="meetingOptions.findIndex(v=>v.id==pageForm.meetingId)===0" @click="doExport"
type="primary">导出提案报告
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @selection-change="handleSelectionChange"
@sort-change="pageOrder"
align="center" header-align="center" ref="multipleTable"
row-key="id">
<el-table-column
reserve-selection
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:align="column.align?column.align:'center'"
:label="column.label"
:min-width="column.width"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='proposalName'">
<el-link @click="openView(row)" type="primary">{{row.proposalName}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
<span :style="row.isConjoin === 1 ? 'color: #236eb4' : ''">{{[proposal.CASE].includes(row.stateCode) ? '暂无' : row.isConjoin === 1 ? '是' : '否'}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='auditState'">
<span v-if="![proposal.CASE].includes(row.stateCode)">已审核</span>
<span v-else>待审核</span>
</template>
<template scope="{row}" v-else-if="column.prop=='resultName'">
<el-link type="primary">
{{row.resultName ? row.resultName:'暂未审核'}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='laLevelName'">
<span>
{{[proposal.CASE].includes(row.stateCode) ? '暂无' : !row.determineTypeCode ? '否' : row.determineTypeCode === 'emphasis' ? '重点' : '普通'}}
</span>
</template>
</el-table-column>
</el-table>
<!-- <proposal-table :data="tableData" :loading="tableLoading" :page="pageForm" @order="pageOrder"-->
<!-- @selection="handleSelectionChange"-->
<!-- @view="openView"-->
<!-- selection>-->
<!-- </proposal-table>-->
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
meetingOptions: [],
tableData: [],
loading: false,
tableLoading: false,
pageForm: {
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
},
selectProposal: [],
tableColumns: [
{prop: 'oldProposalCode', label: '草案编号', width: "120", checked: 0},
{prop: 'proposalCode', label: '提案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', width: "300", disabled: true},
{prop: 'username', label: '提案人', disabled: true},
{prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提案方式', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true, checked: 0},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true, checked: 0},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'isConjoin', label: '是否并案', sortable: true},
{prop: 'laLevelName', label: '是否重点', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'auditState', label: '审核状态', sortable: true},
],
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
undertakeOptions: [],
unionOptions: [],
unitOptions: [],
}
},
components: {
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
},
methods: {
async meetingChange(val) {
this.pageForm.delegationId = null
this.delegationOptions = await proposal.getDelegation(val)
this.undertakeOptions = await proposal.getUndertakeByMeeting(val)
this.doSearch()
},
async delegationChange(val) {
this.pageForm.unionId = null
this.unionOptions = await getUnions(val)
this.doSearch()
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await getUnits(val)
this.doSearch()
},
tagToggle(optionsName, result) {
let idx = this.pageForm[optionsName].indexOf(result)
if (idx !== -1) {
this.pageForm[optionsName].splice(idx, 1)
} else {
this.pageForm[optionsName].push(result)
}
this.doSearch()
},
checkProposalResult(result) {
let idx = this.pageForm.proposalResult.indexOf(result)
if (idx !== -1) {
this.pageForm.proposalResult.splice(idx, 1)
} else {
this.pageForm.proposalResult.push(result)
}
this.doSearch()
},
checkProposalType(type) {
let idx = this.pageForm.proposalTypes.indexOf(type)
if (idx !== -1) {
this.pageForm.proposalTypes.splice(idx, 1)
} else {
this.pageForm.proposalTypes.push(type)
}
this.doSearch()
},
handleSelectionChange(val) {
this.selectProposal = val
},
doExport() {
if (this.selectProposal.length === 0) {
this.notifyWarning('请先选择提案后再导出提案报告')
return
}
const params = {
meetingId: this.pageForm.meetingId,
proposalIds: this.selectProposal.map(v => v.id)
}
window.location.href = loc() + '/doExport' + "?data=" + JSON.stringify(params)
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async pageData() {
sublime.showLoadingbar();
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.proposalTypes = JSON.stringify(pageForm.proposalTypes)
pageForm.proposalResult = JSON.stringify(pageForm.proposalResult)
pageForm.determineTypeOptions = JSON.stringify(pageForm.proposalDetermineTypes)
const resp = await $.post(loc() + "/pageData", pageForm)
sublime.closeLoadingbar();
this.tableLoading = false
if (resp.code === 0) {
this.tableData = resp.data.list;
this.pageForm.totalCount = resp.data.totalCount;
} else {
this.$message.error(resp.msg);
}
},
},
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : null
this.stateOptions = await proposal.getOpenProposalState()
this.typeOptions = await proposal.getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
this.delegationOptions = await proposal.getDelegation(this.pageForm.meetingId)
this.undertakeOptions = await proposal.getUndertakeByMeeting(this.pageForm.meetingId)
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
if (this.pageForm.meetingId != null) {
this.pageData()
}
}
})
</script>
<!--#
}
#-->