Files
zhgh_hmc/src/main/resources/static/components/proposal/ProposalInfo.vue
T
2026-02-26 13:47:12 +08:00

578 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<el-tab-plus :tabs="tabs" :h="elTabPlusScrollHeight" ref="etp">
<template #basic-info>
<el-descriptions border class="custom-desc">
<el-descriptions-item label="提案名称" span="3">
<div style="font-weight:bold;">
{{ viewData.proposalName }}
</div>
</el-descriptions-item>
<el-descriptions-item label="提案编号">{{ viewData.proposalCode }}</el-descriptions-item>
<el-descriptions-item label="提案人">{{
viewData.createUserName + "-" + viewData.loginname
}}
</el-descriptions-item>
<el-descriptions-item label="提案时间">{{ viewData.createTime }}</el-descriptions-item>
<el-descriptions-item label="教代会届次"> {{ viewData.meetingName || "暂无" }}</el-descriptions-item>
<el-descriptions-item label="提案人工会">{{ viewData.unionName }}</el-descriptions-item>
<el-descriptions-item :label="viewData.mannerCode!=='W03'?'代表团名称':'委员会名称'">
{{ viewData.mannerCode !== "W03" ? viewData.delegationName : viewData.committeeName }}
</el-descriptions-item>
<el-descriptions-item label="提案类型">{{ viewData.typeName }}</el-descriptions-item>
<el-descriptions-item label="立案结果" span="2"> {{
viewData.resultName ? viewData.resultName : "暂无"
}}
</el-descriptions-item>
<!-- <el-descriptions-item label="提案方式" >{{ viewData.mannerName }}</el-descriptions-item>-->
<!-- <el-descriptions-item label="建议落实部门" >{{ viewData.implementUnitName }}</el-descriptions-item>-->
<el-descriptions-item label="提案内容" span="3">
<div class="text-left" v-html="viewData.brief"></div>
</el-descriptions-item>
<el-descriptions-item label="可行性分析" span="3">
<div class="text-left" v-html="viewData.measures"></div>
</el-descriptions-item>
<el-descriptions-item label="附件" span="3">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="viewData.files" :view="true"></file-upload>
<span v-else></span>
</el-descriptions-item>
<el-descriptions-item label="签&emsp;&emsp;字" span="3">
<el-image v-if="viewData.createUserSign" :src="viewData.createUserSign" class="item-sign"
fit="contain"></el-image>
<span v-else></span>
</el-descriptions-item>
</el-descriptions>
<slot name="seconded"></slot>
</template>
<template #conjoin-info>
<el-table :data="viewData.conJoinList" border>
<el-table-column prop="proposalCode" label="提案编号"></el-table-column>
<el-table-column prop="username" label="提案人"></el-table-column>
<el-table-column prop="proposalName" label="提案名称">
<template slot-scope="{row}">
<span @click="openView(row.id)"
style="color: #236eb4; cursor: pointer; text-decoration: underline">{{ row.proposalName }}</span>
</template>
</el-table-column>
</el-table>
</template>
<template #seconded-info>
<el-table :data="viewData.seconded" border>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column prop="unitname" label="单位"></el-table-column>
<el-table-column label="邀请时间" prop="inviteTime">
<template slot-scope="{row}">
{{ row.inviteTime }}
</template>
</el-table-column>
<el-table-column prop="secondedTime" label="附议时间"></el-table-column>
<el-table-column prop="isAgree" label="附议结果">
<template slot-scope="{row}">
<template v-if="row.isAgree==null">
<span class="text-muted">未附议</span>
</template>
<template v-else>
<span v-if="row.isAgree" class="text-success">同意</span>
<span v-else class="text-danger">拒绝</span>
</template>
</template>
</el-table-column>
</el-table>
</template>
<template #delegation-audit-info>
<el-descriptions border>
<template v-for="(o,i) in viewData.delegationAudit">
<el-descriptions-item label="审核人">{{ o.username + "-" + o.loginName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ o.auditTime }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
{{ o.flag ? "通过" : "退回" }}
</el-descriptions-item>
<el-descriptions-item span="3" label="审核意见">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item span="3" label="团长签字">
<template>
<image class="item-sign" :src="o.auditSign " fit="contain" v-if="o.auditSign"></image>
<span v-else>暂无</span>
</template>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
<template #members-opinions-info>
<template v-for="(o,i) in viewData.membersOpinions">
<el-descriptions border :column="3">
<el-descriptions-item label="审核人">
{{ o.username + "-" + o.loginName }}
</el-descriptions-item>
<el-descriptions-item label="立案意见">
{{ o.dictName || "暂无" }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ o.auditTime }}</el-descriptions-item>
<el-descriptions-item label="审核意见" span="3">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item label="签字" span="3">
<el-image v-if="o.auditSign"
style="width: 300px; height: 100px"
:src="o.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</template>
</template>
<template #case-audit-info>
<template v-for="(o,i) in viewData.caseAudit">
<el-descriptions border :column="3">
<el-descriptions-item label="审核人">
{{ o.username + "-" + o.loginName }}
</el-descriptions-item>
<!-- <el-descriptions-item label="立案结果">
{{ viewData.resultName ? viewData.resultName : '暂无' }}
&lt;!&ndash; {{ viewData.determineTypeCode ? '(' + viewData.laLevelName + ')' : '' }}&ndash;&gt;
</el-descriptions-item>-->
<el-descriptions-item label="审核结果">
{{ o.flag ? "通过" : "退回修改" }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ o.auditTime }}</el-descriptions-item>
<el-descriptions-item v-if="hostUnit!=''" label="承办单位" span="3">
{{ hostUnit }}主办
<template v-if="helpUnit&&helpUnit.length>0">
{{ helpUnit }}协办
</template>
</el-descriptions-item>
<!-- <el-descriptions-item label="承办单位" span="3" v-if="hostUnit!=''">
{{ hostUnit }}主办),
{{ helpUnit }}协办
</el-descriptions-item>
<el-descriptions-item v-if="viewData.resultCode!=='notGive'" label="承办单位" span="3">
<template v-for="(item,index) in viewData.undertake">
{{ item.unitName }}
({{ item.undertakeType === 1 ? '主办' : '协办' }})
{{ index + 1 === viewData.undertake.length ? '' : '、' }}
</template>
</el-descriptions-item>-->
<el-descriptions-item label="审核意见" span="3">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item label="签字" span="3">
<el-image v-if="o.auditSign"
style="width: 300px; height: 100px"
:src="o.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</template>
</template>
<template #undertake-first-audit-info>
<el-descriptions border>
<template v-for="(o,i) in viewData.underTakeFirstOpinion">
<el-descriptions-item label="承办单位">{{ o.underTakeName }}</el-descriptions-item>
<el-descriptions-item label="时间">{{ o.opionTime }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<el-tag v-if="o.canTake">同意承办</el-tag>
<el-tag v-else type="danger">无法承办</el-tag>
</el-descriptions-item>
<el-descriptions-item span="3" label="意见">{{ o.opinion }}</el-descriptions-item>
</template>
</el-descriptions>
</template>
<template #case-unit-audit-info>
<el-descriptions border>
<el-descriptions-item label="审核人">
{{ viewData.caseUnitAudit.username + "-" + viewData.caseUnitAudit.loginName }}
</el-descriptions-item>
<el-descriptions-item label="审核结果">{{ viewData.resultName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ viewData.caseUnitAudit.auditTime }}</el-descriptions-item>
<el-descriptions-item label="承办单位" span="3" v-if="viewData.resultCode!=='notGive'">
<template v-for="(item,index) in viewData.undertake">
{{ item.unitName }}
({{ item.undertakeType === 1 ? "主办" : "协办" }})
{{ index + 1 === viewData.undertake.length ? "" : "、" }}
</template>
</el-descriptions-item>
<el-descriptions-item label="审核意见" span="3">{{ viewData.caseUnitAudit.opinion }}
</el-descriptions-item>
<el-descriptions-item label="签字" span="3">
<el-image v-if="viewData.caseUnitAudit.auditSign"
style="width: 300px; height: 100px"
:src="viewData.caseUnitAudit.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</template>
<template #undertake-reply-audit-info>
<template v-for="(o,i) in viewData.replyInfo.filter(v=>v.isReply || v.leaderCheckResult!=null)">
<el-descriptions border column="3" style="margin-top: 10px">
<el-descriptions-item label="承办单位">{{
o.unitName
}}({{ o.undertakeType === 1 ? "主办" : "协办" }})
</el-descriptions-item>
<el-descriptions-item label="办理人">{{ o.dfrUserName }}</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ o.replyTime }}</el-descriptions-item>
<el-descriptions-item label="办理次数">{{ o.replyNumber }}</el-descriptions-item>
<el-descriptions-item label="落实情况" span="2">{{ o.implementState }}</el-descriptions-item>
<el-descriptions-item label="办理内容" span="3">
<div class="text-left" v-html="o.replyContent"></div>
</el-descriptions-item>
<el-descriptions-item label="承办单位签字" span="3">
<el-image v-if="o.replySignData"
style="width: 300px; height: 100px"
:src="o.replySignData"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
<el-descriptions-item label="附件" span="3">
<file-upload v-if="JSON.parse(o.replyFiles)&&JSON.parse(o.replyFiles).length"
:files="JSON.parse(o.replyFiles)" :view="true"></file-upload>
<span v-else></span>
</el-descriptions-item>
</el-descriptions>
</template>
</template>
<template #branch-leader-reply-opinion-audit-info>
<template
v-if="viewData.branchLeaderSuffixAuditOpinion && viewData.branchLeaderSuffixAuditOpinion.length>0">
<el-descriptions :column="2" border class="wrap-table">
<template v-for="(o,i) in viewData.branchLeaderSuffixAuditOpinion">
<el-descriptions-item label="审批人">{{ o.username }}</el-descriptions-item>
<el-descriptions-item label="审批时间">{{ o.auditTime }}</el-descriptions-item>
<el-descriptions-item span="4" label="审批意见">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item span="4" label="分管校领导签字">
<el-image v-if="o.auditSign"
style="width: 300px; height: 100px"
:src="o.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
</template>
<template #feedback-audit-info>
<el-descriptions border column="4">
<template v-for="(o,i) in viewData.feedback">
<el-descriptions-item label="反馈人">{{ o.username }}({{ o.loginname }})</el-descriptions-item>
<el-descriptions-item label="反馈时间">{{ o.feedbackTime }}</el-descriptions-item>
<el-descriptions-item label="反馈次数">{{ o.feedbackNumber }}</el-descriptions-item>
<el-descriptions-item label="对办理结果评价">{{ o.feedbackResult }}</el-descriptions-item>
<!-- <el-descriptions-item label="对承办单位办理态度评价">{{ o.feedbackCodeByUnderTake }}</el-descriptions-item>-->
<el-descriptions-item label="反馈意见" span="5">
<div class="text-left" v-html="o.feedbackOpinion"></div>
</el-descriptions-item>
<el-descriptions-item label="反馈人签字" span="4">
<el-image v-if="o.scoreSign"
style="width: 300px; height: 100px"
:src="o.scoreSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
<template #audit>
<slot name="handle"></slot>
</template>
</el-tab-plus>
</div>
<!-- <el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="分管校领导批示" name="8"
v-if="viewData.branchLeaderOpinion && viewData.branchLeaderOpinion.length>0">
{{ viewData.branchLeaderOpinion }}
<template v-if="viewData.branchLeaderOpinion && viewData.branchLeaderOpinion.length>0">
<el-descriptions :column="2" border class="wrap-table">
<template v-for="(o,i) in viewData.branchLeaderOpinion">
<el-descriptions-item label="审批人">{{ o.username }}</el-descriptions-item>
<el-descriptions-item label="审批时间">{{ o.auditTime }}</el-descriptions-item>
<el-descriptions-item span="4" label="审批意见">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item span="4" label="分管校领导签字">
<el-image v-if="o.auditSign"
style="width: 300px; height: 100px"
:src="o.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>-->
</template>
<script>
module.exports = {
props: {
id: String,
handle: {
type: Boolean,
default: false
},
label: {
type: String,
default: "审核"
},
panes: {
type: Array,
default: []
}
},
data() {
return {
hostUnit: "",
helpUnit: [],
unitOptions: [],
activeName: "1",
activeCollapse: "",
loading: true,
viewData: {},
config: {},
tabs: [],
elTabPlusScrollHeight: 700,
}
},
components: {
'el-tab-plus': httpVueLoader('/components/plugins/ELTabPlus.vue'),
"file-upload": httpVueLoader("/components/plugins/FileUpload.vue")
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async openView(id) {
this.loading = true
this.viewData = await proposal.getProposalInfo(id)
if (!this.viewData) {
this.$notify.error({title: "失败", message: "获取提案信息失败"})
this.loading = false
return
}
const {files, feedback, caseAudit, resultCode} = this.viewData
this.helpUnit = []
if (caseAudit != null && resultCode !== "notGive" && caseAudit.other != null) {
const other = JSON.parse(caseAudit.other)
if (this.unitOptions.find(v => v.id === other.hostUnit)) {
this.hostUnit = this.unitOptions.find(v => v.id === other.hostUnit).unitName
if (other.helpUnit && other.helpUnit.length > 0) {
other.helpUnit.forEach((v, i) => {
const helpUnit = this.unitOptions.find(z => other.helpUnit[i] === z.id).unitName
this.helpUnit.push(helpUnit)
})
this.helpUnit = this.helpUnit.join("、")
}
}
}
if (files) {
this.viewData.files = JSON.parse(files)
}
if (feedback) {
this.viewData.feedback.map(v => {
v.files = JSON.parse(v.files)
})
}
this.formatTab()
this.loading = false
},
formatTab() {
let tabs = []
tabs.push({name: '提案基础信息', refName: 'basic-info'})
if (this.viewData.isConjoin !== 0) {
tabs.push({name: '提案并案信息', refName: 'conjoin-info'})
}
if (this.viewData.seconded) {
tabs.push({name: '附议信息', refName: 'seconded-info'})
}
if (this.viewData.delegationAudit && this.viewData.delegationAudit.length > 0) {
tabs.push({name: '团长审核', refName: 'delegation-audit-info'})
}
if (this.viewData.membersOpinions && this.viewData.membersOpinions.length > 0) {
tabs.push({name: '提案工作组意见', refName: 'members-opinions-info'})
}
if (this.viewData.caseAuditId && this.viewData.caseAudit) {
tabs.push({name: '提案工作组立案审核', refName: 'case-audit-info'})
}
if (this.viewData.underTakeFirstOpinion && this.viewData.underTakeFirstOpinion.length > 0) {
tabs.push({name: '承办单位意见', refName: 'undertake-first-audit-info'})
}
if (this.viewData.caseUnitAuditId && this.viewData.caseUnitAudit) {
tabs.push({name: '提案工作组确认承办单位', refName: 'case-unit-audit-info'})
}
if (this.viewData.replyInfo && this.viewData.replyInfo.length > 0 && this.viewData.replyInfo.some(v => v.isReply || v.leaderCheckResult != null)) {
tabs.push({name: '承办单位办理', refName: 'undertake-reply-audit-info'})
}
if (this.viewData.branchLeaderSuffixAuditOpinion && this.viewData.branchLeaderSuffixAuditOpinion.length > 0) {
tabs.push({name: '分管校领导审批', refName: 'branch-leader-reply-opinion-audit-info'})
}
if (this.viewData.feedback && this.viewData.feedback.length > 0) {
tabs.push({name: '反馈评分信息', refName: 'feedback-audit-info'})
}
//如果是审核让页面跳到最下面并且选中最后一个
if (this.handle) {
tabs.push({name: this.label, refName: 'audit'})
if (this.$refs.etp) {
this.$refs.etp.scrollEnd()
}
} else {
//如果是查看让页面跳到最上面并且选中第一个
if (this.$refs.etp) {
this.$refs.etp.scrollToTop()
}
}
this.tabs = tabs
},
getHeight() {
const h = window.innerHeight - 50 - 20 - 54 - 40 - 50 - 10 - 10
this.elTabPlusScrollHeight = h
}
},
async created() {
this.config = await proposal.getProposalConfig()
this.unitOptions = await proposal.getProposalUndertake()
this.getHeight()
window.addEventListener('resize', this.getHeight)
}
}
</script>
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
.item-center {
text-align: center;
font-weight: 700;
margin-right: 110px;
}
.item-center .el-form-item__content {
font-size: 18px;
}
.item-sign {
width: 200px;
height: 130px;
}
.item-form {
padding: 0 25px;
}
.el-collapse-item__wrap {
padding: 10px 10px;
}
.el-collapse-item__header {
border-bottom: 1px solid #eee;
font-weight: 700;
}
.item-number {
color: red;
font-weight: 600
}
.el-collapse-item__header {
position: relative;
}
.el-collapse-item__arrow {
color: #1582dc;
font-weight: 800 !important;
}
/*.el-tabs__header{*/
/* background-image: url(https://my.njucm.edu.cn/assets/17289587176453.jpg);*/
/* background-size: cover;*/
/* background-color: rgba(87,99,189,1);*/
/* background-repeat: no-repeat;*/
/* background-position: 50% 50%;*/
/* height: 60px;*/
/* !*border-top-left-radius: 4px;*!*/
/* !*border-top-right-radius: 4px;*!*/
/* !*border-bottom-left-radius: 4px;*!*/
/* !*border-bottom-right-radius: 4px;*!*/
/*}*/
/*.el-tabs__item{*/
/* height: 60px;*/
/* line-height: 60px;*/
/* font-size: 16px;*/
/* color: #FFFFFF;*/
/*}*/
/*.el-tabs__item:hover{*/
/* font-size: 16px;*/
/* color: #FFFFFF;*/
/*}*/
/*.el-tabs__item.is-active{*/
/* color: #FFFFFF;*/
/*}*/
/*.el-tabs__active-bar{*/
/* background-color:orangered;*/
/* height: 4px;*/
/* bottom: 2px;*/
/*}*/
.wrap-table tbody:nth-child(3n+3):after {
content: '';
display: block;
height: 15px;
}
.wrap-table-4 tbody:nth-child(4n+4):after {
content: '';
display: block;
height: 15px;
}
.custom-desc .el-descriptions-item__label {
width: 15% !important;
}
</style>