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,352 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.item-button {
text-align: right;
}
.item-button .el-button {
padding: 12px 25px;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="clearfix" slot="header">
<h3 style="color: rgb(24, 103, 176);font-family: Microsoft YaHei;">提案配置</h3>
</div>
<el-form :model="formData" :rules="formRules" label-width="150px" ref="addForm">
<el-form-item label="配置名称" prop="configName">
<el-input placeholder="请输入配置名称" v-model="formData.configName"></el-input>
</el-form-item>
<el-form-item label="附议人数量" prop="seconderNum">
<el-input maxlength="1" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="请输入附议人数量" v-model="formData.seconderNum"></el-input>
</el-form-item>
<el-form-item label="提交模式" prop="submitMode">
<el-radio-group v-model="formData.submitMode">
<el-radio-button :label="item.code"
v-for="item in submitModeList">{{item.description}}
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="超时自动提交天数" prop="timeoutDays">
<el-input maxlength="3" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="协办单位超时自动提交天数" v-model="formData.timeoutDays"></el-input>
</el-form-item>
<el-form-item label="提醒日期" prop="remindProposalCreatorDate">
<el-date-picker
:picker-options="remindProposalCreatorDatepickerOptions"
placeholder="选择提醒日期"
type="datetime"
v-model="formData.remindProposalCreatorDate"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-form-item label="办理提醒设置(多选)" prop="reminder">
<el-checkbox-group v-model="formData.reminder">
<el-checkbox-button :key="item.id" :label="item.code" v-for="item in reminderList">{{item.name}}
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
<el-form-item label="撰写提案方式(多选)" prop="manner">
<el-checkbox-group v-model="formData.manner">
<el-checkbox-button :key="item.id" :label="item.code" v-for="item in allMannerList">
{{item.name}}
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
<!-- <el-form-item label="是否自动提交" prop="isAutoSubmit">-->
<!-- <el-radio-group v-model="formData.isAutoSubmit">-->
<!-- <el-radio-button :label="true">是</el-radio-button>-->
<!-- <el-radio-button :label="false">否</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="个人是否看审核环节" prop="isSeeAudit">-->
<!-- <el-radio-group v-model="formData.isSeeAudit">-->
<!-- <el-radio-button :label="true">是</el-radio-button>-->
<!-- <el-radio-button :label="false">否</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="团长审核方式" prop="headAuditMethod">-->
<!-- <el-radio-group v-model="formData.headAuditMethod">-->
<!-- <el-radio-button label="TRADITION">传统方式</el-radio-button>-->
<!-- <el-radio-button label="UNITE">联合方式</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="提案最少字数" prop="words">
<el-input-number :max="5000" :min="1" :precision="0" :step="1"
v-model="formData.words"></el-input-number>
</el-form-item>
<el-form-item label="校领导单位代码" prop="schoolLeaderUnitCode">
<el-input v-model="formData.schoolLeaderUnitCode"></el-input>
</el-form-item>
<el-form-item label="不予立案理由">
<template v-for="(o,i) in formData.noFilingReason">
<el-row style="margin-bottom: 10px" type="flex">
<el-col :span="20">
<el-input maxlength="100" v-model="formData.noFilingReason[i]">
<template slot="prepend">{{i+1}}.</template>
</el-input>
</el-col>
<el-col :span="4" class="pl5">
<el-button @click="deleteReasonRow(i)" icon="el-icon-delete"
type="danger"></el-button>
</el-col>
</el-row>
</template>
<el-button @click="formData.noFilingReason.push('')" type="primary">增加一条</el-button>
</el-form-item>
<el-form-item label="二次答复需要校领导审批" prop="secondReplyAfterNeedLeaderAudit">
<el-radio-group v-model="formData.secondReplyAfterNeedLeaderAudit">
<el-radio-button :label="true"></el-radio-button>
<el-radio-button :label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-row>
<p style="width: 150px;text-align: right;padding-right: 12px">主办配置</p>
<el-col :span="8">
<el-form-item label="需要答复" prop="masterUnitConfig.isNeedReply">
<el-switch
active-text="需要"
inactive-text="不需要"
v-model="formData.masterUnitConfig.isNeedReply">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="答复顺序" prop="masterUnitConfig.isFirstReply">
<el-switch
:disabled="!formData.masterUnitConfig.isNeedReply"
active-text="首先答复"
inactive-text="第二答复"
v-model="formData.masterUnitConfig.isFirstReply">
</el-switch>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="需要二次答复" prop="masterUnitConfig.isNeedSecondReply">
<el-switch
v-model="formData.masterUnitConfig.isNeedSecondReply"
:disabled="!formData.masterUnitConfig.isFirstReply"
active-text="需要"
inactive-text="不需要">
</el-switch>
</el-form-item>
</el-col>-->
</el-row>
<el-row>
<p style="width: 150px;text-align: right;padding-right: 12px">协办配置</p>
<el-col :span="8">
<el-form-item label="需要答复" prop="slaveUnitConfig.isNeedReply">
<el-switch
active-text="需要"
inactive-text="不需要"
v-model="formData.slaveUnitConfig.isNeedReply">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="答复顺序" prop="slaveUnitConfig.isFirstReply">
<el-switch
:disabled="!formData.slaveUnitConfig.isNeedReply"
active-text="首先答复"
inactive-text="第二答复"
v-model="formData.slaveUnitConfig.isFirstReply">
</el-switch>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="需要二次答复" prop="slaveUnitConfig.isNeedSecondReply">
<el-switch
v-model="formData.slaveUnitConfig.isNeedSecondReply"
:disabled="!formData.slaveUnitConfig.isFirstReply"
active-text="需要"
inactive-text="不需要">
</el-switch>
</el-form-item>
</el-col>-->
</el-row>
<el-form-item label="撰写须知" prop="writeRemind">
<el-input
:autosize="{ minRows: 5, maxRows: 10}"
maxlength="800"
placeholder="请输入撰写须知"
type="textarea"
v-model="formData.writeRemind">
</el-input>
</el-form-item>
<el-form-item class="item-button">
<el-button @click="resetForm" type="danger">&emsp;</el-button>
<el-button :loading="subLoading" @click="operation" type="primary">&emsp;</el-button>
</el-form-item>
</el-form>
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
subLoading: false,
reminderList: [],
allMannerList: [],
openMannerList: [],
submitModeList: [],
formData: {
configName: '智慧工会提案配置',
seconderNum: '',
reminder: ['SMS'],
manner: ['W01'],
isAutoSubmit: true,
isSeeAudit: false,
headAuditMethod: null,
words: 1,
noFilingReason: [],
masterUnitConfig: {},
slaveUnitConfig: {},
submitMode: 'AMT'
},
formRules: {
configName: [{required: true, message: '请填写配置名称', trigger: ['blur', 'change']}],
seconderNum: [{required: true, message: '请填写附议人数量', trigger: ['blur', 'change']}],
reminder: [{required: true, message: '请选择办理提醒设置', trigger: ['blur', 'change']}],
manner: [{required: true, message: '请选择撰写提案方式', trigger: ['blur', 'change']}],
isAutoSubmit: [{required: true, message: '请选择是否自动提交', trigger: ['blur', 'change']}],
isSeeAudit: [{required: true, message: '请选择个人是否能看审核环节', trigger: ['blur', 'change']}],
headAuditMethod: [{required: true, message: '请选择团长审核方式', trigger: ['blur', 'change']}],
words: [{required: true, message: '请输入提案内容要求字数', trigger: ['blur', 'change']}],
submitMode: [{required: true, message: '请选择提交模式', trigger: ['blur', 'change']}]
},
remindProposalCreatorDatepickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now()
}
}
}
},
watch: {
'formData.masterUnitConfig.isNeedReply'(val) {
if (!val) {
this.$set(this.formData.masterUnitConfig, 'isFirstReply', false)
this.$set(this.formData.masterUnitConfig, 'isNeedSecondReply', false)
}
},
'formData.masterUnitConfig.isFirstReply'(val) {
if (!val) {
this.$set(this.formData.masterUnitConfig, 'isNeedSecondReply', false)
}
},
'formData.slaveUnitConfig.isNeedReply'(val) {
if (!val) {
this.$set(this.formData.slaveUnitConfig, 'isFirstReply', false)
this.$set(this.formData.slaveUnitConfig, 'isNeedSecondReply', false)
}
},
'formData.slaveUnitConfig.isFirstReply'(val) {
if (!val) {
this.$set(this.formData.slaveUnitConfig, 'isNeedSecondReply', false)
}
}
},
methods: {
deleteReasonRow(i) {
if (i === 0) {
return
}
this.formData.noFilingReason.splice(i, 1)
},
async getDictByCode() {
const {data} = await $.get(loc() + "/getDictByCode", {code: "proposal_manner"})
return data
},
async pageData() {
const {data} = await $.get(loc() + "/findOne")
if (data) {
data.noFilingReason = data.noFilingReason ? data.noFilingReason : ['']
if (!data.masterUnitConfig) {
data.masterUnitConfig = {}
}
if (!data.slaveUnitConfig) {
data.slaveUnitConfig = {}
}
this.formData = data
}
/*this.$set(this.formData, "manner", this.openMannerList.map(v => {
return v.id
}))*/
},
resetForm() {
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
const valid = await this.$refs["addForm"].validate()
if (valid) {
this.subLoading = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + method, {
"data": JSON.stringify(this.formData),
"mannerList": JSON.stringify(this.formData.manner)
})
requestLaterFun(resp, () => {
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.subLoading = false
})
}
}
},
async created() {
this.allMannerList = await this.getDictByCode("proposal_manner");
this.reminderList = await getDictByCode("proposal_remind");
this.openMannerList = await getDictByCode("proposal_manner");
this.submitModeList = await getEnumOptions("ProposalSubmitMode")
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,314 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.dialog-footer .el-button {
padding: 12px 30px;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select slot="prepend" style="width: 80px;" v-model="pageForm.searchName">
<el-option label="名称" value="stateName"></el-option>
<el-option label="编码" value="stateCode"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAdd" icon="el-icon-plus" type="primary">添加状态</el-button>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<el-table :data="tableData" @sort-change="pageOrder" row-key="id" v-loading="tableLoading">
<el-table-column type="expand">
<template slot-scope="{row}">
<el-form style="margin-left: 108px">
<el-form-item label="关联角色">
{{row.roleNames}}
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" width="120px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="状态名称" prop="stateName"></el-table-column>
<el-table-column align="center" header-align="center" label="状态编码" prop="stateCode"></el-table-column>
<el-table-column align="center" header-align="center" label="状态颜色" prop="stateColor">
<template scope="{row}">
<el-tag :color="row.stateColor" :key="row.stateCode"
style="border-radius: 50%;height: 22px;"></el-tag>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="是否需要签字" prop="isSign">
<template scope="{row}">
<el-switch @change="switchChange(row)" active-color="#13ce66"
inactive-color="#ff4949" v-model="row.isSign">
</el-switch>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="是否开启" prop="stateColor">
<template scope="{row}">
<el-tag :key="row.isEnable" :type="row.isEnable?'':'danger'">
{{row.isEnable?'已开启':'已关闭'}}
</el-tag>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="关联菜单" prop="menuName"></el-table-column>
<el-table-column align="center" header-align="center" label="关联角色" prop="roleNames"
show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="前置节点" prop="prevState"
show-overflow-tooltip>
<template scope="{row}">
{{row.prevState && row.prevState.stateName}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="后置节点" prop="nextState"
show-overflow-tooltip>
<template scope="{row}">
{{row.nextState && row.nextState.stateName}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="120px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i><span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'edit',data:row}">
编辑
</el-dropdown-item>
<!-- <el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>-->
<el-dropdown-item :command="{type:'enable',data:row}">
{{row.isEnable?'关闭':'开启'}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
<el-dialog :visible.sync="dialogVisible" title="提案状态" width="50%">
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-form-item label="状态编码" prop="stateCode">
<el-input maxlength="4" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="请输入状态编码" v-model="formData.stateCode"></el-input>
</el-form-item>
<el-form-item label="状态名称" prop="stateName">
<el-input placeholder="请输入状态名称" v-model="formData.stateName"></el-input>
</el-form-item>
<el-form-item label="状态颜色" prop="stateColor">
<el-input placeholder="请输入状态颜色" v-model="formData.stateColor"></el-input>
</el-form-item>
<el-form-item label="是否需要签字" prop="isSign">
<el-radio-group v-model="formData.isSign">
<el-radio-button :label="true"></el-radio-button>
<el-radio-button :label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-switch active-color="#13ce66" inactive-color="#ff4949" v-model="formData.isEnable"></el-switch>
</el-form-item>
<el-form-item label="前置节点" prop="prevId">
<el-select clearable placeholder="请选择前置节点" v-model="formData.prevId">
<!-- :disabled="item.stateCode>=formData.stateCode"-->
<el-option :key="item.id"
:label="item.stateName"
:value="item.id"
v-for="item in allState"></el-option>
</el-select>
</el-form-item>
<el-form-item label="后置节点" prop="nextId">
<el-select clearable placeholder="请选择前置节点" v-model="formData.nextId">
<!-- :disabled="item.stateCode<=formData.stateCode"-->
<el-option :key="item.id"
:label="item.stateName"
:value="item.id"
v-for="item in allState"></el-option>
</el-select>
</el-form-item>
<el-form-item label="关联菜单" prop="menuId">
<el-select placeholder="请选择前置节点" v-model="formData.menuId">
<el-option :key="item.id"
:label="item.name"
:value="item.id"
v-for="item in proposalMenu"></el-option>
</el-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button :loading="subLoading" @click="operation" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
subLoading: false,
dialogVisible: false,
pageForm: {
searchName: "stateName",
pageSize: 20
},
formRules: {
stateCode: [{required: true, message: '请填写状态编码', trigger: ['blur', 'change']}],
stateName: [{required: true, message: '请填写状态名称', trigger: ['blur', 'change']}],
stateColor: [{required: true, message: '请填写状态颜色', trigger: ['blur', 'change']}],
isSign: [{required: true, message: '请选择是否需要签字', trigger: ['blur', 'change']}],
isEnable: [{required: true, message: '请选择是否启用', trigger: ['blur', 'change']}],
},
allState: [],
proposalMenu: []
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'edit') {
this.openEdit(data)
} else if (type === 'delete') {
this.doDelete(data.id)
} else if (type === 'enable') {
data.isEnable = !data.isEnable
this.switchChange(data)
}
},
openAdd() {
this.formData = {}
const newStateCode = this.tableData && this.tableData.length > 0 ? this.tableData[this.tableData.length - 1].stateCode + 100 : 100
this.$set(this.formData, "stateCode", newStateCode)
this.$set(this.formData, "stateColor", '#1D8CE0')
this.$set(this.formData, "isSign", false)
this.$set(this.formData, "isEnable", true)
this.$set(this.formData, "prevId", null)
this.$set(this.formData, "nextId", null)
this.resetForm()
},
openEdit(data) {
this.formData = JSON.parse(JSON.stringify(data))
this.resetForm()
},
resetForm() {
this.dialogVisible = true
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async switchChange(data) {
this.formData = data
const resp = await $.post(loc() + "/doEdit", {"data": JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
proposal.getProposalEnableStateCode()
proposal.getProposalNeedSignStateCode()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.pageData()
})
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
const valid = this.$refs["addForm"].validate
if (valid) {
this.subLoading = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const cloneFormData = clone(this.formData)
delete cloneFormData.prevState
delete cloneFormData.nextState
const resp = await $.post(loc() + '/doHandler', cloneFormData)
requestLaterFun(resp, () => {
this.dialogVisible = false
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
proposal.getProposalAllStateCode()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.subLoading = false
})
}
},
doDelete(id) {
let self = this
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const resp = await $.post(loc() + "/doDelete", {id})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
self.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
async listAll() {
const resp = await $.post(loc() + "/listAll")
if (resp.code === 0) {
this.allState = resp.data
}
},
async menuInProposal() {
const resp = await $.post(loc() + "/menuInProposal")
if (resp.code === 0) {
this.proposalMenu = resp.data
}
}
},
created() {
this.pageData();
this.listAll()
this.menuInProposal()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,180 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.dialog-footer .el-button {
padding: 12px 30px;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 80px;"
v-model="pageForm.searchName">
<el-option label="名称" value="typeName"></el-option>
<el-option label="编码" value="typeCode"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAdd" icon="el-icon-plus" type="primary">添加类型</el-button>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<el-table :data="tableData" @sort-change="pageOrder" row-key="id" style="width: 100%"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" width="120px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="类型编号"
prop="typeCode"></el-table-column>
<el-table-column align="center" header-align="center" label="类型名称"
prop="typeName"></el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="120px">
<template slot-scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'edit',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<el-dialog :close-on-click-modal="false" :title="title" :visible.sync="DialogVisible" width="40%">
<el-form :model="formData" :rules="formRules" label-width="100px"
ref="addForm">
<el-form-item label="类型编号" prop="typeCode">
<el-input maxlength="50" placeholder="类型编号" type="text" v-model="formData.typeCode"></el-input>
</el-form-item>
<el-form-item label="类型名称" prop="typeName">
<el-input maxlength="50" placeholder="请填写类型名称" type="text" v-model="formData.typeName"></el-input>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="DialogVisible = false">取 消</el-button>
<el-button :disabled="subDis" @click="operation" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
title: "",
subDis: false,
DialogVisible: false,
tabLoading: false,
pageForm: {
searchName: "typeName",
},
formRules: {
typeName: [{required: true, message: '必选', trigger: ['blur', 'change']}],
typeCode: [{required: true, message: '必选', trigger: ['blur', 'change']}],
},
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'edit') {
this.openEdit(data)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
openAdd() {
this.title = "添加类型"
this.formData = {}
this.DialogVisible = true;
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
openEdit(data) {
this.title = "编辑类型"
this.formData = data
this.DialogVisible = true;
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + method, {proposalType: JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.DialogVisible = false;
this.$notify.success({title: '成功', message: resp.msg});
this.pageData();
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
});
},
async doDelete(id) {
let self = this
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const resp = await $.get(loc() + "/doDelete", {id: id})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
self.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,453 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.dialog-footer .el-button {
padding: 12px 30px;
}
.el-tag {
border-radius: 50%;
height: 22px;
}
.el-transfer {
text-align: center;
}
.el-transfer-panel {
text-align: left;
width: 35%;
height: 400px;
}
.el-transfer-panel__list.is-filterable {
height: 300px;
}
.v-box .el-card__header {
padding: 5px 15px;
}
.v-tree-layout-left .v-tree {
width: 100%;
}
.v-tree-layout-left .custom-tree-node {
width: 90%;
position: relative;
}
.v-tree-layout-left .v-tree .v-node {
width: 100%;
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
<div id="app" v-cloak>
<guava>
<tree-layout>
<template #tree>
<div style="padding: 15px;">
<el-input placeholder="输入单位名称进行过滤" v-model="filterText"></el-input>
</div>
<el-tree :data="treeData" :filter-node-method="filterNode" :props="defaultProps"
@node-click="handleNodeClick" accordion class="filter-tree"
default-expand-all highlight-current ref="tree">
<div class="custom-tree-node" slot-scope="{ node, data }">
<div class="v-node" style="font-size: 16px;" v-if="node.level==1">
<i class="el-icon-office-building"></i>&nbsp;{{ data.unitName }}
</div>
<div class="v-node" style="font-size: 14px" v-if="node.level==2">
<i class="el-icon-s-help" v-if="checkData.unitName==data.unitName"></i>
<i class="el-icon-help" v-else></i>
&emsp;{{ data.unitName }}
</div>
</div>
</el-tree>
</template>
<template>
<div style="width: 100%;" v-if="node.level==1">
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="根据承办单位名称进行查询"
v-model="pageForm.unitName">
</el-input>
</div>
<div class="btn-group tool-button">
<el-button @click="doSearch()" icon="el-icon-search" slot="append"
type="primary"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAdd" type="primary"><i class="ti-plus"></i>增补承办单位</el-button>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-table :data="tableData" height="722" highlight-current-row ref="underTakeTable">
<el-table-column label="序号" width="60px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="承办单位编码" prop="unitCode"
width="120px"></el-table-column>
<el-table-column align="center" header-align="center" label="承办单位名称" prop="unitName"
width="200px"></el-table-column>
<el-table-column align="center" header-align="center" label="分管校领导及联系电话"
prop="leader" show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="负责人及联系电话"
prop="principal" show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="是否启用" prop="isEnable"
width="100px">
<template scope="{row}">
<el-switch @change="switchChange(row)" active-color="#13ce66"
inactive-color="#ff4949" v-model="row.isEnable">
</el-switch>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="120px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i><span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'leader',data:row}">设置分管校领导
</el-dropdown-item>
<el-dropdown-item :command="{type:'principal',data:row}">设置负责人
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',data:row}">编辑</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}" v-if="!row.isEnable">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<div style="padding: 5px 10px" v-if="node.level==2">
<el-tabs @tab-click="handleTabClick" type="card" v-model="activeName">
<el-tab-pane label="分管校领导" name="one"></el-tab-pane>
<el-tab-pane label="负责人" name="two"></el-tab-pane>
</el-tabs>
<el-table :data="adminTableData" highlight-current-row size="small" style="width: 100%;">
<el-table-column label="序号" width="60px">
<template scope="scope"><span>{{scope.$index+1}}</span></template>
</el-table-column>
<el-table-column align="center" label="职工号" prop="loginname"></el-table-column>
<el-table-column align="center" label="姓名" prop="username"></el-table-column>
<el-table-column align="center" label="性别" prop="sex"></el-table-column>
<el-table-column align="center" label="联系方式" prop="mobile"></el-table-column>
<el-table-column align="center" label="操作">
<template scope="{row}">
<el-button @click="removeAdmin(row)" circle icon="el-icon-delete" plain size="mini"
type="danger">
</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="text-align: right;margin-top: 20px">
<span style="color: red">{{butTitle}}</span>
<el-button @click="openAdmin(adminPageForm,adminPageForm.flag)" circle size="medium"
type="primary">
<i class="el-icon-plus"></i>
</el-button>
</el-row>
</div>
</template>
</tree-layout>
</guava>
<el-dialog :visible.sync="dialogVisible" title="增补承办单位" width="50%">
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-form-item label="承办单位编码" prop="unitCode">
<el-input placeholder="请输入承办单位编码" v-model="formData.unitCode"></el-input>
</el-form-item>
<el-form-item label="承办单位名称" prop="unitName">
<el-input placeholder="请输入承办单位名称" v-model="formData.unitName"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio-button :label="true"></el-radio-button>
<el-radio-button :label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button :loading="subLoading" @click="operation" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog :title="title" :visible.sync="adminDialogVisible" width="55%">
<div style="width: 100%;">
<el-transfer :data="adminData" :filter-method="adminFilterMethod"
:props="{key: 'id',label: 'name'}"
:titles="['单位成员', '管理员']"
filterable
v-model="adminFormData.adminValue">
</el-transfer>
</div>
<span class="dialog-footer" slot="footer">
<el-button @click="adminDialogVisible = false">取 消</el-button>
<el-button :loading="adminSubLoading" @click="doAdmin" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'tree-layout': httpVueLoader('/components/plugins/TreeLayout.vue')
},
data() {
return {
title: '',
butTitle: '添加分管校领导',
filterText: '',
activeName: 'one',
subLoading: false,
dialogVisible: false,
treeData: [],
node: {
level: 1
},
formData: {
isEnable: true
},
checkData: {},
adminSubLoading: false,
adminDialogVisible: false,
adminFormData: {
adminValue: [],
flag: true
},
adminData: [],
adminTableData: [],
adminPageForm: {
flag: true
},
defaultProps: {
children: 'childrens',
label: 'unitName',
disabled: 'disabled'
},
formRules: {
unitCode: [{required: true, message: '请输入承办单位编码', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请输入承办单位名称', trigger: ['blur', 'change']}],
isEnable: [{required: true, message: '请选择是否启用', trigger: ['blur', 'change']}],
},
}
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'leader') {
this.title = '设置分管校领导'
this.openAdmin(data, true)
} else if (type === 'principal') {
this.title = '设置负责人'
this.openAdmin(data, false)
} else if (type === 'edit') {
this.openEdit(data)
} else if (type === 'delete') {
this.doDelete(data.id)
}
},
filterNode(value, data) {
if (!value) return true;
return data.unitName.indexOf(value) !== -1
return false
},
adminFilterMethod(query, item) {
return item.username.indexOf(query) > -1;
},
handleNodeClick(data, node) {
this.node = node
this.checkData = data
this.adminPageForm.id = data.id
this.adminPageForm.unitCode = data.unitCode
this.adminPageForm.flag = this.activeName === 'one'
this.adminPageData()
},
handleTabClick(tab) {
this.butTitle = tab.name === 'one' ? '添加分管校领导' : '添加负责人'
this.adminPageForm.flag = tab.name === 'one'
this.adminPageData()
},
removeAdmin(row) {
this.$confirm('确定要移除该管理员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const resp = await $.post(loc() + "/removeAdmin", {
unitId: this.adminPageForm.id,
userId: row.id,
roleId: row.roleid
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.adminPageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
async adminPageData() {
const resp = await $.post(loc() + "/adminPageData", this.adminPageForm)
requestLaterFun(resp, () => {
this.adminTableData = resp.data;
}, () => {
console.log(resp)
this.$notify.error({title: '失败', message: resp.msg});
})
},
openAdd() {
this.formData = {}
this.$set(this.formData, "isEnable", true)
this.resetForm()
},
openEdit(data) {
this.formData = data
this.resetForm()
},
async openAdmin(row, flag) {
const {id, unitCode} = row
this.adminFormData.unitId = id
this.adminFormData.flag = flag
const {data} = await $.get(loc() + "/findUserAndAdmin", {id, unitCode, flag})
if (data) {
this.adminData = data.data
this.adminFormData.adminValue = data.value.map(v => {
return v.id
})
}
this.adminDialogVisible = true
},
async doAdmin() {
this.adminSubLoading = true
const data = clone(this.adminFormData)
data.adminValue = JSON.stringify(data.adminValue)
const resp = await $.post(loc() + "/setAdmin", data)
requestLaterFun(resp, () => {
this.adminDialogVisible = false
this.pageData()
this.adminPageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.adminSubLoading = false
})
},
resetForm() {
this.dialogVisible = true
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async switchChange(data) {
this.formData = data
const resp = await $.post(loc() + "/doEdit", {"data": JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.undertakeUnitTree()
})
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
this.subLoading = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + method, {"data": JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.dialogVisible = false
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.subLoading = false
})
}
});
},
doDelete(id) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {
const resp = await $.post(loc() + "/doDelete", {id})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.undertakeUnitTree()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
async undertakeUnitTree() {
const {data} = await $.get(loc() + "/undertakeUnitTree")
this.treeData = [data]
this.pageData()
}
},
async created() {
await this.undertakeUnitTree()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,291 @@
<!--#
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>
<!--# include("/platform/proposal/include/searchCnd.html"){}#-->
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
<template #func>
<el-button @click="exportAllProposal" size="small" type="primary">导出立案汇总表</el-button>
</template>
</table-tool>
<el-table :data="tableData" :header-cell-style="{background:'#FAFAFA'}" @sort-change="pageOrder" border
row-key="id" stripe style="width: 100%"
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"
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'">
{{resultName?resultName:'暂无' }}
</template>
<template scope="{row:{pruMaster}}" v-else-if="column.prop==='pruMaster'">
{{pruMaster?pruMaster:'暂无' }}
</template>
<template scope="{row:{pruSlave}}" v-else-if="column.prop==='pruSlave'">
{{pruSlave?pruSlave:'暂无' }}
</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>
<!-- <proposal-table :loading="tableLoading" :page="pageForm" :data="tableData" @order="pageOrder"
@view="openView">
<template #column>
<el-table-column label="提案结果" prop="resultName" align="center" header-align="center"
sortable>
<template scope="{row:{resultName}}">
<span>{{ resultName?resultName:'暂无' }}</span>
</template>
</el-table-column>
<el-table-column label="主办单位" prop="pruMaster" align="center" header-align="center"
sortable>
<template scope="{row:{pruMaster}}">
<span>{{ pruMaster?pruMaster:'暂无' }}</span>
</template>
</el-table-column>
<el-table-column label="协办单位" prop="pruSlave" align="center" header-align="center"
sortable>
<template scope="{row:{pruSlave}}">
<span>{{ pruSlave?pruSlave:'暂无' }}</span>
</template>
</el-table-column>
</template>
</proposal-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 {
resultOptions: [],
determineTypeOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
undertakeOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
unionId: '',
unitId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
},
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: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
// {prop: '1', label: '是否立案'},
// {prop: '2', label: '重点提案', checked: 0},
{prop: 'resultName', label: '立案结果'},
{prop: 'pruMasterCode', label: '主办单位编码', sortable: true},
{prop: 'pruMaster', label: '主办单位'},
{prop: 'pruSlave', label: '协办单位'},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
exportAllProposal() {
const proposalTypes = JSON.stringify(this.pageForm.proposalTypes)
const proposalResult = JSON.stringify(this.pageForm.proposalResult)
const searchName2 = this.pageForm.searchName2
const searchKeyword2 = this.pageForm.searchKeyword2
const stateCode = this.pageForm.stateCode
const searchKeyword = this.pageForm.searchKeyword
const searchName = this.pageForm.searchName
const delegationId = this.pageForm.delegationId
const unionId = this.pageForm.unionId
const unitId = this.pageForm.unitId
const meetingId = this.pageForm.meetingId
let props = {}
this.tableColumns.forEach(v => {
props[v.prop] = v.label
})
window.open(loc() + "/exportAllProposal?proposalTypes=" + proposalTypes +
"&proposalResult=" + proposalResult +
"&searchName2=" + searchName2 +
"&searchKeyword2=" + searchKeyword2 +
"&stateCode=" + stateCode +
"&searchKeyword=" + searchKeyword +
"&searchName=" + searchName +
"&delegationId=" + delegationId +
"&unionId=" + unionId +
"&unitId=" + unitId +
"&meetingId=" + meetingId +
"&props=" + JSON.stringify(props))
},
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
},
async meetingChange(val) {
this.pageForm.delegationId = ''
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,204 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card class="mb20" shadow="never">
<div class="d-search-item btn-group tool-button">
<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>
</div>
<div class="d-search-item btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
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 class="d-search-item btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容" v-model="pageForm.username">
<template slot="prepend">提案人</template>
</el-input>
</div>
<div class="d-search-item btn-group tool-button">
<el-select @change="leaderChange" clearable filterable placeholder="请选择分管校领导"
v-model="pageForm.leaderId">
<el-option
:key="i.id"
:label="i.username"
:value="i.id"
v-for="i in leaderList"></el-option>
</el-select>
</div>
<div class="btn-group tool-button" style="margin-left: 10px">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div style="position: absolute;right: 20px;top: 20px;">
<el-button @click="oneProposalExport" type="primary">导出</el-button>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="提案信息" ref="tableTool">
</table-tool>
<el-table :data="tableData" :key="tableKey" :size="tableSize"
:tree-props="{children: 'children'}"
@sort-change="pageOrder"
row-key="id"
v-loading="tableLoading">
<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"
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}" v-else-if="column.prop=='underTakeTypeName'">
<span>{{row.underTakeTypeName}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='secretary'">
<span>{{row.secretaryUserName}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='secretaryAuditInfo'">
<span class="text-primary" v-if="row.secretaryAuditInfo">已审批</span>
<span class="text-danger" v-else>未审批</span>
</template>
<template scope="{row}" v-else-if="column.prop=='leaderUserName'">
<span>{{row.leaderUserName}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='isAuditByLeaderSpla'">
<span class="text-primary" v-if="row.isAuditByLeaderSpla">已审批</span>
<span class="text-danger" v-else>未审批</span>
</template>
<template scope="{row}" v-else-if="column.prop=='isAuditByLeaderSpdf'">
<template v-if="row.resultCode==='determine'">
<span class="text-primary" v-if="row.isAuditByLeaderSpdf">已审批</span>
<span class="text-danger" v-else>未审批</span>
</template>
<template v-else>
<span class="text-muted">无需审批</span>
</template>
</template>
<!-- <template scope="{row}" v-else-if="column.prop=='isBranchLeaderAuditCase'">-->
<!-- <span :class="[row.branchLeaderReadUserName?'text-primary':'']">{{row.branchLeaderReadUserName?'已审批立案':'未审批立案'}}</span>-->
<!-- </template>-->
<!-- <template scope="{row}" v-else-if="column.prop=='isSecretaryAuditCase'">-->
<!-- <span :class="[row.secretaryReadUserName?'text-primary':'']">{{row.secretaryReadUserName?'已审批立案':'未审批立案'}}</span>-->
<!-- </template>-->
<!-- <template scope="{row}" v-else-if="column.prop=='leaderId'">-->
<!-- <span :class="[row.leaderId?'text-primary':'']">{{row.leaderId?'已审批答复':'未审批答复'}}</span>-->
<!-- </template>-->
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
meetingOptions: [],
tableLoading: false,
leaderList: [],
pageForm: {
searchName: "proposalName",
leaderId: '',
username: ''
},
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, checked: 0},
{prop: 'unitName', label: '承办单位', sortable: true},
{prop: 'underTakeTypeName', label: '承办类型', sortable: true},
{prop: 'secretary', label: '校长、书记', sortable: true},
{prop: 'secretaryAuditInfo', label: '校长、书记审批', sortable: true},
{prop: 'leaderUserName', label: '分管校领导', sortable: true},
{prop: 'isAuditByLeaderSpla', label: '审批立案', sortable: true},
{prop: 'isAuditByLeaderSpdf', label: '审批答复', sortable: true}
],
}
},
methods: {
meetingChange() {
this.pageForm.pageNumber = 1
this.pageData()
},
leaderChange() {
this.pageForm.pageNumber = 1
this.pageData()
},
oneProposalExport() {
const {meetingId, searchKeyword, searchName, username, leaderId} = this.pageForm
window.open(loc() + "/exportAllProposal?meetingId=" + meetingId
+ "&searchKeyword=" + searchKeyword
+ "&searchName=" + searchName
+ "&username=" + username
+ "&leaderId=" + leaderId
)
},
async getLeaderList() {
const resp_data = await $.post(loc() + '/getLeaderList', this.pageForm)
this.leaderList = resp_data.data
},
async initTableColumns() {
// if (await proposal.getProposalIsNodeState(proposal.BRANCHLEADERREAD)) {
// this.tableColumns.splice(5, 0, {prop: 'branchLeaderReadUserName', label: '分管校领导', sortable: true},
// {prop: 'isBranchLeaderAuditCase', label: '审批立案', sortable: true})
// }
// if (await proposal.getProposalIsNodeState(proposal.PRINCIPALREAD)) {
// this.tableColumns.splice(5, 0, {prop: 'secretaryReadUserName', label: '校长、书记', sortable: true},
// {prop: 'isSecretaryAuditCase', label: '审批立案', sortable: true},)
// }
// //动态增加列 调用子组件生成列的方法重新生成
// this.$refs['tableTool'].getColumns()
}
},
async created() {
this.meetingOptions = await getAllJdh()
this.pageForm.meetingId = this.meetingOptions.length ? this.meetingOptions[0].id : ''
await this.getLeaderList()
this.pageData()
this.initTableColumns()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,227 @@
<!--#
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>
<!--# 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>
</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 {
resultOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
undertakeOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
},
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: '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},
],
}
},
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,260 @@
<!--#
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>
<!--# include("/platform/proposal/include/searchCnd.html"){}#-->
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
<template #func>
<el-button @click="exportByCnd" type="primary">按条件导出</el-button>
</template>
</table-tool>
<el-row>
<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:{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}" v-else-if="column.prop==='brief'">
<span>{{removeHTMLTag(row.brief)}}</span>
</template>
<template scope="{row}" v-else-if="column.prop==='measures'">
<span>{{removeHTMLTag(row.measures)}}</span>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
<!-- <proposal-table :loading="tableLoading" :page="pageForm" :data="tableData" @order="pageOrder"-->
<!-- @view="openView">-->
<!-- <template #column>-->
<!-- <el-table-column label="提案结果" prop="resultName" align="center" header-align="center"-->
<!-- sortable>-->
<!-- <template scope="{row:{resultName}}">-->
<!-- <span>{{ resultName?resultName:'暂无' }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="主办单位" prop="pruMaster" align="center" header-align="center"-->
<!-- sortable>-->
<!-- <template scope="{row:{pruMaster}}">-->
<!-- <span>{{ pruMaster?pruMaster:'暂无' }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="协办单位" prop="pruSlave" align="center" header-align="center"-->
<!-- sortable>-->
<!-- <template scope="{row:{pruSlave}}">-->
<!-- <span>{{ pruSlave?pruSlave:'暂无' }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作" header-align="center" label="操作"-->
<!-- fixed="right" width="130px">-->
<!-- <template scope="{row}">-->
<!-- <el-button size="mini" icon="el-icon-printer" type="primary"-->
<!-- @click="oneProposalExport(row.id)">导出提案信息-->
<!-- </el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- </template>-->
<!-- </proposal-table>-->
</el-row>
</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: [],
undertakeOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
},
tableColumns: [
{prop: 'oldProposalCode', label: '草案编号', width: "120", checked: 0},
{prop: 'proposalCode', label: '提案编号', sortable: true},
{prop: 'proposalName', label: '提案名称'},
{prop: 'username', label: '提案人'},
{prop: 'typeCode', label: '提案类型编码', sortable: true},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'brief', label: '案由', checked: 0},
{prop: 'measures', label: '建议措施', checked: 0},
{prop: 'meetingName', label: '教代会届次'},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态'},
{prop: 'resultName', label: '立案结果', sortable: true},
{prop: 'pruMaster', label: '主办单位', sortable: true},
{prop: 'pruMasterCode', label: '主办单位编码', sortable: true, checked: 0},
{prop: 'pruSlave', label: '协办单位', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
exportByCnd() {
window.open(loc() + '/exportByCnd?cnd=' + JSON.stringify(this.pageForm) + '&tableColumns=' + JSON.stringify(this.tableColumns))
},
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,255 @@
<!--#
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>
<!--# include("/platform/proposal/include/searchCnd.html"){}#-->
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
<template #func>
<el-button @click="exportAllProposal" type="primary">导出全部提案</el-button>
</template>
</table-tool>
<el-table :data="tableData" :header-cell-style="{background:'#FAFAFA'}"
@sort-change="pageOrder" row-key="id" style="width: 100%"
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"
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'">
{{resultName?resultName:'暂无' }}
</template>
<template scope="{row:{pruMaster}}" v-else-if="column.prop==='pruMaster'">
{{pruMaster?pruMaster:'暂未分配' }}
</template>
<template scope="{row:{pruSlave}}" v-else-if="column.prop==='pruSlave'">
{{pruSlave?pruSlave:'暂未分配' }}
</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 {
resultOptions: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
undertakeOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
unionId: '',
unitId: '',
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
delegationId: '',
proposalResult: [],
proposalTypes: [],
proposalDetermineTypes: []
},
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: '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},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
exportAllProposal() {
const proposalTypes = JSON.stringify(this.pageForm.proposalTypes)
const proposalResult = JSON.stringify(this.pageForm.proposalResult)
const searchName2 = this.pageForm.searchName2
const searchKeyword2 = this.pageForm.searchKeyword2
const stateCode = this.pageForm.stateCode
const searchKeyword = this.pageForm.searchKeyword
const searchName = this.pageForm.searchName
const delegationId = this.pageForm.delegationId
const unionId = this.pageForm.unionId
const unitId = this.pageForm.unitId
const meetingId = this.pageForm.meetingId
window.location.href = loc() + "/exportAllProposal?proposalTypes=" + proposalTypes +
"&proposalResult=" + proposalResult +
"&searchName2=" + searchName2 +
"&searchKeyword2=" + searchKeyword2 +
"&stateCode=" + stateCode +
"&searchKeyword=" + searchKeyword +
"&searchName=" + searchName +
"&delegationId=" + delegationId +
"&unionId=" + unionId +
"&unitId=" + unitId +
"&meetingId=" + meetingId
},
oneProposalExport(id) {
window.location.href = "/platform/proposal/statistics/summary/oneProposalExport?proposalId=" + id
},
async meetingChange(val) {
this.pageForm.delegationId = ''
this.delegationOptions = await 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 getOpenProposalState()
this.typeOptions = await getProposalType()
this.resultOptions = await getDictOptions("proposal_result")
this.determineTypeOptions = await getDictOptions("proposal_determine_type")
this.delegationOptions = await 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,12 @@
const proposal_include = {
tableColumns: [
{prop: 'proposalCode', label: '提案编号'},
{prop: 'proposalName', label: '提案名称'},
{prop: 'username', label: '提案人'},
{prop: 'typeName', label: '提案类型'},
{prop: 'meetingName', label: '届次'},
{prop: 'delegationName', label: '所属代表团'},
{prop: 'stateName', label: '提案状态'}
]
}
@@ -0,0 +1,160 @@
<el-card shadow="never">
<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-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"
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-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-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-col>
</el-row>
</el-card>
@@ -0,0 +1,214 @@
<!--#
layout("/layouts/platform.html"){
#-->
<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" shadow="never">
<table-tool :app="this" label="提案列表"></table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="replyId">
<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"
>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openEdit(row)" 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>
<template #edit>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="form">
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="代表姓名" prop="username">
<el-input disabled type="text" v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提案时间" prop="createTime">
<el-input disabled type="text" v-model="formData.createTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案名称" prop="proposalName">
<el-input maxlength="100" placeholder="提案名称"
v-model="formData.proposalName"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="撰写提案方式" prop="mannerName">
<el-input disabled v-model="formData.mannerName"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item class="is-required" label="案&emsp;&emsp;由" prop="brief">
<div id="briefEditor"></div>
</el-form-item>
<el-form-item class="is-required" label="建议措施" prop="measures">
<div id="measuresEditor"></div>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="$refs.guava.index()">取消</el-button>
<el-button @click="doConfirm" type="primary">确定</el-button>
</el-row>
</template>
</guava>
</div>
<script>
let briefEditor, measuresEditor = null
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
const validBrief = (rule, value, callback) => {
if (!this.formData.brief || !removeHTMLTag(this.formData.brief)) {
callback(new Error('请填写提案内容、案由和案据'));
} else if (removeHTMLTag(this.formData.brief).length < this.config.words) {
callback(new Error('提案内容至少需要' + this.config.words + '字'));
// callback();
} else {
callback();
}
};
const validMeasures = (rule, value, callback) => {
if (!this.formData.measures || !removeHTMLTag(this.formData.measures)) {
callback(new Error('请填写提案实施的可行性建议'));
} else {
callback();
}
};
return {
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: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}
],
pageForm: {searchName: 'proposalName', meetingId: ''},
formRules: {
proposalName: [{required: true, message: '请填写提案名称', trigger: ['blur', 'change']}],
brief: [{validator: validBrief, trigger: ['blur', 'change']}],
measures: [{validator: validMeasures, trigger: ['blur', 'change']}],
},
formData: {},
config: {}
}
},
methods: {
searchFinished() {
this.pageData()
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openEdit(row) {
this.formData = clone(row)
this.$refs.guava.edit()
this.$nextTick(() => {
$("#briefEditor").html("")
$("#measuresEditor").html("")
briefEditor = new wangEditor("#briefEditor")
briefEditor.config.onchange = (html) => {
this.formData.brief = html
}
measuresEditor = new wangEditor("#measuresEditor")
measuresEditor.config.onchange = (html) => {
this.formData.measures = html
}
briefEditor.create()
measuresEditor.create()
briefEditor.txt.html(row.brief)
measuresEditor.txt.html(row.measures)
})
},
async doConfirm() {
try {
const valid = await this.$refs['form'].validate()
if (valid) {
const param = {
id: this.formData.id,
proposalName: this.formData.proposalName,
brief: this.formData.brief,
measures: this.formData.measures
}
const resp = await $.post(loc() + '/updateBasicInfo', param)
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
this.$refs.guava.index()
} else {
this.notifyError(resp.msg)
}
}
} catch (e) {
console.log(e)
}
}
},
async created() {
this.config = await proposal.getProposalConfig()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,252 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="修改反馈评价"></table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="replyId">
<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"
>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openEdit(row)" 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>
<el-dialog :close-on-click-modal="false" :visible.sync="feedbackDialog" custom-class="ViewDialogClass"
title="修改反馈评价" v-loading="true" width="70%">
<el-table :data="feedbackData" max-height="300">
<el-table-column label="反馈人" type="username">
<template scope="{row}">
{{row.username}}{{row.loginname}}
</template>
</el-table-column>
<el-table-column label="反馈时间" prop="feedbackTime"></el-table-column>
<el-table-column label="反馈次数" prop="feedbackNumber"></el-table-column>
<el-table-column label="反馈结果" prop="feedbackResult"></el-table-column>
<el-table-column label="反馈意见" prop="proposalName" show-overflow-tooltip>
<template scope="{row}">
<sapn v-html="row.feedbackOpinion"></sapn>
</template>
</el-table-column>
<!-- <el-table-column label="操作">-->
<!-- <template scope="{row}">-->
<!-- <el-button size="mini" @click="choiceFeedback(row)" type="primary">选择反馈</el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
<el-form :model="formData" :rules="formRules" class="mt20" label-width="120px" ref="addForm">
<el-form-item label="承办满意度" prop="feedbackCode">
<el-radio-group v-model="formData.feedbackCode">
<el-radio :label="item.code" border v-for="item in feedbackOptions">{{item.name}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item class="is-required" label="反馈意见" prop="feedbackOpinion">
<div id="feedbackEditor"></div>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="feedbackDialog=false">取 消</el-button>
<el-button @click="doEdit" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
let E = window.wangEditor
let feedbackEditor = null
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
let replyContentBrief = (rule, value, callback) => {
if (!this.formData.feedbackOpinion || !dd3s.html2txt(this.formData.feedbackOpinion)) {
callback(new Error('请填写反馈意见'));
} else {
callback();
}
};
return {
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: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'feedBackResultName', label: '反馈结果', sortable: true},
],
feedbackOpinion: "",
feedbackOptions: [],
feedbackData: [],
feedbackDialog: false,
formData: {
id: "",
feedbackCode: ""
},
pageForm: {searchName: 'proposalName'},
formRules: {
feedbackOpinion: [{validator: replyContentBrief, trigger: ['blur', 'change']}],
feedbackCode: [{required: true, message: '请选择承办满意度', trigger: ['blur', 'change']}],
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'edit') {
this.openEdit(data)
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
choiceFeedback(row) {
this.$set(this.formData, "feedbackCode", row.feedbackCode)
this.$set(this.formData, "id", row.id)
this.$set(this.formData, "proposalId", row.proposalId)
feedbackEditor.txt.html(row.feedbackOpinion)
},
async openEdit(row) {
const {data} = await $.post(loc() + "/getFeedbackData", {id: row.id})
this.feedbackData = data
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
this.$nextTick(() => {
$("#feedbackEditor").html("")
feedbackEditor = new E("#feedbackEditor")
feedbackEditor.config.onchange = (html) => {
this.formData.feedbackOpinion = html
}
feedbackEditor.create()
//自动选择最新一条的反馈记录并赋值
if (this.feedbackData && this.feedbackData.length > 0) {
this.choiceFeedback(this.feedbackData[0])
}
})
this.feedbackDialog = true
},
async doEdit() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
if (this.formData.id == "") {
this.$notify.warning({title: '警告', message: '请先选择需要修改的反馈评价'});
return
}
const confirm = await this.$confirm('您是否确定修改反馈评价?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doEdit", {
id: this.formData.id,
feedbackCode: this.formData.feedbackCode,
feedbackOpinion: this.formData.feedbackOpinion,
})
requestLaterFun(resp, async () => {
const {data} = await $.post(loc() + "/getFeedbackData", {id: this.formData.proposalId})
this.feedbackData = data
this.$refs['addForm'].resetFields()
feedbackEditor.txt.clear()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.feedbackDialog = false
this.pageData()
})
}
}
});
}
},
async created() {
setTimeout(() => {
this.pageData()
}, 1000)
this.feedbackOptions = await getDictByCode("proposal_feedback")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,170 @@
<!--#
layout("/layouts/platform.html"){
#-->
<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" shadow="never">
<table-tool :app="this" label="提案列表"></table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="replyId">
<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"
>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openEdit(row)" 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>
<el-dialog
:close-on-click-modal="false"
:visible.sync="dialogVisible"
title="修改提案状态"
width="50%">
<el-form>
<vi-title title="修改状态"></vi-title>
<el-form-item label="">
<el-radio border label="100" v-model="stateCode">未提交</el-radio>
<el-radio border label="150" v-model="stateCode">邀请附议人</el-radio>
<el-radio border label="200" v-model="stateCode">待团长审核</el-radio>
<el-radio border label="250" v-model="stateCode">预审核</el-radio>
</el-form-item>
<vi-title title="是否删除审核信息或附议人信息"></vi-title>
<el-form-item label="">
<el-radio border label="true" v-model="isDelete"></el-radio>
<el-radio border label="false" v-model="isDelete"></el-radio>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button @click="doConfirm" type="primary">确 定</el-button>
</span>
</el-dialog>
</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 {
id: "",
stateCode: "",
oldStateCode: "",
isDelete: "false",
dialogVisible: false,
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: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}
],
pageForm: {searchName: 'proposalName', meetingId: ''},
formData: {},
}
},
methods: {
searchFinished() {
this.pageData()
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openEdit(row) {
this.id = row.id
this.stateCode = row.stateCode.toString()
this.oldStateCode = row.stateCode.toString()
this.dialogVisible = true
},
async doConfirm() {
let aa = ""
if (this.oldStateCode === this.stateCode && this.isDelete === "true") {
aa = "您的提案状态并没有修改,确定只删除审核记录和附议人吗?"
} else if (this.oldStateCode === this.stateCode) {
aa = "您的提案状态并没有修改,确定要修改吗?"
} else if (this.oldStateCode !== this.stateCode && this.isDelete === "true") {
aa = "您确定要修改状态并删除审核记录和附议人吗?"
} else {
aa = "您确定要修改吗?"
}
const confirm = await this.$confirm(aa, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const param = {
id: this.id,
stateCode: this.stateCode,
isDelete: this.isDelete,
}
const resp = await $.post(loc() + '/doConfirm', param)
if (resp.code === 0) {
this.isDelete = "false"
this.notifySuccess(resp.msg)
this.doSearch()
this.dialogVisible = false
} else {
this.notifyError(resp.msg)
}
}
}
},
async created() {
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,177 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</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" shadow="never">
<table-tool :app="this" label="提案重新归类"></table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="replyId">
<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"
>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openEdit(row)" 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>
<el-dialog :close-on-click-modal="false" :visible.sync="typeDialog" custom-class="ViewDialogClass"
title="修改提案类型" v-loading="true" width="40%">
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-form-item label="原类型" prop="username">
<el-input disabled type="text" v-model="formData.typeName"></el-input>
</el-form-item>
<el-form-item label="更改类型" prop="typeId">
<el-select clearable filterable placeholder="提案类型" v-model="formData.typeId">
<el-option
:key="item.id"
:label="item.typeName"
:value="item.id"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="typeDialog=false">取 消</el-button>
<el-button @click="doEdit" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
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: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}
],
typeDialog: false,
typeOptions: [],
pageForm: {searchName: 'proposalName', meetingId: ''},
formRules: {
typeId: [{required: true, message: '请选择提案类型', trigger: ['blur', 'change']}],
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'edit') {
this.openEdit(data)
}
},
typeChange(val) {
this.formData.typeId = val
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openEdit(row) {
this.formData.id = row.id
this.formData.typeName = row.typeName
this.typeDialog = true
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async doEdit() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/reType", this.formData)
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.typeDialog = false
})
}
});
},
searchFinished() {
this.pageData()
}
},
async created() {
this.typeOptions = await proposal.getProposalType()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,280 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="修改立案结果">
<template #tips>
<span class="text-primary ml10">
(本次变更只针对于办理答复阶段的提案)
</span>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="replyId">
<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"
>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openEdit(row)" 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>
<el-dialog :close-on-click-modal="false" :visible.sync="resultCodeDialog " title="修改立案结果" width="40%">
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-form-item label="立案结果" prop="resultCode">
<el-radio-group @change="resultCodeChange" v-model="formData.resultCode">
<el-radio :label="item.code" border v-for="item in resultOptions">
{{item.name}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="立案类型" prop="determineTypeCode" v-if="formData.resultCode==='determine'">
<el-radio-group v-model="formData.determineTypeCode">
<el-radio :label="item.code" border v-for="item in determineType">
{{item.name}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="理由列表" prop="noFilingReason" v-if="formData.resultCode==='notGive'">
<el-select @change="(v)=>formData.opinion=v" clearable filterable placeholder="请选择理由列表"
v-model="formData.noFilingReason">
<el-option :key="item"
:label="item"
:value="item"
v-for="item in noFilingReason">
</el-option>
</el-select>
</el-form-item>
<div v-if="['determine','opinion'].includes(formData.resultCode)">
<el-form-item label="主办单位" prop="hostUnit">
<el-select clearable filterable placeholder="请选择主办单位" v-model="formData.hostUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="协办单位" prop="helpUnit">
<el-select clearable filterable multiple placeholder="请选择协办单位"
v-model="formData.helpUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</div>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="resultCodeDialog=false">取 消</el-button>
<el-button @click="doEdit" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
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: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'resultName', label: '立案结果', sortable: true},
],
config: {},
resultCodeDialog: false,
noFilingReason: [],
resultOptions: [],
determineType: [],
unitOptions: [],
pageForm: {searchName: 'proposalName'},
formRules: {
resultCode: [{required: true, message: '请选择立案结果', trigger: ['blur', 'change']}],
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
hostUnit: [{required: true, message: '请选择主办单位', trigger: ['blur', 'change']}],
determineTypeCode: [{required: true, message: '请选择', trigger: ['blur', 'change']}],
},
formData: {
oldResultCode: '',
resultCode: '',
noFilingReason: '',
determineTypeCode: '',
opinion: '',
hostUnit: '',
helpUnit: []
}
}
},
methods: {
resultCodeChange(val) {
// this.formData.hostUnit = null
// this.formData.helpUnit = []
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openEdit(row) {
this.formData = {
oldResultCode: '',
resultCode: '',
noFilingReason: '',
determineTypeCode: '',
opinion: '',
hostUnit: '',
helpUnit: []
}
this.formData.id = row.id
this.formData.resultCode = row.resultCode
this.formData.oldResultCode = row.resultCode
this.formData.determineTypeCode = row.determineTypeCode
this.resultCodeDialog = true
},
async doEdit() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
if (this.resultCode === this.formData.resultCode) {
this.$notify.warning({title: '警告', message: '您修改的立案状态和原先的状态一致!请检查确认后提交'});
return
}
let msg = ''
switch (this.formData.resultCode) {
case 'notGive': {
msg = '本提案立案结果修改为不予立案,系统自动完结,同时不在本列表中显示'
break
}
default: {
msg = '您是否确定修改立案结果,修改后将重新走流程'
}
}
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doEdit", {
id: this.formData.id,
resultCode: this.formData.resultCode,
determineTypeCode: this.formData.determineTypeCode,
opinion: this.formData.opinion,
hostUnit: this.formData.hostUnit,
helpUnits: JSON.stringify(this.formData.helpUnit),
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.resultCodeDialog = false
})
}
}
});
}
},
mounted() {
// this.pageData()
console.log('父组件mounted执行了' + Date.now())
},
async created() {
console.log('父组件created执行了' + Date.now())
// this.pageData()
setTimeout(() => {
this.pageData()
}, 1000)
this.resultOptions = await getDictByCode("proposal_result")
this.determineType = await getDictByCode("proposal_determine_type")
this.unitOptions = await proposal.getProposalUndertake()
this.config = await proposal.getProposalConfig()
this.noFilingReason = this.config.noFilingReason
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,232 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="变更承办单位">
<template #tips>
<span class="text-primary ml10">
(本次变更只针对于办理答复阶段的提案)
</span>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="replyId">
<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"
>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary">修改承办
</el-button>
</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>
<el-dialog :close-on-click-modal="false" :visible.sync="undertakeDialog" custom-class="ViewDialogClass"
title="修改承办单位" v-loading="true" width="40%">
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-form-item label="主办单位" prop="hostUnit">
<el-select clearable filterable placeholder="请选择主办单位" v-model="formData.hostUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="协办单位" prop="helpUnits">
<el-select @remove-tag="removeUnit" filterable multiple placeholder="请选择协办单位"
v-model="formData.helpUnits">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="修改流程" prop="isChangeProcess">
<el-radio :label="true" v-model="formData.isChangeProcess">修改</el-radio>
<el-radio :label="false" v-model="formData.isChangeProcess">不修改</el-radio>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="undertakeDialog=false">取 消</el-button>
<el-button @click="doEdit" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
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: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'pruMaster', label: '主办单位'},
{prop: 'pruSlave', label: '协办单位'},
],
undertakeDialog: false,
unitOptions: [],
deleteIds: [],
formData: {
hostUnit: '',
helpUnits: [],
isChangeProcess: true
},
pageForm: {searchName: 'proposalName'},
formRules: {
hostUnit: [{required: true, message: '请选择主办单位', trigger: ['blur', 'change']}],
reCircuit: [{required: true, message: '请选择是否重新走流程', trigger: ['blur', 'change']}],
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'edit') {
this.openEdit(data)
}
},
removeUnit(val) {
this.deleteIds.push(val)
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openEdit(row) {
this.formData = {
hostUnit: '',
helpUnits: [],
isChangeProcess: false
}
this.formData.id = row.id
this.$set(this.formData, "reCircuit", false)
const data = await proposal.findOrganizer(row.id)
if (data && data.length > 0) {
this.formData.hostUnit = data.filter(v => v.undertakeType === 1).shift().replyUnitId
data.forEach(v => {
if (v.undertakeType === 2) {
this.formData.helpUnits.push(v.replyUnitId)
}
})
}
this.undertakeDialog = true
},
async doEdit() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const exist = this.formData.helpUnits.find(v => {
return v === this.formData.hostUnit
})
if (exist) {
this.$notify.warning({title: '警告', message: '协办单位中存在您已选择的主办单位!请检查确认后提交'});
return
}
// this.deleteIds = this.deleteIds.filter(v => !this.formData.helpUnits.includes(v) || v === this.formData.hostUnit)
this.submitDisabled = true
const confirm = await this.$confirm('您是否确定修改承办单位,修改后将重新走流程', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doEdit", {
id: this.formData.id,
hostUnit: this.formData.hostUnit,
helpUnits: JSON.stringify(this.formData.helpUnits),
// deleteIds: JSON.stringify(this.deleteIds)
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.undertakeDialog = false
this.submitDisabled = false
})
}
}
});
}
},
async created() {
setTimeout(() => {
this.pageData()
}, 500)
this.unitOptions = await proposal.getProposalUndertake()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,217 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.box-card .primary {
border-radius: 5px;
border-left: 7px solid #409EFF;
}
.item-tip {
font-weight: bold;
}
.text {
line-height: 25px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @view="openView">
<template #column>
<el-table-column align="center" header-align="center" label="审核状态">
<template scope="{row}">
<span class="text-success" v-if="row.stateCode!=proposal.HAS_SECOND_REPLY">已审核</span>
<span class="text-primary" v-if="row.stateCode==proposal.HAS_SECOND_REPLY">待审核</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="100px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'audit',data:row}"
v-if="[proposal.HAS_SECOND_REPLY].includes(row.stateCode)">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</template>
</proposal-table>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<proposal-info handle label="二次答复审核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="6" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-form-item label="温馨提示">
<el-card class="box-card primary">
<div class="text item">
<p><span class="item-tip">1.确认二次答复:</span>
<span>确认二次答复后 需要整改的单位 再次走流程</span></p>
<p><span class="item-tip">2.重新评价</span>
<span>:重新评价会让反馈人重新进行评价</span></p>
<p><span class="item-tip">3.特殊处理:</span>
<span>特殊处理会使需要整改的单位对答复内容进行修改,不走审核流程,然后反馈人再次反馈</span></p>
</div>
</el-card>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit(0)" type="primary">确认二次答复</el-button>
<el-button :disabled="submitDisabled" @click="doAudit(1)" type="primary">重新评价</el-button>
<el-button :disabled="submitDisabled" @click="doAudit(2)" type="danger">特殊处理</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
isSign: false,
auditUrl: base + '/platform/proposal/transact/audit',
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: ''
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}]
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'audit') {
this.openAudit(data.id)
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openAudit(id) {
this.formData.proposalId = id
this.$refs.guava.edit()
this.$refs.audit.openView(id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit(flag) {
let title = flag === 0 ? '二次答复需要重新走流程,是否确认?' : flag === 1 ? '确认让反馈人重新评价吗?' : '确认进行特殊处理吗?'
this.$refs["auditForm"].validate(async (valid) => {
if (valid) {
this.submitDisabled = true
this.$confirm(title, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(this.auditUrl + "/doAudit", {
audit: JSON.stringify(this.formData),
sign: this.formData.sign,
flag: flag
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}).catch(() => {
this.submitDisabled = false
});
}
})
}
},
async created() {
await initData(proposal.HAS_SECOND_REPLY, this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,402 @@
<!--#
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>
<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 class="query-row-title">教代会:</el-col>
<el-col :span="8">
<!-- <span>教代会:</span>-->
<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-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">立案结果:</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">
<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-card>
<el-card shadow="never" style="margin-top: 10px">
<table-tool :app="this" label="提案信息">
<template #func>
<el-button @click="doDelete" icon="el-icon-s-promotion" size="small"
type="primary">批量删除
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :row-key="(row)=>{row.id}" :size="tableSize"
@selection-change="(val)=>{batchSelection = val.map(v=>v.id)}"
@sort-change="pageOrder" align="center"
header-align="center">
<el-table-column 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
: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="openView(row)" 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 {
batchSelection: [],
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: '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: [],
typeOptions: [],
meetingOptions: [],
stateOptions: [],
delegationOptions: [],
unionOptions: [],
unitOptions: [],
pageForm: {
searchName: "proposalName",
searchName2: "su.username",
searchKeyword2: '',
stateCode: '',
meetingId: '',
delegationId: '',
proposalResult: [],
proposalTypes: []
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
async doDelete() {
if (this.batchSelection.length === 0) {
this.$notify.warning('请选择需要批量审核的记录')
return
}
const confirm = await this.$confirm('是否要删除您选择的提案?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const resp = await $.post(loc() + "/doBatchDelete", {proposalIds: JSON.stringify(this.batchSelection)})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
})
}
},
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.proposalTypes = JSON.stringify(pageForm.proposalTypes)
pageForm.proposalResult = JSON.stringify(pageForm.proposalResult)
$.post("/platform/proposal/statistics/integrated/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.delegationOptions = await proposal.getDelegation(this.pageForm.meetingId)
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,138 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @search="doSearch">
<template #column>
<el-button :disabled="selectIds.length === 0" :loading="urgeLoading" @click="batchUrge"
type="primary">批量催办
</el-button>
</template>
</proposal-search>
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @selection="handleSelectionChange" @view="openView" selection>
<template #column>
<el-table-column align="center" header-align="center" label="催办次数">
<template scope="{row}">
<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}">
<el-button :disabled="row.isAllReply" :loading="row.submitDisabled" @click="doUrge(row)"
size="mini" type="primary">催办
</el-button>
</template>
</el-table-column>
</template>
</proposal-table>
<!--#include("/layouts/pagination.html"){}#-->
</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>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
urgeLoading: false,
urgeDialog: false,
pageForm: {searchName: 'proposalName'},
urgeRecordList: [],
selectIds: []
}
},
methods: {
handleSelectionChange(val) {
this.selectIds = val.map(v => {
return v.id
})
},
batchUrge() {
this.urgeLoading = true
this.$confirm('确定催办吗?', '提示', {type: 'warning'}).then(async () => {
const resp = await $.post(loc() + "/doBatchUrge", {ids: JSON.stringify(this.selectIds)})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.urgeLoading = false
})
}).catch(() => {
this.urgeLoading = false
});
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async findUrgeRecord(proposalId) {
this.urgeDialog = true
const resp = await $.post(loc() + "/findUrgeRecord", {proposalId})
requestLaterFun(resp, (data) => {
this.urgeRecordList = data
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
},
async doUrge(row) {
this.$set(row, "submitDisabled", true)
this.$confirm('确定催办吗?', '提示', {type: 'warning'}).then(async () => {
const resp = await $.post(loc() + "/doUrge", {proposalId: row.id})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.$set(row, "submitDisabled", false)
})
}).catch(() => {
this.$set(row, "submitDisabled", false)
});
}
},
async created() {
await initData(null, this)
this.unitOptions = await proposal.getProposalUndertake()
}
})
</script>
<!--#
}
#-->
@@ -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>
<!--#
}
#-->
@@ -0,0 +1,278 @@
<!--#
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">
<div class="search">
<div class="search-item">
<div class="search-item-label">教代会:</div>
<div class="search-item-option">
<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>
</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-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>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="提案信息">
</table-tool>
<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>
<template scope="{row}" v-else-if="column.prop=='determineTypeCode'">
{{row.determineTypeCode=='emphasis'?'是':'否'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
{{row.isConjoin?'是':'否'}}
</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 {
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: '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: 'underTakeNames', label: '承办单位', sortable: true},
{prop: 'isConjoin', label: '是否并案', sortable: true},
{prop: 'determineTypeCode', label: '是否重点', sortable: true},
{prop: 'stateName', 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: {
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,421 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="分管校领导审批立案">
<template #func>
<el-button @click="openSendMsg" icon="el-icon-message" size="small" type="primary"
v-if="pageForm.isAudit==false && (${@shiro.hasRole('sysadmin')||@shiro.hasRole('tamange')})">
发送消息
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="pblaId">
<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}" v-else-if="column.prop=='determineTypeCode'">
{{row.determineTypeCode === 'emphasis' ? '重点' :row.determineTypeCode === 'ordinary'?
'普通':'否'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
{{row.isConjoin?'是':'否'}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">
查看
</el-button>
<el-button @click="openAudit(row)" size="mini"
type="primary"
v-if="!row.isAudit">
审核
</el-button>
<el-button @click="rollback(row)" size="mini"
type="danger"
v-if="canRollBack(row)">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="分管校领导审批立案" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title :title="proTableData && proTableData.length > 1 ? '并案信息' : '提案信息'"></vi-title>
<el-form-item>
<el-table :data="proTableData" style="width: 100%"
tooltip-effect="dark">
<el-table-column align="left" header-align="left" label="提案编号"
prop="proposalCode"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人"
prop="username"
show-overflow-tooltip></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName"
show-overflow-tooltip>
<template slot-scope="{row}">
<span @click="openView(row)"
style="color: #236eb4; cursor: pointer; text-decoration: underline">{{row.proposalName}}</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
<vi-title title="分管校领导批示"></vi-title>
<div style="text-align: center;margin-top: -40px;"
v-if="formData.auditUnderTakeList && formData.auditUnderTakeList.length>1">
<span class="text-danger">温馨提醒:该提案的承办单位【{{formData.auditUnderTakeName}}】是由您来分管的,只需要审批一次即可。</span>
</div>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal" ref="sign"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="doAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
<el-dialog :visible.syn="msgDialog" title="发送消息提醒">
<el-table :data="receiverSmsUserList" max-height="600">
<el-table-column label="序号" type="index"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="手机号" prop="mobile"></el-table-column>
</el-table>
<el-row class="mt20" justify="end" type="flex">
<el-button @click="msgDialog=false">取消</el-button>
<el-button :disabled="receiverSmsUserList.length===0" @click="doSend" type="primary">确定</el-button>
</el-row>
</el-dialog>
</guava>
</div>
<script>
<!--#include("/platform/proposal/include/proposal_include.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
proTableData: [],
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: '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: '是否并案'},
{prop: 'determineTypeCode', label: '是否重点'},
{prop: 'underTakeNameUser', label: '分管校领导'},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'underTakeNames', label: '承办单位', sortable: true},
{prop: 'undertakeType', label: '承办类型', sortable: true},
],
// tableColumns: proposal_include.tableColumns.concat([{prop:'underTakeNames',label:'承办单位'}]),
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(320)
},
auditUrl: base + '/platform/proposal/transact/audit',
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: '',
other: 'ordinary',
proposalName: '',
proposalCode: '',
createUser: ''
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
other: [{required: true, message: '请选择立案意见', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
},
resultOptions: [],
isNode: false,
nextStateCode: null,
msgDialog: false,
receiverSmsUserList: []
}
},
methods: {
async openSendMsg() {
this.msgDialog = true
const resp = await $.post(loc() + "/findReceiverSmsUserList", {meetingId: this.pageForm.meetingId})
if (resp.code === 0) {
this.msgDialog = true
this.receiverSmsUserList = resp.data
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
},
async doSend() {
const confirm = await this.$confirm('此操作将会给承办单位分管领导发送消息, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doSend", {meetingId: this.pageForm.meetingId})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openAudit(row) {
this.formData.proposalId = row.id
this.formData.underTakeId = row.underTakeId
this.formData.proposalName = row.proposalName
this.formData.createUser = row.username
this.formData.proposalCode = row.proposalCode
const branchLeaderAuditList = await this.getBranchLeaderAuditList(row.underTakeId, row.id)
const auditUnderTakeIdList = branchLeaderAuditList.map(v => v.underTakeId)
const replyUnit = await proposal.findOrganizer(row.id)
const auditUnderTakeList = replyUnit.filter(v => auditUnderTakeIdList.includes(v.replyUnitId))
const auditUnderTakeName = auditUnderTakeList.map(v => v.unitName).join(",")
this.$set(this.formData, "auditUnderTakeName", auditUnderTakeName)
this.$set(this.formData, "auditUnderTakeList", auditUnderTakeList)
// const opinion = await this.getUnderTakeOpinion(row.underTakeId)
this.$set(this.formData, "opinion", "同意该提案,请" + auditUnderTakeName + "认真研究办理该提案!")
const res = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.proTableData = res.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
},
async getBranchLeaderAuditList(replyUnitId, proposalId) {
const {data} = await $.get(loc() + "/getBranchLeaderAuditList", {
replyUnitId: replyUnitId,
proposalId: proposalId
})
return data
},
async getUnderTakeOpinion(underTakeId) {
const resp = await $.get(loc() + '/getUnderTakeName', {underTakeId})
return "同意该提案,请" + resp.data + "认真研究办理该提案!"
},
async batchAudit() {
if (this.batchSelection.length === 0) {
this.$notify.warning('请选择需要批量审核的记录')
return
}
this.formData.opinion = null
this.batchDialog = true
},
async doAudit() {
this.submitDisabled = true
const valid = await this.$refs["auditForm"].validate()
if (valid) {
let a = this.formData.auditUnderTakeList.length > 1 ? '该提案的承办单位【' + this.formData.auditUnderTakeName + '】是由您来分管的,只需要审批一次即可' : '您是否提交审核意见?'
const confirm = await this.$confirm(a, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/putSuggestion", {
audit: JSON.stringify(this.formData),
sign: this.formData.sign,
underTakeId: this.formData.underTakeId
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
})
}
}
},
async doBatchAudit() {
const valid = await this.$refs["auditForm"].validate()
if (valid) {
const confirm = await this.$confirm('您是否提交审核意见?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
})
let proposalIds = []
if (this.batchSelection && this.batchSelection.length > 0) {
proposalIds = this.batchSelection.map(v => v.id)
}
const resp = await $.post(loc() + "/putSuggestion", {
audit: JSON.stringify(this.formData),
proposalIds: JSON.stringify(proposalIds),
sign: this.formData.sign,
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.batchDialog = false
this.batchSelection = []
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
}
},
async rollback(row) {
const confirm = await this.$confirm('您确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/rollback', {proposalId: row.id, underTakeId: row.underTakeId})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyError(resp.msg)
}
}
},
canRollBack(row) {
if (this.isNode) {
return row.isAudit && [this.nextStateCode, proposal.BRANCHLEADERREAD].includes(row.stateCode)
} else {
return row.isAudit && row.stateCode < proposal.CASEUNIT && row.resultCode !== 'notGive'
}
},
},
async created() {
this.isNode = await proposal.getProposalIsNodeState(proposal.BRANCHLEADERREAD)
this.nextStateCode = await proposal.getProposalNextNode(proposal.BRANCHLEADERREAD)
await proposal.initData(this)
this.resultOptions = await getDictByCode("proposal_result")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,745 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
.el-dialog__body {
padding: 20px 30px 1px 30px;
}
.pro_table {
padding-left: 65px;
}
.el-table::before {
height: 0;
}
.el-table__empty-block {
background: none;
min-height: 50px;
}
.el-table__empty-text {
position: inherit;
}
.cell {
width: 100% !important;
font-size: 14px;
}
</style>
<div id="app" v-cloak>
<guava @vchange="vChange" ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="提案委员会立案审核">
<template #func>
<el-button :disabled="multipleSelection && multipleSelection.length >=2 ? false : true"
@click="mergeAudit"
size="mini" type="primary" v-if="!pageForm.isAudit">并案审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :row-key="(row)=>{row.id}" :size="tableSize"
@selection-change="handleSelectionChange"
@sort-change="pageOrder" align="center" header-align="center"
ref="multipleTable">
<el-table-column
:selectable="(row) => { return [proposal.CASE].includes(row.stateCode) }" type="selection"
v-if="!pageForm.isAudit"
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-column align="center" fixed="right" header-align="center" label="操作" width="220px">
<template scope="{row}">
<el-button @click="mergeIndex = 0; openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="mergeIndex = 0; openAudit(row.id,row)" size="mini"
type="primary"
v-if="[proposal.CASE].includes(row.stateCode)">
审核
</el-button>
<!--<el-button type="primary" size="mini"
v-if="row.resultCode=='notGive'"
@click="doExport(row)">
导出
</el-button>-->
<el-button @click="openEdit(row)" size="mini"
type="primary"
v-if="![proposal.CASE].includes(row.stateCode) && row.canEdit">
编辑
</el-button>
<el-button @click="revoke(row)" size="mini"
type="danger"
v-if="![proposal.CASE].includes(row.stateCode) && row.canEdit">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="提案委员会立案审核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="立案结果" prop="resultCode">
<el-radio-group @change="resultCodeChange" v-model="formData.resultCode">
<el-radio :label="item.code" border v-for="item in resultOptions">
{{item.name}}
</el-radio>
</el-radio-group>
<template v-if="formData.resultCode === 'determine'">
<el-radio label="emphasis" v-model="formData.determineTypeCode">重点</el-radio>
<el-radio label="ordinary" v-model="formData.determineTypeCode">普通</el-radio>
</template>
</el-form-item>
<!-- <el-form-item prop="determineTypeCode" label=""-->
<!-- v-if="formData.resultCode === 'determine'">-->
<!-- <el-radio v-model="formData.determineTypeCode" label="emphasis">重点提案</el-radio>-->
<!-- <el-radio v-model="formData.determineTypeCode" label="ordinary">普通提案</el-radio>-->
<!-- </el-form-item>-->
</el-col>
<el-col :span="12">
<el-form-item label="提案类型" prop="typeId">
<el-select clearable filterable placeholder="提案类型"
v-model="formData.typeId">
<el-option
:key="item.id"
:label="item.typeName"
:value="item.id"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="理由列表" prop="noFilingReason" v-if="formData.resultCode=='notGive'">
<el-select
@change="formData.opinion = '';formData.opinion='经提案委员会审理,该提案不予立案。'+formData.noFilingReason"
clearable filterable placeholder="请选择理由列表"
v-model="formData.noFilingReason">
<el-option :key="item"
:label="item"
:value="item"
v-for="item in noFilingReason">
</el-option>
</el-select>
</el-form-item>
<el-row gutter="20" v-if="formData.resultCode!='notGive'">
<el-col :span="12">
<el-form-item label="主办单位" prop="hostUnit">
<el-select clearable filterable placeholder="请选择主办单位" v-model="formData.hostUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="主办单位领导" v-if="formData.hostUnit">
<el-input readonly v-model="hostUnitLeader"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20" v-if="formData.resultCode!='notGive'">
<el-col :span="12">
<el-form-item label="协办单位" prop="helpUnit">
<el-select clearable filterable multiple placeholder="请选择协办单位"
v-model="formData.helpUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协办单位领导" v-if="formData.helpUnit && formData.helpUnit.length>0">
<el-input readonly v-model="helpUnitLeader"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<!--<el-form-item v-if="isSign()" prop="sign" label="签&emsp;&emsp;字">
<sign prefix="proposal" :qz.sync="formData.sign"></sign>
</el-form-item>-->
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit(0)" type="primary">提交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
<el-dialog
:title="diatitle" :visible.sync="dialogVisible" @closed="diaClosed"
ref="dialog"
top="5.3vh" width="70%">
<!--并案信息-->
<vi-title :title="proTableData.length > 1 ? '并案信息' : '提案信息'" style="margin-bottom: 16px !important;"></vi-title>
<el-table :data="proTableData" class="pro_table" size="small" style="width: 100%" tooltip-effect="dark">
<el-table-column align="left" header-align="left" label="提案编号" prop="proposalCode"
width="200"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人" prop="username" show-overflow-tooltip
width="200"></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName" show-overflow-tooltip>
<template slot-scope="{row}">
<span @click="openDialog(row)" style="color: #236eb4; cursor: pointer; text-decoration: underline">{{row.proposalName}}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button @click="delProposal(scope.row, scope.$index)" size="mini" type="danger"
v-if="editRow.id !== scope.row.id">移除
</el-button>
</template>
</el-table-column>
</el-table>
<!--审核信息-->
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm" style="margin-top: 20px">
<vi-title style="margin-bottom: 16px !important;" title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="立案结果" prop="resultCode">
<el-radio-group @change="resultCodeChange" v-model="formData.resultCode">
<el-radio :label="item.code" border v-for="item in resultOptions">
{{item.name}}
</el-radio>
</el-radio-group>
<template v-if="formData.resultCode === 'determine'">
<el-radio label="emphasis" v-model="formData.determineTypeCode">重点
</el-radio>
<el-radio label="ordinary" v-model="formData.determineTypeCode">普通
</el-radio>
</template>
</el-form-item>
<!-- <el-form-item prop="determineTypeCode" label=""-->
<!-- v-if="formData.resultCode === 'determine'">-->
<!-- <el-radio v-model="formData.determineTypeCode" label="emphasis">重点提案</el-radio>-->
<!-- <el-radio v-model="formData.determineTypeCode" label="ordinary">普通提案</el-radio>-->
<!-- </el-form-item>-->
</el-col>
<el-col :span="12">
<el-form-item label="提案类型" prop="typeId">
<el-select clearable filterable placeholder="提案类型"
v-model="formData.typeId">
<el-option
:key="item.id"
:label="item.typeName"
:value="item.id"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="理由列表" prop="noFilingReason" v-if="formData.resultCode=='notGive'">
<el-select @change="formData.opinion = '';formData.opinion='经提案委员会审理,该提案不予立案。'+formData.noFilingReason"
clearable filterable placeholder="请选择理由列表"
v-model="formData.noFilingReason">
<el-option :key="item"
:label="item"
:value="item"
v-for="item in noFilingReason">
</el-option>
</el-select>
</el-form-item>
<el-row gutter="20" v-if="formData.resultCode!='notGive'">
<el-col :span="12">
<el-form-item label="主办单位" prop="hostUnit">
<el-select clearable filterable placeholder="请选择主办单位" v-model="formData.hostUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="主办单位领导" v-if="formData.hostUnit">
<el-input readonly="" v-model="hostUnitLeader"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20" v-if="formData.resultCode!='notGive'">
<el-col :span="12">
<el-form-item label="协办单位" prop="helpUnit">
<el-select clearable filterable multiple placeholder="请选择协办单位"
v-model="formData.helpUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协办单位领导" v-if="formData.helpUnit && formData.helpUnit.length>0">
<el-input readonly="" v-model="helpUnitLeader"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<!--<el-form-item v-if="isSign()" prop="sign" label="签&emsp;&emsp;字">
<sign prefix="proposal" :qz.sync="formData.sign"></sign>
</el-form-item>-->
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button :disabled="submitDisabled" @click="doAudit(1)" type="primary">提交</el-button>
</el-row>
</el-form>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
computed: {
hostUnitLeader() {
const hostUnit = this.unitOptions.find(v => v.id === this.formData.hostUnit)
return hostUnit ? hostUnit.leader : '无'
},
helpUnitLeader() {
const helpUnits = this.unitOptions.filter(v => this.formData.helpUnit.includes(v.id)).map(v => {
return v.leader ? v.leader : '无'
})
return helpUnits && helpUnits.length > 0 ? helpUnits.toString() : '无'
}
},
data() {
return {
buttonIndex: 0,
proTableData: [],
diatitle: '',
mergeIndex: 0,
dialogVisible: false,
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(proposal.CASE)
},
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: '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},
],
typeOptions: [],
noFilingReason: [],
config: {},
unitOptions: [],
resultOptions: [],
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
flag: true,
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
resultCode: 'determine',
hostUnit: '',
helpUnit: '',
opinion: '经提案委员会审理,该提案确定立案。',
typeId: '',
determineTypeCode: 'ordinary'
},
formRules: {
resultCode: [{required: true, message: '请选择立案结果', trigger: ['blur', 'change']}],
hostUnit: [{required: true, message: '请选择主办单位', trigger: ['blur', 'change']}],
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
typeId: [{required: true, message: '请输入提案类型', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
},
multipleSelection: [],
editRow: {},
conJoinProposal: [],
}
},
methods: {
diaClosed() {
this.editRow = ''
this.formData = {
flag: true,
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
resultCode: 'determine',
hostUnit: '',
helpUnit: '',
opinion: '经提案委员会审理,该提案确定立案。',
typeId: '',
determineTypeCode: ''
}
},
async delProposal(row, index) {
if ([proposal.CASE].includes(row.stateCode)) {
if (this.multipleSelection.length <= 2) {
this.$notify.warning({title: '警告', message: '并案审核时提案个数最少为2个'});
return
}
this.proTableData = this.multipleSelection.filter(o => o.id !== row.id)
this.$refs.multipleTable.toggleRowSelection(row);
} else {
if (this.proTableData.length <= 2) {
this.$notify.warning({title: '警告', message: '并案审核时提案个数最少为2个'});
return
}
const confirm = await this.$confirm('是否把' + row.proposalName + '移除并案,请确认!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
this.proTableData = this.proTableData.filter(o => o.id !== row.id)
}
}
},
async openEdit(row) {
this.diatitle = '编辑'
this.buttonIndex = 2
this.editRow = row
const resp = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.conJoinProposal = resp.data
this.proTableData = resp.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
const re = await $.get(loc() + '/backShow', {proposalId: row.id})
this.formData.hostUnit = re.data.hostUnitId
this.formData.helpUnit = re.data.helpUnitIds
this.formData.username = re.data.caseAuditRecord.username
this.formData.auditTime = re.data.caseAuditRecord.auditTime
if (re.data.caseAuditRecord.opinion) {
this.formData.opinion = re.data.caseAuditRecord.opinion
}
this.formData.resultCode = re.data.basic_info.resultCode
this.formData.determineTypeCode = re.data.basic_info.determineTypeCode
this.formData.typeId = re.data.basic_info.typeId
this.formData.typeId = re.data.basic_info.typeId
this.dialogVisible = true
},
async revoke(o) {
const str = o.isConjoin === 0 ? '您确定要撤销吗?' : '此操作将撤销合并的提案,您确定要撤销吗?'
const confirm = await this.$confirm(str, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/revoke', {proposalId: o.id})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
}
},
vChange(value) {
if (value.newValue === 'index' && this.multipleSelection.length > 0 && this.mergeIndex === 1) {
this.dialogVisible = true
}
},
openDialog(item) {
this.openView(item)
this.dialogVisible = false
},
mergeAudit() {
this.diatitle = '并案审核'
this.buttonIndex = 1
if (this.multipleSelection && this.multipleSelection.length === 0) {
this.$notify.warning({title: '警告', message: '并案审核需要先在多选框中选择提案'});
return
}
this.mergeIndex = 1
this.formData.typeId = this.multipleSelection[0].typeId
this.proTableData = this.multipleSelection
this.dialogVisible = true
},
handleSelectionChange(row) {
this.multipleSelection = row;
},
resultCodeChange(code) {
if (code === "opinion") {
this.$set(this.formData, "opinion", "经提案委员会审理,该提案作为意见建议。")
} else if (code === "notGive") {
this.$set(this.formData, "opinion", "经提案委员会审理,该提案不予立案。")
} else {
this.$set(this.formData, "opinion", "经提案委员会审理,该提案确定立案。")
}
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'audit') {
this.openAudit(data.id, data)
}
},
doExport(row) {
window.open(loc() + "/doExport?proposalId=" + row.id)
},
async openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openAudit(id, pro_data) {
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
this.buttonIndex = 0
this.formData.proposalId = id
this.formData.typeId = pro_data.typeId
this.$set(this.formData, "determineTypeCode", "ordinary")
this.$refs.guava.edit()
this.$refs.audit.openView(id)
},
async doAudit() {
let formValid = true
this.$refs["auditForm"].validate(async valid => formValid = valid)
if (formValid) {
const exist = this.formData.helpUnit.find(v => {
return v === this.formData.hostUnit
})
if (exist) {
this.$notify.warning({title: '警告', message: '协办单位中存在您已选择的主办单位!请检查确认后提交'});
return
}
let msg = ''
if (this.formData.resultCode === 'notGive') {
msg = '该提案不予立案,提交后将完结,请确认!'
} else {
if (this.multipleSelection.length > 1) {
msg = '将有(' + this.multipleSelection.length + ')个提案进行并案处理,请确认!'
} else {
msg = '请确认是否提交该提案!'
}
}
// switch (this.formData.resultCode) {
// case "notGive": {
// msg = '该提案不予立案,提交后将完结,请确认!'
// break
// }
// default: {
// msg = '将有(' + this.multipleSelection.length + ')个提案进行并案处理,请确认!'
// }
// }
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const url = loc() + (this.editRow.stateCode !== undefined && this.editRow.stateCode > 300 ? '/edit' : '/audit')
let proposalIds = ''
let auditType = ''
// 0 => 进行单个审核操作
// 1 => 进行并案审核操作
// 2 => 进行编辑操作
if (this.buttonIndex === 0) {
auditType = 'one'
proposalIds = JSON.stringify([this.formData.proposalId])
} else if (this.buttonIndex === 1) {
auditType = 'many'
proposalIds = JSON.stringify(this.multipleSelection.map(o => {
return o.id
}))
} else {
auditType = this.editRow.isConjoin === 0 ? 'one' : 'many'
proposalIds = JSON.stringify(this.proTableData.map(o => o.id))
}
const resp = await $.post(url, {
audit: JSON.stringify(this.formData),
resultCode: this.formData.resultCode,
typeId: this.formData.typeId,
hostUnit: this.formData.hostUnit,
helpUnit: JSON.stringify(this.formData.helpUnit),
sign: this.formData.sign,
determineTypeCode: this.formData.determineTypeCode,
proposalIds: proposalIds,
auditType: auditType,
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
loading.close()
this.dialogVisible = false
this.submitDisabled = false
}).catch()
}
},
async getProposalUndertakeAndLeaderInfo() {
const resp = await $.get(loc() + '/getUnderTakeAndLeader')
return resp.code === 0 ? resp.data : []
}
},
async created() {
this.resultOptions = await getDictByCode("proposal_result")
this.unitOptions = await this.getProposalUndertakeAndLeaderInfo()
// this.unitOptions = await proposal.getProposalUndertake()
this.config = await proposal.getProposalConfig()
this.typeOptions = await proposal.getProposalType()
this.noFilingReason = this.config.noFilingReason
await proposal.initData(this)
},
watch: {}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,263 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch" title="复核">
</proposal-search>
<el-card class="mt10" shadow="never">
<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}" v-else-if="column.prop=='determineTypeCode'">
{{row.determineTypeCode=='emphasis'?'重点':'普通'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
{{row.isConjoin?'是':'否'}}
</template>
<!-- <template scope="{row}" v-else-if="column.prop==='laLevelName'">
{{row.laLevelName}}
</template>-->
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openAudit(row)" size="mini" type="primary"
v-if="row.stateCode===proposal.CASE_CHECK">审核
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
<template #edit>
<proposal-info handle label="提案委员会复核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="150px" ref="auditForm">
<vi-title :title="proTableData.length > 1 ? '并案信息' : '提案信息'"></vi-title>
<el-form-item>
<el-table :data="proTableData" style="width: 100%"
tooltip-effect="dark">
<el-table-column align="left" header-align="left" label="提案编号"
prop="proposalCode"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人"
prop="username"
show-overflow-tooltip></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName"
show-overflow-tooltip>
<template slot-scope="{row}">
<span @click="openView(row)"
style="color: #236eb4; cursor: pointer; text-decoration: underline">{{row.proposalName}}</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
<vi-title title="提案委员会复核"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="二次答复" prop="caseCheckNeedSecondReply">
<el-radio-group v-model="formData.caseCheckNeedSecondReply">
<el-radio :label="false" border>
无需二次答复
</el-radio>
<el-radio :label="true" border>
需要二次答复
</el-radio>
</el-radio-group>
<span class="text-primary ml10" v-if="formData.caseCheckNeedSecondReply">
(二次答复只需要主办单位答复)
</span>
</el-form-item>
<el-form-item label="领导二次审批" prop="caseCheckNeedSecondAudit"
v-if="formData.caseCheckNeedSecondReply==true">
<el-radio-group v-model="formData.caseCheckNeedSecondAudit">
<el-radio :label="false" border>
无需二次审批
</el-radio>
<el-radio :label="true" border>
需要二次审批
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="doAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</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'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
proTableData: [],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(800)
},
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: 'underTakeNames', label: '承办单位', sortable: true},
{prop: 'isConjoin', label: '是否并案', sortable: true},
{prop: 'determineTypeCode', label: '是否重点', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true}
],
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
auditTime: moment().format('YYYY-MM-DD'),
loginName: "${@shiro.getPrincipalProperty('loginname')}",
caseCheckNeedSecondReply: false,
caseCheckNeedSecondAudit: null
},
formRules: {
caseCheckNeedSecondReply: [{required: true, message: '请选择', trigger: ['blur', 'change']}],
caseCheckNeedSecondAudit: [{required: true, message: '请选择', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
}
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openAudit(row) {
const {id} = row
this.formData.proposalId = id
const res = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.proTableData = res.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
this.$refs.guava.edit()
this.$refs.audit.openView(id)
},
async doAudit() {
let formValid = true
this.$refs["auditForm"].validate(async valid => formValid = valid)
if (formValid) {
const confirm = await this.$confirm('您是否提交该提案的审查内容,请确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/audit", {
audit: JSON.stringify(this.formData),
caseCheckNeedSecondReply: this.formData.caseCheckNeedSecondReply,
caseCheckNeedSecondAudit: this.formData.caseCheckNeedSecondAudit,
sign: this.formData.sign
})
if (resp.code === 0) {
this.$notify.success(resp.msg)
this.doSearch()
this.$refs.guava.index()
} else {
this.$notify.error(resp.msg)
}
loading.close()
this.submitDisabled = false
}
}
}
},
async created() {
await proposal.initData(this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,295 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="委员查阅提案">
<template #func>
<el-button @click="doSend()" icon="el-icon-message" size="small" type="primary"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('tamange')}">
发送消息
</el-button>
<el-button @click="doExport()" icon="el-icon-message" size="small" type="primary"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('tamange')}">
导出
</el-button>
</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}" v-else-if="column.prop=='auditState'">
<span class="text-success" v-if="row.stateCode!=proposal.DELEGATION">已审核</span>
<span class="text-primary" v-if="row.stateCode==proposal.DELEGATION">待审核</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">
查阅
</el-button>
<el-button @click="doRecall(row)" size="mini" type="primary" v-if="row.isOpinion">
撤回
</el-button>
<el-button @click="openAudit(row.id)" size="mini"
type="primary"
v-if="row.isOpinion==0&&[proposal.CASE].includes(row.stateCode)">
提出意见
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="委员会成员意见" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="成员意见"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="立案意见" prop="other">
<el-radio-group v-model="formData.other">
<el-radio :label="item.code" border v-for="item in resultOptions">{{item.name}}
</el-radio>
</el-radio-group>
<template v-if="formData.other === 'determine'">
<el-radio label="emphasis" v-model="formData.determineTypeCode">重点
</el-radio>
<el-radio label="ordinary" v-model="formData.determineTypeCode">普通
</el-radio>
</template>
</el-form-item>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<!-- <el-form-item v-if="isSign()" prop="sign" label="签&emsp;&emsp;字">
<sign prefix="proposal" :qz.sync="formData.sign"></sign>
</el-form-item>-->
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit(false)" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</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'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
const that = this
const isShow = (e) => {
console.log(e)
}
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, checked: 0},
{prop: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提案方式', sortable: true, checked: 0},
{prop: 'meetingName', label: '届次', sortable: true, checked: 0},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true, checked: 0},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'caseNum', label: '立案票数', sortable: true},
{prop: 'emphasisNum', label: '重点提案票数', sortable: true},
{prop: 'ordinaryNum', label: '普通提案票数', sortable: true},
{prop: 'opinionNum', label: '意见建议票数', sortable: true},
{prop: 'notGiveNum', label: '不予立案票数', sortable: true},
],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(proposal.CASE)
},
auditUrl: base + '/platform/proposal/transact/audit',
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: '',
other: 'determine'
},
formRules: {
opinion: [{required: false, message: '请输入审核意见', trigger: ['blur', 'change']}],
other: [{required: false, message: '请选择立案意见', trigger: ['blur', 'change']}]
},
resultOptions: []
}
},
methods: {
async doRecall(row) {
const confirm = await this.$confirm('此操作将会撤回您答复的内容, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doRecall", {id: row.id})
requestLaterFun(resp, () => {
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
},
async doSend() {
const confirm = await this.$confirm('此操作将会给提案委员会发送消息, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doSend", {meetingId: this.pageForm.meetingId})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
},
doExport() {
window.open(loc() + '/doExport/' + this.pageForm.meetingId + "/" + JSON.stringify(this.tableColumns))
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openAudit(id) {
this.formData.proposalId = id
this.$set(this.formData, "other", "determine")
this.$set(this.formData, "determineTypeCode", "ordinary")
this.$refs.guava.edit()
this.$refs.audit.openView(id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit(flag) {
this.submitDisabled = true
this.$refs["auditForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/putSuggestion", {
audit: JSON.stringify(this.formData),
sign: this.formData.sign,
proposalId: this.formData.proposalId,
flag: flag
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
});
}
},
async created() {
await proposal.initData(this)
this.resultOptions = await getDictByCode("proposal_result")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,479 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
.pro_table .cell {
width: 100% !important;
font-size: 14px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<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}" v-else-if="column.prop=='isConjoin'">
<span :style="row.isConjoin === 1 ? 'color: #236eb4' : ''">{{row.isConjoin === 1 ? '是' : '否'}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='underTakeOpinion'">
<template v-if="row.stateCode>proposal.CASEUNIT">
<i class="fa fa-circle text-success ml5"></i>
</template>
<template v-else>
<i class="fa fa-circle text-danger ml5" v-if="row.canNotNum>0"></i>
<i class="fa fa-circle text-success ml5" v-else></i>
</template>
</template>
<template scope="{row}" v-else-if="column.prop=='auditState'">
<span v-if="row.stateCode!=proposal.CASEUNIT">已审核</span>
<span v-if="row.stateCode==proposal.CASEUNIT">待审核</span>
</template>
<template scope="{row}" v-else-if="column.prop=='laLevelName'">
<span>
{{!row.determineTypeCode ? '否' : row.determineTypeCode === 'emphasis' ? '重点' : '普通'}}
</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openAudit(row)" size="mini" type="primary"
v-if="[proposal.CASEUNIT].includes(row.stateCode)">审核
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="提案委员会确认承办单位" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<div style="margin-bottom: 20px" v-if="clickRow.isConjoin === 1">
<vi-title style="margin-bottom: 16px !important;" title="并案信息"></vi-title>
<el-form-item>
<el-table :data="proTableData"
style="width: 100%">
<el-table-column align="left" header-align="left" label="提案编号"
prop="proposalCode"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人"
prop="username"
show-overflow-tooltip></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName"
show-overflow-tooltip>
<template slot-scope="{row}">
<span style="color: #236eb4;">{{row.proposalName}}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button @click="delProposal(scope.row, scope.$index)" size="mini"
type="danger"
v-if="clickRow.id !== scope.row.id">移除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</div>
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="立案结果" prop="resultCode">
<el-radio-group @change="resultCodeChange" v-model="formData.resultCode">
<el-radio :label="item.code" border v-for="item in resultOptions">
{{item.name}}
</el-radio>
</el-radio-group>
<template v-if="formData.resultCode === 'determine'">
<el-radio label="emphasis" v-model="formData.determineTypeCode">重点</el-radio>
<el-radio label="ordinary" v-model="formData.determineTypeCode">普通</el-radio>
</template>
<!--<el-tag>
{{resultName}}
{{formData.determineTypeName?'('+formData.determineTypeName+')':''}}
</el-tag>-->
<!-- <el-tag v-if="formData.determineTypeName">-->
<!-- {{formData.determineTypeName}}-->
<!-- </el-tag>-->
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提案类型" prop="typeId">
<el-select clearable filterable placeholder="提案类型"
v-model="formData.typeId">
<el-option
:key="item.id"
:label="item.typeName"
:value="item.id"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.resultCode!='notGive'">
<el-col :span="12">
<el-form-item label="主办单位" prop="hostUnit">
<el-select clearable filterable placeholder="请选择主办单位"
v-model="formData.hostUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="主办单位领导" v-if="formData.hostUnit">
<el-input readonly v-model="hostUnitLeader"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协办单位" prop="helpUnit">
<el-select clearable filterable multiple placeholder="请选择协办单位"
v-model="formData.helpUnit">
<el-option :key="item.id"
:label="item.unitName"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协办单位领导" v-if="formData.helpUnit && formData.helpUnit.length>0">
<el-input readonly v-model="helpUnitLeader"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="理由列表" prop="noFilingReason" v-if="formData.resultCode=='notGive'">
<el-select @change="formData.opinion = '';formData.opinion=formData.noFilingReason"
clearable filterable placeholder="请选择理由列表"
v-model="formData.noFilingReason">
<el-option :key="item"
:label="item"
:value="item"
v-for="item in noFilingReason">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写工作会的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
computed: {
resultName() {
const result = this.resultOptions.find(v => v.code === this.formData.resultCode)
return result ? result.name : ''
}
},
components: {
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
noFilingReason: [],
typeOptions: [],
clickRow: {},
proTableData: [],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(400)
},
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: '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: 'masterUnitName', label: '主办单位', sortable: true},
{prop: 'masterLeaderUserName', label: '分管校领导', sortable: true},
{prop: 'laLevelName', label: '是否重点', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'underTakeOpinion', label: '承办意见', sortable: false},
{prop: 'auditState', label: '审核状态', sortable: true},
],
resultOptions: [],
unitOptions: [],
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
resultCode: 'determine',
hostUnit: '',
helpUnit: '',
opinion: '',
typeId: '',
determineTypeCode: ''
},
formRules: {
hostUnit: [{required: true, message: '请选择主办单位', trigger: ['blur', 'change']}],
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
}
}
},
computed: {
hostUnitLeader() {
const hostUnit = this.unitOptions.find(v => v.id === this.formData.hostUnit)
return hostUnit ? hostUnit.leader : '无'
},
helpUnitLeader() {
const helpUnits = this.unitOptions.filter(v => this.formData.helpUnit.includes(v.id)).map(v => {
return v.leader ? v.leader : '无'
})
return helpUnits && helpUnits.length > 0 ? helpUnits.toString() : '无'
}
},
methods: {
resultCodeChange(code) {
if (code === "opinion") {
this.$set(this.formData, "opinion", "经提案委员会审理,该提案作为意见建议。")
} else if (code === "notGive") {
this.$set(this.formData, "opinion", "经提案委员会审理,该提案不予立案。")
} else {
this.$set(this.formData, "opinion", "经提案委员会审理,该提案确定立案。")
}
},
dropdownCommand(command) {
const {type, data} = command
switch (type) {
case 'view':
this.openView(data)
break
case 'audit':
this.openAudit(data)
break
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openAudit(row) {
this.clickRow = row
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
const {id, resultCode, typeId} = row
this.formData.proposalId = id
this.formData.resultCode = resultCode
this.formData.determineTypeCode = row.determineTypeCode
this.$set(this.formData, "typeId", typeId)
if (row.laLevelName) {
this.$set(this.formData, 'determineTypeName', row.laLevelName)
}
const underTakeRes = await $.get(loc() + '/queryUnderTakeByProposalId', {proposalId: id})
const underTakes = underTakeRes.data
if (underTakes && underTakes.length > 0) {
this.$set(this.formData, 'hostUnit', underTakes.find(v => v.undertakeType === 1).replyUnitId)
this.$set(this.formData, 'helpUnit', underTakes.filter(v => v.undertakeType === 2).map(v => v.replyUnitId))
}
this.resultCodeChange(row.resultCode)
const resp = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.proTableData = resp.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
this.$refs.guava.edit()
this.$refs.audit.openView(id)
},
async delProposal(row, index) {
if (this.proTableData.length <= 2) {
this.$notify.warning({title: '警告', message: '并案审核时提案个数最少为2个'});
return
}
const confirm = await this.$confirm('此操作将移除该提案的并案信息', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
this.proTableData = this.proTableData.filter(o => o.id !== row.id)
}
},
async doAudit() {
let formValid = true
this.$refs["auditForm"].validate(valid => {
formValid = valid
})
if (formValid) {
if (this.formData.resultCode !== 'notGive') {
if (this.formData.helpUnit.some(v => v === this.formData.hostUnit)) {
this.$alert('协办单位中存在您已选择的主办单位,请检查确认无误后再提交!', '提示', {
confirmButtonText: '确定'
})
return
}
const checkRes = await $.get(loc() + '/checkUnderTakeUser', {hostUnit: this.formData.hostUnit})
if (!checkRes.data) {
this.$alert('请先设置主办单位分管校领导或答复人后再进行提交!', '提示', {
confirmButtonText: '确定'
})
return
}
}
let proposalIds = JSON.stringify(this.proTableData.map(o => o.id))
this.$confirm('最终确定立案和承办单位,不可撤回请确认!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + '/audit', {
audit: JSON.stringify(this.formData),
resultCode: this.formData.resultCode,
typeId: this.formData.typeId,
hostUnit: this.formData.hostUnit,
helpUnit: JSON.stringify(this.formData.helpUnit),
sign: this.formData.sign,
flag: this.formData.flag,
determineTypeCode: this.formData.determineTypeCode,
proposalIds: proposalIds
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
loading.close()
this.submitDisabled = false
}).catch()
}
},
async getProposalUndertakeAndLeaderInfo() {
const resp = await $.get('/platform/proposal/transact/case/case/getUnderTakeAndLeader')
return resp.code === 0 ? resp.data : []
}
},
async created() {
await proposal.initData(this)
this.resultOptions = await getDictByCode("proposal_result")
// this.unitOptions = await proposal.getProposalUndertake()
this.unitOptions = await this.getProposalUndertakeAndLeaderInfo()
this.typeOptions = await proposal.getProposalType()
this.config = await proposal.getProposalConfig()
this.noFilingReason = this.config.noFilingReason
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,206 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @view="openView">
<template #column>
<el-table-column align="center" header-align="center" label="审核状态" width="80px">
<template scope="{row}">
<span class="text-success" v-if="row.isAllPass">已审核</span>
<span class="text-primary" v-else>待审核</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="100px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'audit',data:row}"
v-if="!row.isAllPass">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</template>
</proposal-table>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<proposal-info handle label="提案委员会审核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<template v-for="item in formData.organizers">
<el-form-item :label="item.unitName">
<el-radio-group v-model="item.isCommitteePass">
<el-radio-button :label="true">审核通过</el-radio-button>
<el-radio-button :label="false">返回修改</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="item.opinion"></el-input>
</el-form-item>
</template>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit()" type="primary">&emsp;
</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
return {
isSign: false,
submitDisabled: false,
organizerList: [],
auditUrl: base + '/platform/proposal/transact/audit',
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
organizers: [],
sign: ''
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}]
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'audit') {
this.openAudit(data)
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openAudit(row) {
this.formData.proposalId = row.id
let data = await proposal.findOrganizer(row.id)
data.forEach(v => {
v.isCommitteePass = true
v.opinion = ''
})
this.formData.organizers = data
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit() {
this.$refs["auditForm"].validate(async (valid) => {
if (valid) {
for (let i in this.formData.organizers) {
if (!this.formData.organizers[i].opinion) {
this.$notify.warning({title: '警告', message: '请填写审核意见'});
return
}
}
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(this.auditUrl + "/doAudit", {
audit: JSON.stringify(this.formData),
organizers: JSON.stringify(this.formData.organizers),
sign: this.formData.sign
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
});
}
},
async created() {
await initData(proposal.COMMITTEE_REVIEW, this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,802 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.item-button .el-button {
padding: 12px 30px;
}
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :has_add="false" :page="pageForm" @add="openAdd"
@import="openImport" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="我的提案">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :loading="tableLoading" :size="tableSize" highlight-current-row
style="width: 100%;">
<el-table-column
label="序号"
type="index" width="50">
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:sortable="column.sortable"
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}" v-else-if="column.prop=='stateId'">
<vi-table-state :state="row"></vi-table-state>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="400px">
<template scope="{row}">
<el-button @click="openSeconded(row.id,row.proposalName)" size="mini" type="primary"
v-if="[proposal.UNSUBMIT,proposal.INVIRTE,proposal.DELEGATION_BACK,].includes(row.stateCode)&&row.mannerCode=='W01'">
邀请附议人
</el-button>
<el-button @click="doSubmit(row)" size="mini" type="primary"
v-if="showSubmitBtn(row)">
提交
</el-button>
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openEdit(row.id)" size="mini" type="primary"
v-if="[proposal.UNSUBMIT].includes(row.stateCode)">
编辑
</el-button>
<el-button @click="doDelete(row)" size="mini" type="primary"
v-if="[proposal.UNSUBMIT].includes(row.stateCode)&&row.stateCode!==proposal.FINISH">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
<template #public>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input clearable placeholder="请输入姓名或者工号" v-model="pageForm2.searchKeyword">
</el-input>
</div>
<div class="btn-group tool-button">
<el-select @change="jdhChange" clearable filterable placeholder="请选择届次" v-model="pageForm2.jdhid">
<el-option
:key="item.id"
:label="item.jdhallname"
:value="item.id"
v-for="item in jdhList">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-select @change="delegationChange" clearable filterable placeholder="请选择代表团"
v-model="pageForm2.dbtid">
<el-option
:key="item.id"
:label="item.dbtname"
:value="item.id"
v-for="item in delegations">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-select
@change="unitList = allUnitList.filter(v => pageForm2.unionid?v.unionid === pageForm2.unionid:true)"
clearable filterable placeholder="请选择工会"
v-model="pageForm2.unionid">
<el-option
:key="item.id"
:label="item.unionname"
:value="item.id"
v-for="item in unionList">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-select clearable filterable placeholder="请选择单位" v-model="pageForm2.unitid">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitList">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button ">
<el-radio-group @change="queryDb" v-model="pageForm2.isAudit">
<el-radio-button :label="true">已邀请 <span style="color: red">{{secondedNum}}</span>
</el-radio-button>
<el-radio-button :label="false">待邀请</el-radio-button>
</el-radio-group>
</div>
<div class="btn-group tool-button">
<el-button @click="queryDb" icon="el-icon-search" type="primary"></el-button>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="邀请附议人">
<template #label_end>
<el-button @click="addSeconded(0)" class="ml20" plain type="primary" v-if="!pageForm2.isAudit">
批量邀请
</el-button>
</template>
<template #func>
<span>
温馨提醒:请选择
<span style="color:red;font-size: 16px;font-weight: bold">
{{config.seconderNum ? config.seconderNum : 0}}
</span>
位附议人,否则无法提交提案!
</span>
</template>
</table-tool>
<el-table :data="dBTableData" :size="tableSize" @selection-change="handleSelectionChange"
class="vi-table" ref="multipleTable" row-key="id" style="width: 100%"
v-loading="dBTableDataLoading">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{ scope.$index + (pageForm2.pageNumber - 1) * pageForm2.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in dBTableColumns"
>
<template scope="{row:{isAgree}}" v-if="column.prop=='isAgree'">
<template v-if="typeof isAgree === 'undefined'">
<span class="text-success">待邀请</span>
</template>
<template v-else>
<span class="text-info" v-if="isAgree == null">未附议</span>
<span class="text-danger" v-if="isAgree == false">不通过</span>
<span class="text-success" v-if="isAgree == true">通过</span>
</template>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" v-if="!pageForm2.isAudit"
width="100">
<template slot-scope="{row}">
<el-button @click="addSeconded(row.id)" size="mini">邀请</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
:current-page="pageForm2.pageNumber"
:page-size="pageForm2.pageSize"
:page-sizes="[5,10, 20, 30, 50]"
:total="pageForm2.totalCount"
@current-change="pageNumberChange2"
@size-change="pageSizeChange2"
layout="total, sizes, prev, pager, next">
</el-pagination>
</el-row>
</el-card>
</template>
</guava>
<el-dialog
:close-on-click-modal="false"
:visible.sync="importVisible"
title="提案导入"
width="50%"
>
<el-timeline>
<el-timeline-item placement="top" timestamp="下载模板">
<el-card>
<el-button
@click="location.href='/platform/basics/downloadTemplate?filePath=Proposal/proposal.xlsx&fileName=教职工代表大会提案表.xlsx'"
icon="el-icon-download" size="medium"
style="width: 200px"
type="">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="上传文件">
<el-card>
<el-upload
:auto-upload="false"
:file-list="importData.fileList"
:limit="1"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xlsx']})
}"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
name="file"
ref="upload">
<el-button icon="el-icon-upload" size="medium" style="width: 200px" type="">选择文件
</el-button>
</el-upload>
</el-card>
</el-timeline-item>
</el-timeline>
<span class="dialog-footer" slot="footer">
<el-button :disabled="importLoading" @click="importVisible = false">取 消</el-button>
<el-button :loading="importLoading" @click="doImport" type="primary">确定</el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
:visible.sync="composeDialogVisible"
title="温馨提醒" width="30%"
>
<div v-html="tipsContent"></div>
<span class="dialog-footer" slot="footer">
<el-button @click="composeDialogVisible = false" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
<!--#include("/platform/proposal/include/proposal_include.js"){}#-->
let E = window.wangEditor
let briefEditor, measuresEditor = null
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
let validBrief = (rule, value, callback) => {
if (!this.formData.brief || !dd3s.html2txt(this.formData.brief)) {
callback(new Error('请填写提案内容、案由和案据'));
} else {
callback();
}
};
let validMeasures = (rule, value, callback) => {
if (!this.formData.measures || !dd3s.html2txt(this.formData.measures)) {
callback(new Error('请填写提案实施的可行性建议'));
} else {
callback();
}
};
return {
composeDialogVisible: false,
importLoading: false,
importVisible: false,
importData: {},
secondedNum: 0,
jdhList: [],
delegations: [],
unitList: [],
allUnitList: [],
unionList: [],
dBTableData: [],
dbUserSelection: [],
dBTableDataLoading: false,
secondedTableData: [],
secondedDialog: false,
secondedFormData: {users: []},
delegationOptions: [],
committeeOptions: [],
unitOptions: [],
typeOptions: [],
mannerOptions: [],
meetingOptions: [],
pageForm2: {
searchName: 'u.username',
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
isAudit: false,
jdhid: '',
dbtid: '',
unionid: '',
unitid: ''
},
pageForm: {searchName: 'proposalName'},
formRules: {
username: [{required: true, message: '请填写提案人', trigger: ['blur', 'change']}],
createTime: [{required: true, message: '请填写提案时间', trigger: ['blur', 'change']}],
proposalName: [{required: true, message: '请填写提案名称', trigger: ['blur', 'change']}],
mannerCode: [{required: true, message: '请选择提案方式', trigger: ['blur', 'change']}],
delegationId: [{required: true, message: '请选择所属代表团', trigger: ['blur', 'change']}],
teacherMeetingId: [{required: true, message: '请选择所属教代会', trigger: ['blur', 'change']}],
committeeId: [{required: true, message: '请选择所属委员会', trigger: ['blur', 'change']}],
typeId: [{required: true, message: '请选择提案类型', trigger: ['blur', 'change']}],
implementUnitId: [{required: true, message: '请选择建以落实部门', trigger: ['blur', 'change']}],
brief: [{validator: validBrief, trigger: ['blur', 'change']}],
measures: [{validator: validMeasures, trigger: ['blur', 'change']}],
},
subDisabled: false,
userOptions: [],
userLoading: false,
config: {},
tableColumns: [
{prop: 'oldProposalCode', label: '草案编号', width: "120", sortable: true, disabled: true},
{prop: 'proposalCode', label: '提案编号', sortable: true, disabled: true},
{prop: 'proposalName', label: '提案名称', disabled: true},
{prop: 'createTime', label: '提案时间', sortable: true},
{prop: 'typeName', label: '提案类型', sortable: true},
{prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提案方式', sortable: true},
{prop: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0},
{prop: 'meetingName', label: '届次'},
{prop: 'stateId', label: '提案状态', sortable: true},
],
dBTableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true},
{prop: 'mobile', label: '联系方式'},
{prop: 'dbUnitName', label: '所属单位'},
{prop: 'dbUnionName', label: '所属工会'},
{prop: 'jdhAllName', label: '届次', sortable: true},
{prop: 'dbtName', label: '代表团', sortable: true},
{prop: 'isAgree', label: '附议状态', sortable: true},
],
proposalConfig: {},
tipsContent: ''
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
methods: {
showSubmitBtn(row) {
const {alreadySecondedCount, stateCode} = row
if (row.mannerCode === 'W01') {
if (stateCode !== proposal.INVIRTE) {
return false
}
const {submitMode, seconderNum} = this.proposalConfig
if (submitMode === 'AMT' || submitMode === "manual") {
return alreadySecondedCount >= seconderNum
} else {
return false
}
} else {
return stateCode === proposal.UNSUBMIT
}
// [proposal.UNSUBMIT].includes(row.stateCode) && row.mannerCode != 'W01' || (!config.isAutoSubmit && row.mannerCode == 'W01')
},
openImport() {
this.importData = {
fileList: []
}
this.importVisible = true;
},
doImport() {
if (!this.importData.fileList.length) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
});
this.importLoading = true
$.ajax({
url: loc() + "/importProposal",
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
if (!data.code) {
this.notifySuccess(data.msg);
this.pageData();
this.importVisible = false
} else {
this.notifyWarning(data.msg)
}
this.importLoading = false
},
error: (data) => {
this.notifyWarning("导入失败")
this.importLoading = false
}
});
},
delSeconded(row) {
const {proposalId, seconderId} = row
this.$confirm('确定要删除该附议人吗?', '提示', {type: 'warning'}).then(async () => {
this.$set(row, "loading", true)
const resp = await $.post(loc() + "/deleteSeconder", {proposalId, seconderId});
requestLaterMsgFun((vue, resp, async () => {
await this.secondedData()
}))
this.$set(row, "loading", false)
}).catch(() => {
this.$set(row, "loading", false)
});
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'edit') {
this.openEdit(data.id)
} else if (type === 'delete') {
this.doDelete(data)
} else if (type === 'seconded') {
this.openSeconded(data)
} else if (type === 'submit') {
this.doSubmit(data)
}
},
async meetingChange(val) {
this.formData.delegationId = null
this.formData.committeeId = null
this.delegationOptions = await proposal.getDelegation(val)
// this.committeeOptions = await proposal.getCommittee(val)
},
async secondedData() {
const {data} = await $.get(loc() + "/getSecondedData", {proposalId: this.secondedFormData.proposalId})
this.secondedTableData = data
},
async addSeconded(id) {
const {proposalName, proposalId} = this.pageForm2
if (id === 0 && this.dbUserSelection.length === 0) {
this.$message.warning('请先选择附议人后再点击邀请按钮')
return
}
if (id != 0) this.dbUserSelection = [].concat(id)
let aa = "请确认所选代表是否作为本提案的附议人?"
if (this.secondedNum >= this.config.seconderNum) aa = "您已邀请了" + this.secondedNum + " 名附议人,是否继续邀请?"
const confirm = await this.$confirm(aa + '确定后会有信息通知!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/addSeconded", {
proposalId: proposalId,
proposalName: proposalName,
users: JSON.stringify(this.dbUserSelection),
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: '邀请附议人成功'});
this.$refs.multipleTable.clearSelection();
this.pageForm2.searchKeyword = ''
this.doSearch()
this.queryDb()
this.getProposalSecondedNum()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
})
}
/* if (this.secondedFormData.users.length === 0) {
this.$message.warning('请先选择附议人后再点击邀请按钮')
return
}
this.$confirm('确认邀请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.subDisabled = true
const {proposalId, users, proposalName} = this.secondedFormData
const resp = await $.post(loc() + "/addSeconded", {
proposalId: proposalId,
proposalName: proposalName,
users: JSON.stringify(users)
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: '邀请附议人成功'});
this.userOptions = []
this.secondedFormData.users = []
this.secondedData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.subDisabled = false
})
}).catch(() => {
});*/
},
async queryUser(proposalId, query) {
const {data} = await $.get(loc() + "/queryDelegate", {proposalId, query})
return data
},
async userRemoteMethod(query) {
if (query) {
this.userLoading = true
const arr = await this.queryUser(this.secondedFormData.proposalId, query)
this.userOptions = this.userOptions.filter(v => {
return this.secondedFormData.users.includes(v.id)
}).concat(arr.filter(v => {
return !this.secondedFormData.users.includes(v.id)
}));
this.userLoading = false
}
},
pageNumberChange2(val) {
this.pageForm2.pageNumber = val;
this.queryDb();
},
pageSizeChange2(val) {
this.pageForm2.pageSize = val;
this.queryDb();
},
async delegationChange(val) {
this.unionList = await getUnions(val)
},
async jdhChange(val) {
this.delegations = await getDbt(val)
},
async queryDb() {
const {jdhid, dbtid, unionid, unitid, proposalId} = this.pageForm2
const data = await $.get(loc() + "/queryDb", {
...this.pageForm2,
pageForm2: this.pageForm2,
proposalId: proposalId,
jdhid: jdhid,
dbtid: dbtid,
unionid: unionid,
unitid: unitid
})
sublime.closeLoadingbar();
this.dBTableDataLoading = false
if (data.code == 0) {
this.dBTableData = data.data.list;
// if (data.data.list[0].secondedNum != undefined) {
// this.secondedNum = data.data.list[0].secondedNum
// }
this.pageForm2.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
},
async getProposalSecondedNum() {
const resp = await $.get(loc() + '/getProposalSecondedNum', {proposalId: this.pageForm2.proposalId})
this.secondedNum = resp.data
},
async openSeconded(id, proposalName) {
this.pageForm2.proposalId = id
this.pageForm2.proposalName = proposalName
await this.queryDb()
await this.getProposalSecondedNum()
this.$refs.guava.public()
this.composeDialogVisible = true
/* this.secondedFormData = {
proposalId: id,
proposalName: proposalName,
users: [],
}
this.secondedData()
this.userOptions = []
this.userLoading = false
this.secondedDialog = true*/
},
handleSelectionChange(val) {
this.dbUserSelection = val.map(v => v.id);
},
doDelete(row) {
this.$confirm('此操作将删除【' + row.proposalName + '】提案的所有信息!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a) => {
if ("confirm" === a) {
const resp = await $.post(loc() + "/doDelete", {id: row.id})
requestLaterFun(resp, () => {
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
async doSubmit(row) {
this.$confirm('确定要提交此提案吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'info',
callback: async (a) => {
if ("confirm" === a) {
const resp = await $.post(loc() + "/doSubmit", {id: row.id, mannerCode: row.mannerCode})
requestLaterFun(resp, () => {
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.warning({title: '警告', message: resp.msg});
})
}
}
})
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
let data = clone(this.formData)
if (data.files) {
data.files = JSON.stringify(data.files)
}
const resp = await $.post(loc() + method, {data: JSON.stringify(data), sign: data.sign})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
});
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openEdit(id) {
window.location.href = "/platform/proposal/transact/writeproposal?proposalId=" + id
/* const resp = await $.get(loc() + "/findOne", {id})
requestLaterFun(resp, () => {
if (resp.data.files) {
resp.data.files = JSON.parse(resp.data.files)
}
this.formData = resp.data
this.$nextTick(() => {
$("#briefEditor").html("")
$("#measuresEditor").html("")
briefEditor = new E("#briefEditor")
briefEditor.config.onchange = (html) => {
this.formData.brief = html
}
measuresEditor = new E("#measuresEditor")
measuresEditor.config.onchange = (html) => {
this.formData.measures = html
}
briefEditor.create()
measuresEditor.create()
briefEditor.txt.html(resp.data.brief)
measuresEditor.txt.html(resp.data.measures)
})
this.$refs.guava.edit()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})*/
},
async openAdd() {
sublime.jumpPagePjax('/platform/proposal/transact/writeproposal')
},
async initData() {
this.config = await proposal.getProposalConfig()
this.meetingOptions = await proposal.getOpenMeeting()
this.typeOptions = await proposal.getProposalType()
this.unitOptions = await proposal.getProposalUndertake()
this.mannerOptions = await getDictByCode("proposal_manner")
this.pageForm.teacherMeetingId = this.meetingOptions ? this.meetingOptions[0].id : null
this.delegationOptions = await proposal.getDelegation(this.pageForm.teacherMeetingId)
// this.committeeOptions = await proposal.getCommittee(this.pageForm.teacherMeetingId)
const jgName = await $.post("/platform/proposal/transact/writeproposal/getJgNameByuser")
this.committeeOptions = jgName.data
//this.jdhList = await getAllJdh()
this.jdhList = await getOpenMeeting()
if (this.jdhList.length > 0) {
this.pageForm2.jdhid = this.jdhList[0].id
this.delegations = await getDbt(this.jdhList[0].id)
}
this.unionList = await getUnion();
this.allUnitList = await getUnit();
this.unitList = clone(this.allUnitList);
},
checkOperation() {
const operation = GetQueryString("operation")
const id = GetQueryString("id")
if (operation && operation === 'invite' && id) {
this.openSeconded(id, null)
}
},
initTipsContent() {
this.tipsContent =
`<p>&nbsp;&nbsp;1)请选择<sapn style="color: red">` + this.proposalConfig.seconderNum + `</sapn>个以上附议人附议,否则,不能进入团长审核环节。</p>` +
`<p>&nbsp;&nbsp;(2)如果附议人全部附议后,系统会自动提交该提案;</p>` +
`<p>&nbsp;&nbsp;3)如果该提案已经有<sapn style="color: red">` + this.proposalConfig.seconderNum + `</sapn>个附议人附议,还未全部完成附议,提案人必须手动才能<p>` +
`<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;完成提案提交!一旦邀请附议人成功,系统会发送邀请信息,不可撤销。</p>`
}
},
async created() {
await this.initData()
this.proposalConfig = await getProposalConfig()
this.pageData();
if (getLocationVariable("action") === 'add') {
this.openAdd()
}
this.checkOperation()
this.initTipsContent()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,254 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="团长审核">
<template #func>
<!--# if(@shiro.hasRole('sysadmin')){ #-->
<el-button @click="oneClickReminder" size="small" type="primary">一键提醒</el-button>
<!--# } #-->
</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}" v-else-if="column.prop=='auditState'">
<span class="text-success" v-if="row.stateCode!=proposal.DELEGATION">已审核</span>
<span class="text-primary" v-if="row.stateCode==proposal.DELEGATION">待审核</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openAudit(row.id)"
size="mini"
type="primary" v-if="[proposal.DELEGATION].includes(row.stateCode)">审核
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="团长审核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<!-- <el-button type="danger" :disabled="submitDisabled" @click="doAudit(2)">未通过</el-button>-->
<el-button :disabled="submitDisabled" @click="doAudit(0)" type="danger">退回</el-button>
<el-button :disabled="submitDisabled" @click="doAudit(1)" type="primary">通 过</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</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'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(proposal.DELEGATION)
},
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: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提案方式', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'auditState', label: '审核状态', sortable: true},
],
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD HH:mm:ss'),
opinion: '同意该提案!',
sign: ''
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
}
}
},
methods: {
async oneClickReminder() {
const confirm = await this.$confirm('您确定要一键提醒吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const resp = await $.post(loc() + '/oneClickReminder', {meetingId: this.pageForm.meetingId})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
batchExport() {
const {meetingId} = this.pageForm
if (!meetingId) {
this.$message.warning('请选择教代会届次')
return
}
window.open(loc() + '/batchExport?meetingId=' + meetingId)
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'audit') {
this.openAudit(data.id)
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openAudit(id) {
this.formData.proposalId = id
this.$refs.guava.edit()
this.$refs.audit.openView(id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit(flag) {
this.submitDisabled = true
let formValid = true
this.$refs["auditForm"].validate((valid) => {
formValid = valid
})
if (formValid) {
const flagText = flag ? '您是否要通过该提案?' : '该提案将退回至撰写人,修改后需重新邀请附议,请确认是否退回?'
this.$confirm(flagText, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
if (!flag) {
if (this.formData.opinion === '同意该提案!') {
this.formData.opinion = '退回该提案!'
}
}
const resp = await $.post(proposal.auditUrl, {
audit: JSON.stringify(this.formData),
sign: this.formData.sign,
flag: flag
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
loading.close()
this.submitDisabled = false
}).catch(() => {
this.submitDisabled = false
})
} else {
this.submitDisabled = false
}
}
},
async created() {
await proposal.initData(this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,469 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="执委会主任审核">
<template #func>
<el-button @click="doSend()" icon="el-icon-message" size="small" type="primary"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('tamange')}">发送消息
</el-button>
<el-button @click="batchAudit" icon="el-icon-s-promotion" size="small"
type="primary">批量审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :row-key="(row)=>{row.id}" :size="tableSize"
@selection-change="(val)=>{this.batchSelection = val}"
@sort-change="pageOrder"
align="center" header-align="center">
<el-table-column
:selectable="(row)=>{return row.executorOpinion==null && row.resultCode!='notGive'}"
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
: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}" v-else-if="column.prop=='laLevelName'">
<span>
{{row.determineTypeCode === 'emphasis' ? '重点' :row.determineTypeCode === 'ordinary'? '普通':'否'}}
</span>
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
<span :style="row.isConjoin ? 'color: #236eb4' : ''">{{row.isConjoin ? '是' : '否'}}</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="300px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openAudit(row.id,row)" size="mini"
type="primary"
v-if="row.executorOpinion==null && row.resultCode!='notGive'">
审核
</el-button>
<el-button @click="rollback(row.id)" size="mini"
type="danger"
v-if="canRollBack(row)">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="执委会主任审核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title :title="proTableData.length > 1 ? '并案信息' : '提案信息'"></vi-title>
<el-form-item>
<el-table :data="proTableData" style="width: 100%"
tooltip-effect="dark">
<el-table-column align="left" header-align="left" label="提案编号"
prop="proposalCode"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人"
prop="username"
show-overflow-tooltip></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName"
show-overflow-tooltip>
<template slot-scope="{row}">
<span @click="openView(row)"
style="color: #236eb4; cursor: pointer; text-decoration: underline">{{row.proposalName}}</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
<vi-title title="执委会主任审核"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item prop="other" label="立案建议">
<el-radio-group @change="otherChange" v-model="formData.other">
<el-radio v-for="item in resultOptions" :label="item.code" border>{{item.name}}
</el-radio>
</el-radio-group>
<template v-if="formData.other === 'determine'">
<el-radio label="emphasis" v-model="formData.determineTypeCode">重点</el-radio>
<el-radio label="ordinary" v-model="formData.determineTypeCode">普通</el-radio>
</template>
</el-form-item>-->
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="doAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
<el-dialog :close-on-click-modal="false" :visible.sync="batchDialog" title="批量批阅" top="50px" width="70%">
<vi-title title="已选提案"></vi-title>
<el-table :data="batchSelection" max-height="300">
<el-table-column label="序号" type="index"></el-table-column>
<el-table-column label="提案名称" prop="proposalName"></el-table-column>
<el-table-column label="提案人" prop="username"></el-table-column>
<el-table-column label="是否并案" prop="isConjoin">
<template scope="{row}">
<span :style="row.isConjoin ? 'color: #236eb4' : ''">{{row.isConjoin ? '是' : '否'}}</span>
</template>
</el-table-column>
<el-table-column label="立案结果" prop="resultName"></el-table-column>
<el-table-column label="是否重点" prop="laLevelName">
<template scope="{row}">
<span>
{{row.determineTypeCode === 'emphasis' ? '重点' :row.determineTypeCode === 'ordinary'? '普通':'否'}}
</span>
</template>
</el-table-column>
</el-table>
<el-form :model="formData" :rules="formRules" class="mt20" label-width="120px" ref="auditForm">
<vi-title title="执委会建议"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item prop="other" label="立案建议">
<el-radio-group @change="otherChange" v-model="formData.other">
<el-radio v-for="item in resultOptions" :label="item.code" border>{{item.name}}
</el-radio>
</el-radio-group>
<template v-if="formData.other === 'determine'">
<el-radio label="emphasis" v-model="formData.determineTypeCode">重点</el-radio>
<el-radio label="ordinary" v-model="formData.determineTypeCode">普通</el-radio>
</template>
</el-form-item>-->
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="doBatchAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</el-dialog>
</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'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
proTableData: [],
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}
],
batchDialog: false,
batchSelection: [],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(310)
},
auditUrl: base + '/platform/proposal/transact/audit',
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '根据教代会的管理办法之规定,同意',
proposalName: '',
sign: '',
other: '',
determineTypeCode: '',
proposalCode: '',
createUser: ''
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
other: [{required: true, message: '请选择立案意见', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
},
resultOptions: [],
isNode: false,
nextStateCode: null
}
},
methods: {
async doSend() {
const confirm = await this.$confirm('此操作将会给执委会主任发送消息, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doSend", {meetingId: this.pageForm.meetingId})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
},
otherChange(code) {
if (code === "opinion") {
this.$set(this.formData, "opinion", "根据教代会的管理办法之规定,该提案作为意见建议")
} else if (code === "notGive") {
this.$set(this.formData, "opinion", "根据教代会的管理办法之规定,该提案不予立案")
} else {
this.$set(this.formData, "opinion", "根据教代会的管理办法之规定,同意该提案")
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openAudit(id, row) {
this.$refs.guava.edit()
this.$refs.audit.openView(id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
this.formData.proposalId = id
this.formData.proposalName = row.proposalName
this.formData.other = row.resultCode
this.formData.createUser = row.username
this.formData.proposalCode = row.proposalCode
switch (row.resultCode) {
case "notGive": {
this.formData.opinion = '根据教代会的管理办法之规定,同意不予立案。'
break
}
case "determine": {
this.formData.opinion = '根据教代会的管理办法之规定,同意立案。'
break
}
case "opinion": {
this.formData.opinion = '根据教代会的管理办法之规定,同意作为意见建议。'
break
}
}
this.$set(this.formData, 'other', row.resultCode)
this.$set(this.formData, 'determineTypeCode', row.determineTypeCode)
const res = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.proTableData = res.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
},
async batchAudit() {
if (this.batchSelection.length === 0) {
this.$notify.warning('请选择需要批量审核的记录')
return
}
this.formData.opinion = '根据教代会的管理办法之规定,同意提案委员会意见。'
this.batchDialog = true
},
async doAudit() {
const valid = await this.$refs["auditForm"].validate()
if (valid) {
const confirm = await this.$confirm('您是否提交审核意见?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/audit", {
audit: JSON.stringify(this.formData),
proposalIds: this.formData.proposalId,
sign: this.formData.sign,
determineTypeCode: this.formData.determineTypeCode
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
}
},
async doBatchAudit() {
const valid = await this.$refs["auditForm"].validate()
if (valid) {
const confirm = await this.$confirm('您是否提交审核意见?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
})
let proposalIds = []
if (this.batchSelection && this.batchSelection.length > 0) {
proposalIds = this.batchSelection.map(v => v.id)
}
const resp = await $.post(loc() + "/audit", {
audit: JSON.stringify(this.formData),
proposalIds: JSON.stringify(proposalIds),
sign: this.formData.sign,
determineTypeCode: this.formData.determineTypeCode
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.batchDialog = false
this.batchSelection = []
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
}
},
async rollback(id) {
const confirm = await this.$confirm('您确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/rollback', {proposalId: id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyError(resp.msg)
}
}
},
canRollBack(row) {
if (this.isNode) {
return this.nextStateCode === row.stateCode
} else {
return row.executorOpinion && row.stateCode < proposal.CASEUNIT && row.resultCode !== 'notGive'
}
},
},
async created() {
this.isNode = await proposal.getProposalIsNodeState(proposal.EXECUTORREAD)
this.nextStateCode = await proposal.getProposalNextNode(proposal.EXECUTORREAD)
await proposal.initData(this)
this.resultOptions = await getDictByCode("proposal_result")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,292 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch" title="反馈"></proposal-search>
<el-card class="mt20" shadow="never">
<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}" v-else-if="column.prop=='determineTypeCode'">
{{row.determineTypeCode === 'emphasis' ? '重点' :row.determineTypeCode === 'ordinary'?
'普通':'否'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
{{row.isConjoin?'是':'否'}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="300px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button @click="openFeedback(row)"
size="mini" type="primary"
v-if="[proposal.FEEDBACKSCORE].includes(row.stateCode)">反馈
</el-button>
<el-button @click="doExport(row)" size="mini" type="primary"
v-if="row.resultCode=='determine'&&row.stateCode==900">
导出反馈单
</el-button>
<el-button @click="doWithdraw(row)" size="mini" type="danger"
v-if="row.canRollBack">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="反馈评分" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="150px" ref="auditForm">
<vi-title title="反馈评分信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="反馈人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="反馈时间" prop="feedbackTime">
<el-input readonly v-model="formData.feedbackTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="承办满意度" prop="feedbackCode">
<el-radio-group v-model="formData.feedbackCode">
<el-radio :label="item.code" border v-for="item in feedbackOptions">{{item.name}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item class="is-required" label="反馈意见" prop="feedbackOpinion">
<div id="feedbackEditor"></div>
</el-form-item>
<el-form-item label="附件上传" prop="files">
<file-upload :files.sync="formData.files" card></file-upload>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="scoreSign" v-if="isSign()">
<sign :qz.sync="formData.scoreSign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doFeedback" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
let E = window.wangEditor
let feedbackEditor = null
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
let replyContentBrief = (rule, value, callback) => {
if (!this.formData.feedbackOpinion || !dd3s.html2txt(this.formData.feedbackOpinion)) {
callback(new Error('请填写反馈意见'));
} else {
callback();
}
};
return {
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(700)
},
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: 'resultName', 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: 'isConjoin', label: '是否并案'},
{prop: 'determineTypeCode', label: '是否重点'},
{prop: 'stateName', label: '提案状态', sortable: true},
],
organizerOptions: [],
feedbackOptions: [],
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
feedbackTime: moment().format('YYYY-MM-DD'),
feedbackCode: 'satisfied',
},
formRules: {
feedbackOpinion: [{validator: replyContentBrief, trigger: ['blur', 'change']}],
feedbackCode: [{required: true, message: '请选择承办满意度', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
switch (type) {
case 'view':
this.openView(data);
break;
case 'audit':
this.openFeedback(data);
break;
case 'withdraw':
this.doWithdraw(data);
break;
}
},
doExport(row) {
window.open(loc() + "/doExport?proposalId=" + row.id)
},
async doWithdraw(row) {
const confirm = await this.$confirm('您是否需要撤回该提案?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
const resp = await $.post(loc() + '/doWithdraw', {
proposalId: row.id
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openFeedback(row) {
this.formData.proposalId = row.id
this.organizerOptions = await proposal.findOrganizer(row.id)
this.$nextTick(() => {
$("#feedbackEditor").html("")
feedbackEditor = new E("#feedbackEditor")
feedbackEditor.config.onchange = (html) => {
this.formData.feedbackOpinion = html
}
feedbackEditor.create()
})
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doFeedback() {
this.$refs["auditForm"].validate(async (valid) => {
if (valid) {
const confirm = await this.$confirm('您是否提交反馈?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + '/doFeedback', {
feedback: JSON.stringify(this.formData),
scoreSign: this.formData.scoreSign
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
}
});
}
},
async created() {
await proposal.initData(this)
this.feedbackOptions = await getDictByCode("proposal_feedback")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,225 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch" title="批示"></proposal-search>
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @view="openView">
<template #column>
<el-table-column align="center" header-align="center" label="承办单位" width="200px">
<template scope="{row}">
<span>{{row.unitName}}({{row.undertakeType==1?'主办':'协办'}})</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="批示状态" width="80px">
<template scope="{row}">
<span class="text-success" v-if="row.isMakePass">已批示</span>
<span class="text-primary" v-else>待批示</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="100px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'audit',data:row}"
v-if="[proposal.SCHOOL_LEAD_AUDIT].includes(row.stateCode)">
批示
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</template>
<template #pagination>
<!--#include("/layouts/pagination.html"){}#-->
</template>
</proposal-table>
</template>
<template #edit>
<proposal-info handle label="分管校领导批示" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="分管校领导" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="批示时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="批示意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit(false)" type="danger">退 回</el-button>
<el-button :disabled="submitDisabled" @click="doAudit(true)" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
return {
isSign: false,
submitDisabled: false,
auditUrl: base + '/platform/proposal/transact/audit',
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: '',
isBack: false
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}]
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'audit') {
this.openAudit(data)
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openAudit(row) {
this.formData.proposalId = row.id
this.formData.replyUnitId = row.undertakeId
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit(flag) {
this.$refs["auditForm"].validate(async (valid) => {
if (valid) {
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(this.auditUrl + "/doAudit", {
audit: JSON.stringify(this.formData),
replyUnitId: this.formData.replyUnitId,
sign: this.formData.sign,
isBack: flag
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
});
},
doBack() {
this.formData.isBack = true
this.doAudit()
},
async openTask() {
const proposal_id = GetQueryString("proposal_id")
const biz_key = GetQueryString("biz_key")
if (proposal_id !== '' && biz_key !== '') {
const {data} = await $.post('/platform/proposal/common/getProposalStateCode', {proposal_id})
const loading = this.$loading({
lock: true,
text: '',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
if (data !== proposal.SCHOOL_LEAD_AUDIT) {
this.pageForm.isAudit = true
this.pageData()
setTimeout(() => {
this.openView({id: proposal_id})
loading.close()
}, 800)
} else {
setTimeout(() => {
this.openAudit({id: proposal_id, undertakeId: biz_key})
loading.close()
}, 800)
}
}
}
},
async created() {
await initData(proposal.SCHOOL_LEAD_AUDIT, this)
await this.openTask()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,412 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
.pro_table {
padding-left: 65px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="分管校领导审批答复">
<template #func>
<el-button @click="openSendMsg" icon="el-icon-message" size="small" type="primary"
v-if="pageForm.isAudit==false && (${@shiro.hasRole('sysadmin')||@shiro.hasRole('tamange')})">
发送消息
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
align="center"
header-align="center" row-key="replyId">
<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="openView(row)" type="primary">{{ row.proposalName }}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isLeaderAudit'">
<template
v-if="!row.caseCheckNeedSecondAudit || (row.caseCheckNeedSecondAudit && row.replyNumber===1)">
<span class="text-success" v-if="row.isLeaderAudit">已审核</span>
<span class="text-danger" v-else>未审核</span>
</template>
<template v-if="row.caseCheckNeedSecondAudit && row.replyNumber===2">
<span class="text-primary">未审核</span>
</template>
<template v-if="!row.caseCheckNeedSecondAudit && row.replyNumber===2">
<span class="text-primary">无需审核</span>
</template>
</template>
<template scope="{row}" v-else-if="column.prop=='determineTypeCode'">
{{row.determineTypeCode === 'emphasis' ? '重点' :row.determineTypeCode === 'ordinary'?
'普通':'否'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
{{row.isConjoin?'是':'否'}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="250px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<el-button
@click="openAudit(row)"
size="mini" type="primary"
v-if="(row.replyNumber===1 && !row.isLeaderAudit) || (row.caseCheckNeedSecondAudit && !row.isLeaderAudit && row.replyNumber > 1)">
审核
</el-button>
<el-button
@click="rollback(row)"
size="mini" type="primary"
v-if="[proposal.LEADERAUDIT, proposal.FEEDBACKSCORE].includes(row.stateCode)&&row.isLeaderAudit">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="分管校领导审核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title :title="proTableData.length > 1 ? '并案信息' : '提案信息'"></vi-title>
<el-form-item>
<el-table :data="proTableData" style="width: 100%"
tooltip-effect="dark">
<el-table-column align="left" header-align="left" label="提案编号"
prop="proposalCode"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人"
prop="username"
show-overflow-tooltip></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName"
show-overflow-tooltip>
<template slot-scope="{row}">
<span @click="openView(row)"
style="color: #236eb4; cursor: pointer; text-decoration: underline">{{row.proposalName}}</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
<vi-title title="审核信息"></vi-title>
<div style="text-align: center;margin-top: -40px;"
v-if="formData.auditUnderTakeList&&formData.auditUnderTakeList.length>1">
<span class="text-danger">温馨提醒:该提案的承办单位【{{formData.auditUnderTakeName}}】是由您来分管的,只需要审批一次即可。</span>
</div>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="leaderCheckOpinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.leaderCheckOpinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="leaderSign" v-if="isSign()">
<sign :qz.sync="formData.leaderSign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doRollBack" type="danger" v-if="isNode">退回
</el-button>
<el-button :disabled="submitDisabled" @click="doAudit(true)" type="primary">同意
</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
<el-dialog :visible.syn="msgDialog" title="发送消息提醒">
<el-table :data="receiverSmsUserList" max-height="600">
<el-table-column label="序号" type="index"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="手机号" prop="mobile"></el-table-column>
</el-table>
<el-row class="mt20" justify="end" type="flex">
<el-button @click="msgDialog=false">取消</el-button>
<el-button :disabled="receiverSmsUserList.length===0" @click="doSend" type="primary">确定</el-button>
</el-row>
</el-dialog>
</guava>
</div>
<script>
<!--#include("/platform/proposal/include/proposal_include.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
return {
prevNode: "",
proTableData: [],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(600)
},
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: 'isConjoin', label: '是否并案'},
{prop: 'determineTypeCode', label: '是否重点'},
{prop: 'underTakeNameUser', label: '分管校领导'},
{prop: 'underTakeName', label: '承办单位', sortable: false},
{prop: 'replyNumber', label: '答复次数', width: "80", sortable: false},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'isLeaderAudit', label: '审核状态', sortable: false},
],
// tableColumns: proposal_include.tableColumns.concat([{prop: 'underTakeName', label: '承办单位'},
// {prop: 'replyNumber', label: '答复次数'},
// {prop: 'isLeaderAudit', label: '审核状态'}]),
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
leaderCheckOpinion: '',
},
formRules: {
leaderCheckOpinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
},
isNode: false,
msgDialog: false,
receiverSmsUserList: []
}
},
methods: {
async openSendMsg() {
this.msgDialog = true
const resp = await $.post(loc() + "/findReceiverSmsUserList", {meetingId: this.pageForm.meetingId})
if (resp.code === 0) {
this.msgDialog = true
this.receiverSmsUserList = resp.data
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
},
async doSend() {
const confirm = await this.$confirm('此操作将会给分管领导发送消息, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doSend", {meetingId: this.pageForm.meetingId})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
},
async getLeaderAuditList(replyUnitId, proposalId) {
const {data} = await $.get("/platform/proposal/transact/branchLeaderRead/getBranchLeaderAuditList", {
replyUnitId: replyUnitId,
proposalId: proposalId
})
return data
},
async rollback(row) {
const confirm = await this.$confirm('您确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/rollback', {proposalId: row.id, replyUnitId: row.replyUnitId})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyError(resp.msg)
}
}
},
dropdownCommand(command) {
const {type, data} = command
switch (type) {
case 'view':
this.openView(data);
break;
case 'audit':
this.openAudit(data);
break;
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async doRollBack(row) {
const confirm = await this.$confirm('退回该提案到承办单位答复,请确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const resp = await $.post(loc() + '/doRollBack', {
proposalId: this.formData.proposalId,
replyId: this.formData.id,
replyUnitId: this.formData.replyUnitId,
leaderCheckOpinion: this.formData.leaderCheckOpinion
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
this.$refs.guava.index()
}
}
},
async openAudit(row) {
const {id, leaderCheckNumber, replyId, replyUnitId} = row
this.formData.proposalId = id
this.formData.id = replyId
this.formData.leaderCheckNumber = leaderCheckNumber ? leaderCheckNumber : 0
this.formData.replyUnitId = replyUnitId
const leaderAuditList = await this.getLeaderAuditList(replyUnitId, id)
const auditUnderTakeIdList = leaderAuditList.map(v => v.underTakeId)
const replyUnit = await proposal.findOrganizer(row.id)
const auditUnderTakeList = replyUnit.filter(v => auditUnderTakeIdList.includes(v.replyUnitId))
const auditUnderTakeName = auditUnderTakeList.map(v => v.unitName).join(",")
this.$set(this.formData, "auditUnderTakeName", auditUnderTakeName)
this.$set(this.formData, "auditUnderTakeList", auditUnderTakeList)
const resp = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.proTableData = resp.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit(flag) {
let formValid = true
this.$refs["auditForm"].validate(valid => {
formValid = valid
});
if (formValid) {
let a = this.formData.auditUnderTakeList.length > 1 ? '该提案的承办单位【' + this.formData.auditUnderTakeName + '】是由您来分管的,只需要审批一次即可' : '您是否提交审核意见?'
this.$confirm(a, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + '/doAudit', {
reply: JSON.stringify(this.formData),
leaderSign: this.formData.leaderSign,
flag: flag
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
loading.close()
this.submitDisabled = false
}).catch()
}
}
},
async created() {
this.isNode = await proposal.getProposalIsNodeState(600)
await proposal.initData(this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,68 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @search="doSearch"></proposal-search>
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @view="openView">
<template #column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="100px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
</template>
</el-table-column>
</template>
</proposal-table>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
return {
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false}
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
}
},
async created() {
await initData(null, this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,76 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @search="doSearch"></proposal-search>
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @view="openView">
<template #column>
<el-table-column align="center" header-align="center" label="承办单位" width="200px">
<template scope="{row}">
<span>{{row.underTakeName}}({{row.underTakeType==1?'主办':'协办'}})</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="doExport(row)" size="mini" type="primary">导出</el-button>
</template>
</el-table-column>
</template>
<template #pagination>
<!--#include("/layouts/pagination.html"){}#-->
</template>
</proposal-table>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
return {
pageForm: {searchName: 'proposalName'}
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
doExport(row) {
window.open('/platform/proposal/transact/underTakeRead/oneProposalExport?proposalId=' + row.id)
}
},
async created() {
await proposal.initData(this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,242 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="预审核">
<template #func>
<!--# if(@shiro.hasRole('jdhdbt01')){ #-->
<!-- <el-button v-if="!pageForm.isAudit" type="primary" size="small"-->
<!-- @click="batchExport">批量导出-->
<!-- </el-button>-->
<!--# } #-->
</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}" v-else-if="column.prop=='auditState'">
<span class="text-success" v-if="row.stateCode!=proposal.PREAUDIT">已审核</span>
<span class="text-primary" v-if="row.stateCode==proposal.PREAUDIT">待审核</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openAudit(row.id)"
size="mini"
type="primary" v-if="[proposal.PREAUDIT].includes(row.stateCode)">审核
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="预审核" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit(false)" type="danger">退回</el-button>
<el-button :disabled="submitDisabled" @click="doAudit(true)" type="primary">通过</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</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'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(proposal.DELEGATION)
},
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: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提案方式', sortable: true},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'auditState', label: '审核状态', sortable: true},
],
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD HH:mm:ss'),
opinion: '同意该提案!',
sign: ''
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
}
}
},
methods: {
batchExport() {
const {meetingId} = this.pageForm
if (!meetingId) {
this.$message.warning('请选择教代会届次')
return
}
window.open(loc() + '/batchExport?meetingId=' + meetingId)
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'audit') {
this.openAudit(data.id)
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openAudit(id) {
this.formData.proposalId = id
this.$refs.guava.edit()
this.$refs.audit.openView(id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit(flag) {
this.submitDisabled = true
let formValid = true
this.$refs["auditForm"].validate((valid) => {
formValid = valid
})
if (formValid) {
const flagText = flag ? '您是否要通过该提案?' : '该提案将退回至撰写人,修改后需重新邀请附议,请确认是否退回?'
this.$confirm(flagText, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
if (!flag) {
if (this.formData.opinion === '同意该提案!') {
this.formData.opinion = '退回该提案!'
}
}
const resp = await $.post(loc() + '/audit', {
audit: JSON.stringify(this.formData),
sign: this.formData.sign,
isPass: flag,
proposalId: this.formData.proposalId
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
loading.close()
this.submitDisabled = false
}).catch(() => {
this.submitDisabled = false
})
} else {
this.submitDisabled = false
}
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,393 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="校长、书记审核">
<template #func>
<el-button @click="doSend()" icon="el-icon-message" size="small" type="primary"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('tamange')}">发送消息
</el-button>
<el-button @click="batchAudit" icon="el-icon-s-promotion" size="small"
type="primary">批量审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :row-key="(row)=>{row.id}" :size="tableSize"
@selection-change="(val)=>{this.batchSelection = val}"
@sort-change="pageOrder"
align="center" header-align="center">
<el-table-column
:selectable="(row)=>{return row.secretaryOpinions==null && row.resultCode!='notGive'}"
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
: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}" v-else-if="column.prop=='determineTypeCode'">
{{row.determineTypeCode === 'emphasis' ? '重点' :row.determineTypeCode === 'ordinary'?
'普通':'否'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
{{row.isConjoin?'是':'否'}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">
查看
</el-button>
<el-button @click="openAudit(row)" size="mini"
type="primary"
v-if="row.secretaryOpinions==null && row.resultCode!='notGive'">
审阅
</el-button>
<el-button @click="rollback(row.id)" size="mini"
type="danger"
v-if="canRollBack(row)">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<proposal-info handle label="校长、书记审阅" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title :title="proTableData.length > 1 ? '并案信息' : '提案信息'"></vi-title>
<el-form-item>
<el-table :data="proTableData" style="width: 100%"
tooltip-effect="dark">
<el-table-column align="left" header-align="left" label="提案编号"
prop="proposalCode"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人"
prop="username"
show-overflow-tooltip></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName"
show-overflow-tooltip>
<template slot-scope="{row}">
<span @click="openView(row)"
style="color: #236eb4; cursor: pointer; text-decoration: underline">{{row.proposalName}}</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
<vi-title title="校长、书记审阅"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审阅人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审阅时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item prop="other" label="立案建议">-->
<!-- <el-radio-group v-model="formData.other">-->
<!-- <el-radio v-for="item in resultOptions" :label="item.code" border>{{item.name}}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="审阅意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
<el-dialog :close-on-click-modal="false" :visible.sync="batchDialog" title="批量批阅" top="50px" width="70%">
<vi-title title="已选提案"></vi-title>
<el-table :data="batchSelection" class="mb20" max-height="300">
<el-table-column label="序号" type="index"></el-table-column>
<el-table-column label="提案名称" prop="proposalName"></el-table-column>
<el-table-column label="提案人" prop="username"></el-table-column>
<el-table-column label="立案结果" prop="resultName"></el-table-column>
</el-table>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="校长、书记意见"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item prop="other" label="立案建议">-->
<!-- <el-radio-group v-model="formData.other">-->
<!-- <el-radio v-for="item in resultOptions" :label="item.code" border>{{item.name}}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="审阅意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的建议" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doBatchAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</el-dialog>
</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'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
data() {
return {
proTableData: [],
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: '是否并案'},
{prop: 'determineTypeCode', label: '是否重点'},
{prop: 'stateName', label: '提案状态', sortable: true}
],
batchDialog: false,
batchSelection: [],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(330)
},
auditUrl: base + '/platform/proposal/transact/audit',
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: '',
other: 'ordinary'
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}],
other: [{required: true, message: '请选择立案意见', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
},
resultOptions: [],
isNode: false
}
},
methods: {
async doSend() {
const confirm = await this.$confirm('此操作将会给承办单位分管领导发送消息, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doSend", {meetingId: this.pageForm.meetingId})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openAudit(row) {
this.formData.proposalId = row.id
this.$set(this.formData, "opinion", "同意该提案" + row.resultName)
const res = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.proTableData = res.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
},
async batchAudit() {
if (this.batchSelection.length === 0) {
this.$notify.warning('请选择需要批量审核的记录')
return
}
this.$set(this.formData, "opinion", "同意!")
this.batchDialog = true
},
async doAudit() {
this.submitDisabled = true
const valid = await this.$refs["auditForm"].validate()
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/audit", {
audit: JSON.stringify(this.formData),
proposalIds: this.formData.proposalId,
sign: this.formData.sign,
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
},
async doBatchAudit() {
const valid = await this.$refs["auditForm"].validate()
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
})
let proposalIds = []
if (this.batchSelection && this.batchSelection.length > 0) {
proposalIds = this.batchSelection.map(v => v.id)
}
const resp = await $.post(loc() + "/audit", {
audit: JSON.stringify(this.formData),
proposalIds: JSON.stringify(proposalIds),
sign: this.formData.sign,
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.batchDialog = false
this.batchSelection = []
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
},
async rollback(id) {
const confirm = await this.$confirm('您确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/rollback', {id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyError(resp.msg)
}
}
},
canRollBack(row) {
if (this.isNode) {
return this.nextStateCode === row.stateCode
} else {
return row.secretaryOpinions && row.stateCode < proposal.CASEUNIT && row.resultCode !== 'notGive'
}
}
},
async created() {
this.isNode = await proposal.getProposalIsNodeState(proposal.PRINCIPALREAD)
this.nextStateCode = await proposal.getProposalNextNode(proposal.PRINCIPALREAD)
await proposal.initData(this)
this.resultOptions = await getDictByCode("proposal_result")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,484 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch" title="答复"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="答复列表">
<template #tips>
<!-- <span>温馨提醒:协</span>-->
</template>
<template #func>
<el-button :disabled="proTableSelection.length===0" @click="forwardReply" size="small"
type="primary"
v-if="${@shiro.hasRole('T01') || @shiro.hasRole('sysadmin')}">转交答复
</el-button>
</template>
</table-tool>
<el-table :data="tableData"
:size="tableSize" :tree-props="{children: 'children'}"
@selection-change="handleSelectionChange" @sort-change="pageOrder"
align="center"
header-align="center"
ref="proTable" row-key="replyId">
<el-table-column
:selectable="(row)=>{return !row.isReply}"
reserve-selection
type="selection"
v-if="${@shiro.hasRole('T01') || @shiro.hasRole('sysadmin')}"
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"
: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=='isReply'">
<span class="text-success" v-if="row.isReply">已答复</span>
<span class="text-danger" v-else>未答复</span>
</template>
<template scope="{row}" v-else-if="column.prop=='determineTypeCode'">
{{row.determineTypeCode === 'emphasis' ? '重点' :row.determineTypeCode === 'ordinary'?
'普通':'否'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
{{row.isConjoin?'是':'否'}}
</template>
<template scope="{row}" v-else-if="column.prop==='isForward'">
<span class="text-primary" v-if="row.isForward">是({{row.proxyReplyUserName}}</span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column :width="200" align="center" fixed="right"
header-align="center"
label="操作">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<!-- <el-button @click="doHandleExport(row)" type="primary" size="mini"-->
<!-- v-if="pageForm.isAudit==null">-->
<!-- 导出办理单-->
<!-- </el-button>-->
<el-button @click="openAudit(row)" size="mini" type="primary" v-if="!row.isReply">答复
</el-button>
<!-- <el-button @click="doReplyExport(row)" type="primary" size="mini"-->
<!-- v-if="!pageForm.isAudit&&row.isReply">导出回复书-->
<!-- </el-button>-->
<el-button
@click="doRollBack(row)"
size="mini" type="danger"
v-if="row.isReply && ([proposal.LEADERAUDIT, proposal.UNITREPLY].includes(row.stateCode)) && row.leaderId == null">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit_func>
<el-button :disabled="submitDisabled" @click="doReply(true)" type="primary">保 存</el-button>
<el-button :disabled="submitDisabled" @click="doReply(false)" type="primary">提 交</el-button>
</template>
<template #edit>
<proposal-info handle label="答复信息" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title :title="proTableData.length > 1 ? '并案信息' : '提案信息'"></vi-title>
<el-form-item>
<el-table :data="proTableData" style="width: 100%"
tooltip-effect="dark">
<el-table-column align="left" header-align="left" label="提案编号"
prop="proposalCode"></el-table-column>
<el-table-column align="left" header-align="left" label="提案人"
prop="username"
show-overflow-tooltip></el-table-column>
<el-table-column align="left" header-align="left" label="提案名称" prop="proposalName"
show-overflow-tooltip>
<template slot-scope="{row}">
<span @click="openView(row)"
style="color: #236eb4; cursor: pointer; text-decoration: underline">{{row.proposalName}}</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
<vi-title title="答复信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="答复人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="答复时间" prop="replyTime">
<el-input readonly v-model="formData.replyTime"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="currentRowResultCode==='determine'">
<el-form-item label="落实情况" prop="implementState">
<el-radio-group v-model="formData.implementState">
<el-radio :label="o.name" border v-for="o in implementStates">{{o.name}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-form-item class="is-required" label="答复内容" prop="replyContent">
<div id="replyContentEditor"></div>
</el-form-item>
<el-form-item label="附件上传" prop="files">
<file-upload :files.sync="formData.replyFiles" card></file-upload>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="replySign" v-if="isSign()">
<sign :qz.sync="formData.replySign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doReply(true)" type="primary">保 存</el-button>
<el-button :disabled="submitDisabled" @click="doReply(false)" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
<el-dialog :close-on-click-modal="false" :visible.sync="forwardDialog" title="转交答复" top="50px" width="60%">
<vi-title title="已选提案"></vi-title>
<el-table :data="proTableSelection" max-height="350">
<el-table-column label="提案编号" prop="proposalCode"></el-table-column>
<el-table-column label="提案名称" prop="proposalName"></el-table-column>
<el-table-column label="承办单位" prop="underTakeName"></el-table-column>
<el-table-column label="承办类型" prop="undertakeType"></el-table-column>
<el-table-column label="转交情况" prop="isForward">
<template scope="{row}">
<span class="text-primary" v-if="row.isForward">是({{row.proxyReplyUserName}}</span>
<span v-else></span>
</template>
</el-table-column>
</el-table>
<vi-title class="mt10" title="转交用户"></vi-title>
<el-select
:remote-method="findSameUnitUser"
clearable
filterable
placeholder="请输入关键词"
remote
reserve-keyword
v-model="forwardUserSelection"
>
<el-option
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id"
v-for="item in forwardUserList">
</el-option>
</el-select>
<el-row class="mt20" justify="end" type="flex">
<el-button @click="forwardDialog = false">取消</el-button>
<el-button @click="confirmForwardReply" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
<!--#include("/platform/proposal/include/proposal_include.js"){}#-->
let E = window.wangEditor
let replyContentEditor = null
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
let replyContentBrief = (rule, value, callback) => {
if (!this.formData.replyContent || !dd3s.html2txt(this.formData.replyContent)) {
callback(new Error('请填写答复内容'));
} else {
callback();
}
};
return {
implementStates: [],
proTableData: [],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(500)
},
conJoinProposalName: "",
conJoinProposal: [],
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, checked: 0},
{prop: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0},
{prop: 'mannerName', label: '提案方式', sortable: true, checked: 0},
{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: '是否并案'},
{prop: 'determineTypeCode', label: '是否重点'},
{prop: 'underTakeName', label: '承办单位', sortable: false},
{prop: 'undertakeType', label: '承办类型', sortable: false},
{prop: 'replyNumber', label: '答复次数', width: "80", sortable: false},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'isForward', label: '转交答复', sortable: true},
// {prop: 'proxyReplyUserName', label: '转交答复人', sortable: true},
{prop: 'isReply', label: '答复状态', sortable: false},
],
submitDisabled: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
replyTime: moment().format('YYYY-MM-DD'),
implementState: '',
replySign: '',
proposalName: '',
proposalCode: '',
createUser: ''
},
formRules: {
replyContent: [{validator: replyContentBrief, trigger: ['blur', 'change']}],
implementState: [{required: true, message: '请选择落实情况', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}]
},
proTableSelection: [],
forwardDialog: false,
forwardUserList: [],
forwardUserSelection: null,
currentRowResultCode: null
}
},
methods: {
handleSelectionChange(val) {
this.proTableSelection = val
},
async findSameUnitUser(val) {
const resp = await $.get(loc() + '/findSameUnitUser/' + val)
if (resp.code === 0) {
this.forwardUserList = resp.data
// const d = resp.data.filter(x => {
// return !this.forwardUserList.map(v => v.id).includes(x.id)
// })
// this.forwardUserList = this.forwardUserList.concat(d)
}
},
forwardReply() {
this.forwardDialog = true
},
async confirmForwardReply() {
const params = this.proTableSelection.map(v => {
return {replyId: v.replyId, proposalId: v.id, proxyReplyUserId: this.forwardUserSelection}
})
const resp = await $.post(loc() + '/doForwardReply', {data: JSON.stringify(params)})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.$refs['proTable'].clearSelection()
this.doSearch()
this.forwardDialog = false
} else {
this.notifyError(resp.msg)
}
},
rollBack(row) {
if (row.isReply && ([proposal.LEADERAUDIT, proposal.UNITREPLY].includes(row.stateCode)) && row.leaderId == null) {
return true
}
},
doHandleExport(row) {
window.open(loc() + "/doHandleExport?proposalId=" + row.id)
},
doReplyExport(row) {
window.open(loc() + "/doReplyExport?proposalId=" + row.id)
},
async doRollBack(row) {
const confirm = await this.$confirm('正在撤回该提案的答复信息,请确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const resp = await $.post(loc() + "/doRollBack", {proposalId: row.id, replyUnitId: row.replyUnitId})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
}
}
},
dropdownCommand(command) {
const {type, data} = command
switch (type) {
case 'view':
this.openView(data)
break
case 'audit':
this.openAudit(data)
break
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async checkCanReply(proposalId, underTakeId) {
return await $.get(loc() + '/checkCanReply', {proposalId, underTakeId})
},
async openAudit(row) {
const {id, replyNumber, replyId, replyUnitId, leaderId, resultCode, replyContent, implementState} = row
this.currentRowResultCode = resultCode
const resp = await this.checkCanReply(id, replyUnitId)
if (resp.data.valid !== 0) {
this.notifyWarning(resp.data.msg)
return
}
const res = await $.get('/platform/proposal/common/findConjoinProposal', {proposalId: row.id})
this.proTableData = res.data.filter(o => {
return o.id !== row.id
})
this.proTableData.unshift(row)
const {data} = await $.post(loc() + "/getConJoinInfoList", {proposalId: id})
this.conJoinProposalName = data.map(v => v.proposalName).toString()
this.conJoinProposal = data
/*if (!leaderId && resultCode == "determine") {
this.$notify({
title: '警告',
message: '校领导暂未批示,领导批示后方可答复',
type: 'warning'
});
return
}*/
this.formData.proposalId = id
this.formData.id = replyId
this.formData.replyNumber = replyNumber
this.formData.implementState = implementState
this.formData.replyContent = replyContent
this.formData.replyUnitId = replyUnitId
this.formData.proposalName = row.proposalName
this.formData.createUser = row.username
this.formData.proposalCode = row.proposalCode
this.$nextTick(() => {
$("#replyContentEditor").html("")
replyContentEditor = new E("#replyContentEditor")
replyContentEditor.config.onchange = (html) => {
this.formData.replyContent = html
}
replyContentEditor.create()
if (replyContent) {
replyContentEditor.txt.html(replyContent)
} else {
if (resultCode === 'opinion') {
replyContentEditor.txt.html('建议已收悉,将作为相关工作的建议或参考')
this.formData.replyContent = '建议已收悉,将作为相关工作的建议或参考'
}
}
})
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doReply(isSave) {
try {
const valid = await this.$refs["auditForm"].validate()
if (!valid) {
return
}
const msg = this.conJoinProposal.length > 1 ? '提案' + this.conJoinProposalName + '已并案您只需答复一次,请确认?' : '您是否提交该提案的答复内容,请确认?'
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) {
return
}
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
})
const params = clone(this.formData)
params.isSave = isSave
const resp = await $.post(loc() + "/audit", params)
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
loading.close()
this.submitDisabled = false
} catch (e) {
console.log(e)
}
}
},
async created() {
this.implementStates = await getDictByCode("proposal_implementState")
await proposal.initData(this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,244 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table__expand-icon {
color: #de194f;
}
.el-table__expand-icon > .el-icon-arrow-right {
font-weight: 600;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :has_seconded="false" :page="pageForm" @search="doSearch" title="附议"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="附议提案">
<template #func>
<!--# if(@shiro.hasRole('sysadmin')){ #-->
<el-button @click="oneClickReminder" size="small" type="primary">一键提醒</el-button>
<!--# } #-->
</template>
</table-tool>
<el-table :data="tableData" :key="tableKey" :size="tableSize" :tree-props="{children: 'children'}"
@sort-change="pageOrder"
row-key="secondedId"
style="width: 100%"
v-loading="tableLoading"
>
<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}" v-else-if="column.prop=='isAgree'">
<span class="text-primary" v-if="row.isAgree==undefined">未附议</span>
<span class="text-danger" v-if="row.isAgree==false">不同意</span>
<span class="text-success" v-if="row.isAgree==true">同意</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="150">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openAudit(row)" size="mini" type="primary"
v-if="[proposal.UNSUBMIT,150].includes(row.stateCode) && row.isAgree==null">
附议
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<!-- <template #edit_func>
<el-button :disabled="subDis" icon="el-icon-close" @click="doAudit(false)">拒绝</el-button>
<el-button type="primary" :disabled="subDis" icon="el-icon-check" @click="doAudit(true)">同意</el-button>
</template>-->
<template #edit>
<proposal-info handle label="附议" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="签&emsp;字" prop="seconderSign" v-if="isSign()">
<sign :qz.sync="formData.seconderSign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="subDis" @click="doAudit(false)" icon="el-icon-close">拒绝</el-button>
<el-button :disabled="subDis" @click="doAudit(true)" icon="el-icon-check" type="primary">
同意
</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</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'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue'),
},
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: 'typeName', label: '提案类型', sortable: true},
{prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0},
{prop: 'meetingName', label: '届次', sortable: true},
{prop: 'delegationName', label: '代表团', sortable: true},
{prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'secondedUserName', label: '附议人', sortable: true},
{prop: 'isAgree', label: '附议状态', sortable: true},
],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(proposal.INVIRTE)
},
subDis: false,
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD HH:mm:ss'),
seconderSign: ""
},
formRules: {
implementUnitId: [{required: true, message: '请选择建议落实部门', trigger: ['blur', 'change']}],
seconderSign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}],
},
}
},
methods: {
async oneClickReminder() {
const confirm = await this.$confirm('您确定要一键提醒吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const resp = await $.post(loc() + '/oneClickReminder', {meetingId: this.pageForm.meetingId})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
async load(tree, treeNode, resolve) {
const {id, secondedId} = tree
const resp = await $.get(loc() + "/getSecondedList", {id: id, secondedId: secondedId})
if (resp.code === 0) {
resolve(resp.data)
} else {
resolve([])
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openAudit(row) {
this.formData.secondedId = row.secondedId
this.formData.proposalId = row.id
this.formData.delegationId = row.delegationId
this.formData.proposalName = row.proposalName
this.formData.createUser = row.createUser
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
},
async doAudit(flag) {
const flagText = flag ? '同意' : '拒绝'
const msgRes = await this.$confirm('您是否要' + flagText + '该提案?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (msgRes === 'confirm') {
this.subDis = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doAudit", {
secondedId: this.formData.secondedId,
proposalId: this.formData.proposalId,
proposalName: this.formData.proposalName,
createUser: this.formData.createUser,
flag: flag,
seconderSign: this.formData.seconderSign
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
} else {
this.$notify.error({title: '失败', message: resp.msg});
}
loading.close()
this.subDis = false
}
}
},
async created() {
await proposal.initData(this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,271 @@
<!--#
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">
<div class="search">
<div class="search-item">
<div class="search-item-label">教代会:</div>
<div class="search-item-option">
<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>
</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-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>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="提案信息">
</table-tool>
<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>-->
<el-button @click="openView(row)" 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 {
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, sortable: true},
{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: {
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-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :audit="false" :page="pageForm" @search="doSearch"></proposal-search>
<el-card class="mt20" shadow="never">
<table-tool :app="this" label="承办单位阅览">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :key="tableKey" :load="load"
:size="tableSize"
:tree-props="{hasChildren: 'hasUnderTakeRead'}"
@sort-change="pageOrder"
lazy
row-key="prId"
style="width: 100%"
v-loading="tableLoading"
>
<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}" v-else-if="column.prop=='underTakeOpinion'">
<i class="fa fa-circle text-danger ml5" v-if="row.canTake==0"></i>
<i class="fa fa-circle text-success ml5" v-else></i>
</template>
<template scope="{row}" v-else-if="column.prop=='underTakeName'">
<span>{{row.underTakeName}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='underTakeType'">
<span>{{row.underTakeType==1?'主办':'协办'}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='isConjoin'">
<span :style="row.isConjoin ? 'color: #236eb4' : ''">{{[proposal.CASE].includes(row.stateCode) ? '暂无' : row.isConjoin ? '是' : '否'}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='determineTypeCode'">
<span>
{{[proposal.CASE].includes(row.stateCode) ? '暂无' : !row.determineTypeCode ? '否' : row.determineTypeCode === 'emphasis' ? '重点' : '普通'}}
</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" fixed header-align="center" label="操作" width="250">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary" v-if="row.stateCode <= 400">
承办意见
</el-button>
<el-button @click="doExport(row)" 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>
<template #edit>
<proposal-info handle label="承办单位提出意见" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-form-item label="承办单位">
<el-input readonly v-model="formData.underTakeName"></el-input>
</el-form-item>
<el-form-item label="承办意向" prop="resultCode">
<el-radio-group @change="resultCodeChange" v-model="formData.resultCode">
<el-radio :label="true" border>可以承办</el-radio>
<el-radio :label="false" border>无法承办</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="理由" prop="opinion">
<el-input maxlength="500" placeholder="请填写您的理由" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="$refs.guava.index()">返回</el-button>
<el-button @click="doAudit" type="primary">提交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
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: '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: 'determineTypeCode', label: '是否重点', sortable: true},
{prop: 'stateName', label: '提案状态', sortable: true},
{prop: 'underTakeName', label: '承办单位', sortable: false},
{prop: 'underTakeType', label: '承办类型', sortable: false},
{prop: 'underTakeOpinion', label: '承办意见', sortable: false},
],
pageForm: {searchName: 'proposalName'},
formData: {},
formRules: {
resultCode: [{required: true, message: '请选择承办意向', trigger: ['blur', 'change']}],
opinion: [{required: true, message: '请输入承办意见', trigger: ['blur', 'change']}],
}
}
},
methods: {
async load(tree, treeNode, resolve) {
const {id, prId} = tree
const resp = await $.get(loc() + "/getUnderTakeReadList", {id: id, prId: prId})
requestLaterFun(resp, (data) => {
resolve(data)
}, () => {
resolve([])
})
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
async openEdit(row) {
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
this.formData.id = row.id
this.formData.underTakeId = row.underTakeId
this.formData.underTakeName = row.underTakeName
const opinionData = await $.get(loc() + '/getUnderTakeFirstOpinion', {
proposalId: row.id,
underTakeId: row.underTakeId
})
if (opinionData.data) {
this.$set(this.formData, 'opinion', opinionData.data.opinion)
this.$set(this.formData, 'resultCode', opinionData.data.canTake)
} else {
this.$set(this.formData, 'opinion', null)
this.$set(this.formData, 'resultCode', null)
}
},
async resultCodeChange() {
if (this.formData.resultCode) {
this.formRules.opinion[0].required = false
} else {
this.formRules.opinion[0].required = true
}
const valid = await this.$refs['auditForm'].validate()
},
async doAudit() {
const valid = await this.$refs['auditForm'].validate()
if (valid) {
const confirm = await this.$confirm('您确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/doAudit', this.formData)
if (resp.code === 0) {
this.$refs.guava.index()
this.notifySuccess(resp.msg)
this.pageData()
}
}
}
},
doExport(row) {
window.open('/platform/proposal/statistics/summary/oneProposalExport?proposalId=' + row.id)
}
},
async created() {
await proposal.initData(this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,189 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<proposal-search :page="pageForm" @search="doSearch" title="签署"></proposal-search>
<proposal-table :data="tableData" :loading="tableLoading" :page="pageForm"
@order="pageOrder" @view="openView">
<template #column>
<el-table-column align="center" header-align="center" label="承办单位" width="200px">
<template scope="{row}">
<span>{{row.unitName}}({{row.undertakeType==1?'主办':'协办'}})</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="签署状态" width="80px">
<template scope="{row}">
<span class="text-success" v-if="row.isMakePass">已签署</span>
<span class="text-primary" v-else>待签署</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="100px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item
:command="{type:'audit',data:row}"
v-if="[proposal.SCHOOL_LEAD_UNDERSIGN].includes(row.stateCode)">
签署
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</template>
</proposal-table>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<proposal-info handle label="校领导签署意见" ref="audit">
<template #handle>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="auditForm">
<vi-title title="审核信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="1000" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.opinion"></el-input>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字" prop="sign" v-if="isSign">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-row style="margin: 40px 0;text-align: right">
<el-button :disabled="submitDisabled" @click="doAudit" type="primary">提 交</el-button>
</el-row>
</el-form>
</template>
</proposal-info>
</template>
<template #view>
<proposal-info ref="info"></proposal-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'proposal-info': httpVueLoader('/components/proposal/ProposalInfo.vue'),
'proposal-search': httpVueLoader('/components/proposal/ProposalSearch.vue'),
'proposal-table': httpVueLoader('/components/proposal/ProposalTable.vue')
},
data() {
return {
isSign: false,
submitDisabled: false,
auditUrl: base + '/platform/proposal/transact/audit',
pageForm: {searchName: 'proposalName', isAudit: false},
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: ''
},
formRules: {
opinion: [{required: true, message: '请输入审核意见', trigger: ['blur', 'change']}]
}
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'audit') {
this.openAudit(data)
}
},
openView(row) {
this.$refs.guava.view()
this.$refs.info.openView(row.id)
},
openAudit(row) {
this.formData.proposalId = row.id
this.formData.replyUnitId = row.undertakeId
this.$refs.guava.edit()
this.$refs.audit.openView(row.id)
if (this.$refs['auditForm']) {
this.$refs['auditForm'].resetFields()
}
},
async doAudit() {
this.$refs["auditForm"].validate(async (valid) => {
if (valid) {
this.submitDisabled = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(this.auditUrl + "/doAudit", {
audit: JSON.stringify(this.formData),
replyUnitId: this.formData.replyUnitId,
sign: this.formData.sign
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.pageData()
this.$refs.guava.index()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.submitDisabled = false
})
}
});
}
},
async created() {
await initData(proposal.SCHOOL_LEAD_UNDERSIGN, this)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,783 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-select {
width: 100%;
}
.remindTextArea textarea {
resize: none;
}
.remindClass {
width: 100%;
white-space: break-spaces;
font-size: 14px;
line-height: 25px;
background-color: white;
max-height: 600px;
overflow-y: scroll;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<template #header>
<h3 style="color: #1867b0">撰写提案</h3>
</template>
<template>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="代表姓名" prop="username">
<el-input readonly type="text" v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提案时间" prop="createTime">
<el-input readonly type="text" v-model="formData.createTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案名称" prop="proposalName">
<el-input maxlength="100" placeholder="提案名称"
v-model="formData.proposalName"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="撰写提案方式" prop="mannerCode">
<el-radio :key="item.id" :label="item.code" border
size="medium"
v-for="item in mannerList" v-model="formData.mannerCode">
{{item.name}}
</el-radio>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex" v-if="false">
<el-col :span="12">
<el-form-item label="所属教代会" prop="teacherMeetingId">
<el-select @change="meetingChange" clearable filterable
placeholder="所属教代会"
v-model="formData.teacherMeetingId">
<el-option :key="item.id" :label="item.jdhallname"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属代表团" prop="delegationId" v-if="formData.mannerCode!='W03'">
<el-select clearable filterable placeholder="所属代表团" v-model="formData.delegationId">
<el-option :key="item.id" :label="item.dbtname"
:value="item.id"
v-for="item in delegationOptions">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="所属委员会" prop="committeeId" v-if="formData.mannerCode=='W03'">
<el-select clearable filterable placeholder="所属委员会" v-model="formData.committeeId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in committeeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="提案类型" prop="typeId">
<el-select clearable filterable placeholder="提案类型"
v-model="formData.typeId">
<el-option
:key="item.id"
:label="item.typeName"
:value="item.id"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<!-- <el-form-item label="建议落实部门" prop="implementUnitId">-->
<!-- <el-select clearable filterable placeholder="建议落实部门"-->
<!-- v-model="formData.implementUnitId">-->
<!-- <el-option-->
<!-- :key="item.id"-->
<!-- :label="item.unitName"-->
<!-- :value="item.id"-->
<!-- v-for="item in unitOptions">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
</el-col>
</el-row>
<el-form-item class="is-required" label="案&emsp;&emsp;由" prop="brief">
<div id="briefEditor"></div>
</el-form-item>
<el-form-item class="is-required" label="建议措施" prop="measures">
<div id="measuresEditor"></div>
</el-form-item>
<el-form-item label="附件上传" prop="files">
<file-upload :files.sync="formData.files" card></file-upload>
</el-form-item>
<el-form-item label="签&emsp;字" prop="sign" v-if="isSign()">
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-form-item>
<el-row justify="center" type="flex">
<el-button @click="doAdd" type="primary" v-throttle>保存到我的提案</el-button>
<el-button @click="openSeconded" type="primary" v-if="formData.mannerCode=='W01'">邀请附议人
</el-button>
<el-button @click="doSubmit" type="primary" v-if="formData.mannerCode!='W01'">提交
</el-button>
</el-row>
</el-form-item>
</el-form>
</template>
</el-card>
</template>
<!-- <template #public>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input clearable placeholder="请输入内容" v-model="pageForm2.searchKeyword">
<el-select placeholder="查询" slot="prepend" style="width: 100px;"
v-model="pageForm2.searchName">
<el-option label="工号" value="u.loginname"></el-option>
<el-option label="姓名" value="u.username"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-select @change="jdhChange" clearable filterable placeholder="请选择届次" v-model="pageForm2.jdhid">
<el-option
:key="item.id"
:label="item.jdhallname"
:value="item.id"
v-for="item in jdhList">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-select @change="delegationChange" clearable filterable placeholder="请选择代表团"
v-model="pageForm2.dbtid">
<el-option
:key="item.id"
:label="item.dbtname"
:value="item.id"
v-for="item in delegations">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-select
@change="unitList = allUnitList.filter(v => pageForm2.unionid?v.unionid === pageForm2.unionid:true)"
clearable filterable placeholder="请选择工会"
v-model="pageForm2.unionid">
<el-option
:key="item.id"
:label="item.unionname"
:value="item.id"
v-for="item in unionList">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-select clearable filterable placeholder="请选择单位" v-model="pageForm2.unitid">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitList">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-button @click="queryDb" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="btn-group tool-button mt5">
<el-radio-group @change="queryDb" v-model="pageForm2.isAudit">
<el-radio-button :label="true">已邀请({{secondedNum}}</el-radio-button>
<el-radio-button :label="false">待邀请</el-radio-button>
</el-radio-group>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="邀请附议人">
<template #label_end>
<el-button @click="addSeconded(0)" class="ml20" plain type="primary" v-if="!pageForm2.isAudit">
批量邀请
</el-button>
</template>
<template #func>
<span>
温馨提醒:请选择
<span style="color:red;font-size: 16px;font-weight: bold">
{{config.seconderNum ? config.seconderNum : 0}}
</span>
位附议人,否则无法提交提案!
</span>
</template>
</table-tool>
<el-table :data="dBTableData" :size="tableSize" @selection-change="handleSelectionChange"
class="vi-table" ref="multipleTable" row-key="id" style="width: 100%"
v-loading="dBTableDataLoading">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{ scope.$index + (pageForm2.pageNumber - 1) * pageForm2.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in dBTableColumns"
>
<template scope="{row:{isAgree}}" v-if="column.prop=='isAgree'">
<template v-if="typeof isAgree === 'undefined'">
<span class="text-success">待邀请</span>
</template>
<template v-else>
<span class="text-info" v-if="isAgree == null">未附议</span>
<span class="text-danger" v-if="isAgree == false">不通过</span>
<span class="text-success" v-if="isAgree == true">通过</span>
</template>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" v-if="!pageForm2.isAudit"
width="100">
<template slot-scope="{row}">
<el-button @click="addSeconded(row.id)" size="mini">邀请</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
:current-page="pageForm2.pageNumber"
:page-size="pageForm2.pageSize"
:page-sizes="[5,10, 20, 30, 50]"
:total="pageForm2.totalCount"
@current-change="pageNumberChange2"
@size-change="pageSizeChange2"
layout="total, sizes, prev, pager, next">
</el-pagination>
</el-row>
</el-card>
</template>-->
</guava>
<el-dialog :close-on-click-modal="false" :visible.sync="writeRemindDialog" title="撰写须知" top="50px" width="60%">
<!-- <pre class="remindClass">-->
<!-- {{config.writeRemind}}-->
<!-- </pre>-->
<el-input
:autosize="{ minRows: 10, maxRows: 30}"
class="remindTextArea"
readonly
type="textarea"
v-model="config.writeRemind">
</el-input>
<!-- <div v-html="config.writeRemind"></div>-->
<div class="text-center" slot="footer">
<el-button @click="writeRemindDialog = false" type="primary">我已知晓</el-button>
</div>
</el-dialog>
</div>
<script>
const E = window.wangEditor
let briefEditor, measuresEditor = null
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
const validBrief = (rule, value, callback) => {
if (!this.formData.brief || !dd3s.html2txt(this.formData.brief)) {
callback(new Error('请填写提案内容、案由和案据'));
} else if (dd3s.html2txt(this.formData.brief).length < this.config.words) {
callback(new Error('提案内容至少需要' + this.config.words + '字'));
// callback();
} else {
callback();
}
};
const validMeasures = (rule, value, callback) => {
if (!this.formData.measures || !dd3s.html2txt(this.formData.measures)) {
callback(new Error('请填写提案实施的可行性建议'));
} else {
callback();
}
};
return {
pageForm2: {
searchName: 'u.username',
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
isAudit: false,
jdhid: '',
dbtid: '',
unionid: '',
unitid: ''
},
jdhList: [],
delegations: [],
userOptions: [],
unionList: [],
unitList: [],
secondedNum: 0,
dBTableDataLoading: false,
dBTableData: [],
secondedFormData: {users: []},
secondedDialog: false,
userLoading: false,
subDisabled: false,
secondedTableData: [],
config: {},
formData: {
sign: ''
},
meetingOptions: [],
typeOptions: [],
unitOptions: [],
allMannerList: [],
mannerList: [],
delegationOptions: [],
committeeOptions: [],
formRules: {
username: [{required: true, message: '请填写提案人', trigger: ['blur', 'change']}],
createTime: [{required: true, message: '请填写提案时间', trigger: ['blur', 'change']}],
proposalName: [{required: true, message: '请填写提案名称', trigger: ['blur', 'change']}],
mannerCode: [{required: true, message: '请选择提案方式', trigger: ['blur', 'change']}],
delegationId: [{required: true, message: '请选择所属代表团', trigger: ['blur', 'change']}],
teacherMeetingId: [{required: true, message: '请选择所属教代会', trigger: ['blur', 'change']}],
committeeId: [{required: true, message: '请选择所属委员会', trigger: ['blur', 'change']}],
/*typeId: [{required: true, message: '请选择提案类型', trigger: ['blur', 'change']}],*/
implementUnitId: [{required: false, message: '请选择建以落实部门', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请扫描二维码进行签字', trigger: ['blur', 'change']}],
brief: [{validator: validBrief, trigger: ['blur', 'change']}],
measures: [{validator: validMeasures, trigger: ['blur', 'change']}],
},
dBTableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true},
{prop: 'mobile', label: '联系方式'},
{prop: 'dbUnitName', label: '所属单位'},
{prop: 'dbUnionName', label: '所属工会'},
{prop: 'jdhAllName', label: '届次', sortable: true},
{prop: 'dbtName', label: '代表团', sortable: true},
{prop: 'isAgree', label: '附议状态', sortable: true},
],
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(proposal.UNSUBMIT)
},
writeRemindDialog: false
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue')
},
methods: {
async doAdd() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
let data = clone(this.formData)
if (data.files) {
data.files = JSON.stringify(data.files)
}
$.post('/platform/proposal/transact/compose' + method, {
data: JSON.stringify(data),
sign: data.sign
}).then(res => {
if (res.code == 0) {
loading.close()
this.$notify.success({title: '成功', message: res.msg});
sublime.jumpPagePjax('/platform/proposal/transact/compose')
} else {
this.$notify.error({title: '失败', message: res.msg});
}
})
loading.close()
}
});
},
async doSubmit() {
const valid = await this.$refs["addForm"].validate()
if (valid) {
const confirm = await this.$confirm('确定要提交此提案吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'info',
})
if ("confirm" === confirm) {
let data = clone(this.formData)
if (data.files) {
data.files = JSON.stringify(data.files)
}
const resp = await $.post(loc() + "/doSubmit", {
data: JSON.stringify(data)
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg})
sublime.jumpPagePjax('/platform/proposal/transact/compose')
}, () => {
this.$notify.warning({title: '警告', message: resp.msg})
})
}
}
},
handleSelectionChange(val) {
this.dbUserSelection = val.map(v => v.id);
},
pageNumberChange2(val) {
this.pageForm2.pageNumber = val;
this.queryDb();
},
pageSizeChange2(val) {
this.pageForm2.pageSize = val;
this.queryDb();
},
async delegationChange(val) {
this.unionList = await getUnions(val)
},
async jdhChange(val) {
this.delegations = await getDbt(val)
},
async queryDb() {
const {jdhid, dbtid, unionid, unitid, proposalId} = this.pageForm2
const data = await $.get("/platform/proposal/transact/compose/queryDb", {
...this.pageForm2,
pageForm2: this.pageForm2,
proposalId: proposalId,
jdhid: jdhid,
dbtid: dbtid,
unionid: unionid,
unitid: unitid
})
sublime.closeLoadingbar();
this.dBTableDataLoading = false
if (data.code == 0) {
this.dBTableData = data.data.list;
if (data.data.list[0].secondedNum != undefined) {
this.secondedNum = data.data.list[0].secondedNum
}
this.pageForm2.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
},
async openSeconded() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
const valid = await this.$refs["addForm"].validate()
if (valid) {
let data = clone(this.formData)
if (data.files) {
data.files = JSON.stringify(data.files)
}
const resp = await $.post('/platform/proposal/transact/compose' + method, {
data: JSON.stringify(data),
sign: data.sign
})
sublime.jumpPagePjax('/platform/proposal/transact/compose?operation=invite&id=' + resp.data)
}
// if (this.formData.id == "") {
// this.$notify.warning({title: '警告', message: "请先保存后在邀请附议人"});
// return
// }
// this.pageForm2.proposalId = this.formData.id
// this.pageForm2.proposalName = this.formData.proposalName
// await this.queryDb()
// this.$refs.guava.public()
/* this.secondedFormData = {
proposalId: this.formData.id,
users: [],
}
this.secondedData()
this.userOptions = []
this.userLoading = false
this.secondedDialog = true*/
},
async secondedData() {
const {data} = await $.get("/platform/proposal/transact/compose/getSecondedData", {proposalId: this.secondedFormData.proposalId})
this.secondedTableData = data
},
async userRemoteMethod(query) {
if (query) {
this.userLoading = true
const arr = await this.queryUser(this.secondedFormData.proposalId, query)
this.userOptions = this.userOptions.filter(v => {
return this.secondedFormData.users.includes(v.id)
}).concat(arr.filter(v => {
return !this.secondedFormData.users.includes(v.id)
}));
this.userLoading = false
}
},
async queryUser(proposalId, query) {
const {data} = await $.get("/platform/proposal/transact/compose/queryDelegate", {proposalId, query})
return data
},
async addSeconded(id) {
const {proposalName, proposalId} = this.pageForm2
if (id === 0 && this.dbUserSelection.length === 0) {
this.$message.warning('请先选择附议人后再点击邀请按钮')
return
}
if (id != 0) this.dbUserSelection = [].concat(id)
let aa = "请确认所选代表是否作为本提案的附议人?"
if (this.dBTableData[0].secondedNum >= this.config.seconderNum) aa = "您已邀请了" + this.dBTableData[0].secondedNum + " 名附议人,是否继续邀请?"
const confirm = await this.$confirm(aa + '确定后会有信息通知!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post("/platform/proposal/transact/compose/addSeconded", {
proposalId: proposalId,
proposalName: proposalName,
users: JSON.stringify(this.dbUserSelection),
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: '邀请附议人成功'});
this.$refs.multipleTable.clearSelection();
this.queryDb()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
})
}
/* if (this.secondedFormData.users.length === 0) {
this.$message.warning('请先选择附议人后再点击邀请按钮')
return
}
this.$confirm('确认邀请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.subDisabled = true
const {proposalId, users, proposalName} = this.secondedFormData
const resp = await $.post(loc() + "/addSeconded", {
proposalId: proposalId,
proposalName: proposalName,
users: JSON.stringify(users)
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: '邀请附议人成功'});
this.userOptions = []
this.secondedFormData.users = []
this.secondedData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.subDisabled = false
})
}).catch(() => {
});*/
},
async getDictByCode() {
const {data} = await $.get("/platform/proposal/basics/config/getDictByCode", {code: "proposal_manner"})
return data
},
async initData() {
this.config = await proposal.getProposalConfig()
this.meetingOptions = await proposal.getOpenMeeting()
this.typeOptions = await proposal.getProposalType()
this.unitOptions = await proposal.getProposalUndertake()
this.allMannerList = await this.getDictByCode("proposal_manner");
this.pageForm.teacherMeetingId = this.meetingOptions ? this.meetingOptions[0].id : null
this.jdhList = await getAllJdh()
if (this.jdhList.length > 0) {
this.pageForm2.jdhid = this.jdhList[0].id
this.delegations = await getDbt(this.jdhList[0].id)
}
this.unionList = await getUnion();
this.allUnitList = await getUnit();
this.unitList = clone(this.allUnitList);
if (this.meetingOptions.length === 0) {
this.notifyWarning('当前没有开启的教代会,无法撰写提案!')
return
}
this.delegationOptions = await proposal.getDelegation(this.pageForm.teacherMeetingId)
// this.committeeOptions = await proposal.getCommittee(this.pageForm.teacherMeetingId)
const {teacherMeetingId} = this.pageForm
const data = await proposal.getDelegationId(teacherMeetingId)
const jgcy = await $.post(loc() + "/getJdhJgcy", {jdhid: teacherMeetingId})
const cbdwFzr = await $.post(loc() + "/getCbdwFzr")
if (jgcy.data > 0) {
const jgName = await $.post(loc() + "/getJgNameByuser")
this.committeeOptions = jgName.data
}
if (this.allMannerList.length > 0) {
this.config.manner.forEach(v => {
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('jdhdb01')}" === 'true' && v === "W01") {
this.mannerList.push(this.allMannerList.find(z => z.code == v))
}
if ("${@shiro.hasRole('sysadmin')||(@shiro.hasRole('jdhdb01')&&@shiro.hasRole('jdhdbt01'))}" === 'true' && v === "W02") {
this.mannerList.push(this.allMannerList.find(z => z.code == v))
}
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('jdhdb01')}" === 'true' && v === "W03" && jgcy.data > 0) {
this.mannerList.push(this.allMannerList.find(z => z.code == v))
}
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('jdhdb01')}" === 'true' && v === "W04" && cbdwFzr.data > 0) {
this.mannerList.push(this.allMannerList.find(z => z.code == v))
}
})
}
this.formData = {
username: '${@shiro.getPrincipalProperty("username")}',
createTime: moment().format('YYYY-MM-DD'),
teacherMeetingId: teacherMeetingId,
delegationId: data ? data.dbtid : '',
id: '',
sign: '',
mannerCode: 'W01'
}
this.$nextTick(() => {
$("#briefEditor").html("")
$("#measuresEditor").html("")
briefEditor = new E("#briefEditor")
briefEditor.config.onchange = (html) => {
this.formData.brief = html
}
measuresEditor = new E("#measuresEditor")
measuresEditor.config.onchange = (html) => {
this.formData.measures = html
}
briefEditor.create()
measuresEditor.create()
})
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
const id = GetQueryString("proposalId")
if (id) {
await this.editProposal()
} else {
if (this.config.writeRemind) {
this.writeRemindDialog = true
}
}
// await this.editProposal()
},
async editProposal() {
const id = GetQueryString("proposalId")
if (id) {
const resp = await $.get("/platform/proposal/transact/compose/findOne", {id})
if (resp.data.files) {
resp.data.files = JSON.parse(resp.data.files)
}
this.formData = resp.data
this.$nextTick(() => {
briefEditor.txt.html(resp.data.brief)
measuresEditor.txt.html(resp.data.measures)
})
}
},
async meetingChange(val) {
this.formData.delegationId = null
this.formData.committeeId = null
this.delegationOptions = await proposal.getDelegation(val)
// this.committeeOptions = await proposal.getCommittee(val)
},
},
created() {
this.initData()
}
})
</script>
<!--#
}
#-->