You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

591 lines
19 KiB

<script setup>
import {useRoute, useRouter} from "vue-router";
import {AuditRuleEnums} from "@/enums/AuditRuleEnums.ts"
import feedback from "@/utils/feedback";
import {
getWarningBusiness,
saveWarningBusiness,
endWarningBusiness,
auditRejectWarning, getWarningFlowList
} from '@/api/warning/business'
import { timeFormat } from '@/utils/util'
import warningDetail from './components/detail.vue'
import reportAudit from '@/components/reportAudit/start.vue'
import finishDistrbute from '@/components/reportAudit/finishDistrbute.vue'
import useTabsStore from "@/stores/modules/multipleTabs";
const { removeTab } = useTabsStore();
const route = useRoute()
const router = useRouter()
const loading = ref(false)
// 审批记录相关
const reportFlowDialog = ref(false)
const reportFlowLoading = ref(false)
const reportFlowTable = ref([])
// 详情相关
const detailShow = ref(false)
const detailProps = ref({})
// 提交给领导弹窗相关
const dialog = ref(false)
const warningCode = ref("warning")
const node = ref("leader")
// 领导通过弹窗相关
const finishDialog = ref(false)
// 表单数据
const formData = ref({
reportProject: {},
record: {},
contents: []
})
// 行样式(已填写备注的行高亮)
const tableRowClassName = ({row}) => {
return row.remark ? 'warning-row' : ''
}
// 是否为查看模式(已预警或有 flowId 但不是待审批状态)
const isViewMode = computed(() => {
return formData.value.reportProject.warningState === '1'
})
// 是否为领导审批模式(warning_state='2' 且有 flowId)
const isLeaderMode = computed(() => {
return formData.value.reportProject.warningState === '2' && route.query.flowId
})
// 问题详情是否可编辑
const canEditRemark = computed(() => {
return formData.value.reportProject.warningState === '0'
// ||
// (formData.value.reportProject.warningState === '2' && !route.query.flowId)
})
// 加载数据
const loadData = async () => {
console.log(route.query)
const reportId = route.query.reportId
if (!reportId) {
closePage()
return
}
loading.value = true
try {
// 获取预警业务数据
const res = await getWarningBusiness(reportId)
// 填充项目信息
formData.value.reportProject = res.reportProject || {}
formData.value.record = res.record || {}
// 填充预警内容(已有数据则用已有数据,否则用枚举)
if (res.contents && res.contents.length > 0) {
formData.value.contents = res.contents
} else {
formData.value.contents = AuditRuleEnums.map(item => ({
...item,
remark: ''
}))
}
} catch (e) {
console.error('加载数据失败', e)
} finally {
loading.value = false
}
}
// 保存
const handleSave = async () => {
loading.value = true
try {
await saveWarningBusiness({
reportId: route.query.reportId,
contents: formData.value.contents.map(c => ({
type: c.type,
title: c.title,
content: c.content,
remark: c.remark || ''
}))
})
feedback.msgSuccess('保存成功')
loadData()
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
// 直接结束
const handleEnd = async () => {
await feedback.confirm('确定直接结束预警吗?')
loading.value = true
try {
await endWarningBusiness({
reportId: route.query.reportId,
contents: formData.value.contents.map(c => ({
type: c.type,
title: c.title,
content: c.content,
remark: c.remark || ''
})),
flowId: route.query.flowId,
})
feedback.msgSuccess('操作成功')
closePage()
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
// 提交给领导
const handleSubmit = async () => {
debugger
loading.value = true
try {
await saveWarningBusiness({
reportId: route.query.reportId,
contents: formData.value.contents.map(c => ({
type: c.type,
title: c.title,
content: c.content,
remark: c.remark || ''
})),
})
loading.value = false
dialog.value = true
} catch (e) {
loading.value = false
console.error(e)
}
}
// 弹窗提交成功回调
const submitFeedback = () => {
dialog.value = false
closePage()
}
// 关闭弹窗回调
const closeAuditDialogFun = () => {
dialog.value = false
}
// 领导通过
const handlePass = () => {
finishDialog.value = true
}
// 弹窗提交成功回调
const FinishSubmitFeedback = () => {
finishDialog.value = false
feedback.msgSuccess('审批通过')
closePage()
}
// 关闭弹窗回调
const FinishCloseAuditDialogFun = () => {
finishDialog.value = false
}
// 领导驳回
const handleReject = async () => {
loading.value = true
try {
await auditRejectWarning({
flowId: route.query.flowId,
reportId: route.query.reportId,
approverMessage: ''
})
feedback.msgSuccess('已驳回')
closePage()
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
// 打开审批记录
const getAuditTableFun = async () => {
reportFlowDialog.value = true
reportFlowLoading.value = true
const res = await getWarningFlowList(route.query.reportId)
reportFlowLoading.value = false
reportFlowTable.value = res
}
// 打开详情
const DetailReport = () => {
detailProps.value = {
isEnd: formData.value.reportProject.reportType === "结算项目",
id: formData.value.reportProject.id,
backPath: '/entryWindow',
node: formData.value.reportProject.node
}
detailShow.value = true
}
// 关闭详情
const closeDetailShow = () => {
detailShow.value = false
}
// 取消/返回
const handleCancel = () => {
closePage()
}
const closePage = () => {
removeTab('/warning/business', router)
router.back()
}
onMounted(() => {
loadData()
})
</script>
<template>
<div class="warning-business-page" v-loading="loading">
<!-- 报审信息 -->
<div class="section">
<h5>报审信息</h5>
<el-form :model="formData.reportProject" label-width="140">
<el-row>
<el-col :span="6">
<el-form-item label="报审类型">
<el-input :model-value="formData.reportProject.reportType" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="项目名称">
<el-input :model-value="formData.reportProject.reportName" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="项目类别">
<el-input :model-value="formData.reportProject.projectType" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审计单位">
<el-input :model-value="formData.reportProject.auditUnit" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="项目单位">
<el-input :model-value="formData.reportProject.projectUnit" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="项目负责人">
<el-input :model-value="formData.reportProject.projectPrincipal" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="负责人联系方式">
<el-input :model-value="formData.reportProject.projectPhone" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="报审金额(元)">
<el-input :model-value="formData.reportProject.reportMoney" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="立项日期">
<el-input :model-value="formData.reportProject.projectApprovalTime || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="立项金额(元)">
<el-input :model-value="formData.reportProject.projectApprovalMoney" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="立项审批领导">
<el-input :model-value="formData.reportProject.projectApprovalLead" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="报审人">
<el-input :model-value="formData.reportProject.applicant" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="采购方式">
<el-input :model-value="formData.reportProject.purchaseMethod || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="报审日期">
<el-input :model-value="formData.reportProject.applicantTime" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="文号">
<el-input :model-value="formData.reportProject.referenceNumber" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发文日期">
<el-input :model-value="formData.reportProject.publicationDate" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.reportProject.reportType === '结算项目'">
<el-col :span="6">
<el-form-item label="合同签订日期">
<el-input :model-value="formData.reportProject.contractTime || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="合同金额">
<el-input :model-value="formData.reportProject.contractMount" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="服务单位">
<el-input :model-value="formData.reportProject.serviceUnit || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="服务单位负责人">
<el-input :model-value="formData.reportProject.serviceUnitManager || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.reportProject.reportType === '结算项目'">
<el-col :span="6">
<el-form-item label="服务日期">
<el-input :model-value="formData.reportProject.serviceTime || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="服务单位联系电话">
<el-input :model-value="formData.reportProject.serviceUnitPhone || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审减金额">
<el-input :model-value="formData.reportProject.archivingReduceMoney" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.reportProject.reportType === '结算项目'">
<el-col :span="6">
<el-form-item label="归档时间">
<el-input :model-value="formData.reportProject.archiving || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审定金额(元)">
<el-input :model-value="formData.reportProject.archivingMoney" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 预警监督信息 -->
<div class="section">
<h5>预警监督信息</h5>
<el-form :model="formData.reportProject" label-width="140">
<el-row>
<el-col :span="6">
<el-form-item label="预警监督状态">
<el-input :model-value="{
'0': '未预警监督',
'1': '已预警监督',
'2': '预警中'
}[formData.reportProject.warningState] || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预警监督人员">
<el-input :model-value="formData.reportProject.warningSupervision || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预警监督日期">
<el-input :model-value="formData.reportProject.supervisionTime || '-'" readonly class="select-disabled-like"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label=" ">
<el-button type="primary" style="width: 100%" @click="DetailReport">详情</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 预警监督情况 -->
<div class="section">
<h5>预警监督情况</h5>
<el-table :data="formData.contents" border :row-class-name="tableRowClassName">
<el-table-column label="序号" type="index" width="60" align="center"/>
<el-table-column label="预警类型" prop="type" width="120"/>
<el-table-column label="预警标题" prop="title" width="150"/>
<el-table-column label="预警内容" prop="content"/>
<el-table-column label="问题详情" min-width="200">
<template #default="{ row }">
<el-input
v-model="row.remark"
type="textarea"
:rows="2"
:disabled="!canEditRemark"
placeholder="请填写问题详情"/>
</template>
</el-table-column>
</el-table>
</div>
<!-- 操作按钮 -->
<div class="flex end mt-20">
<!-- 待预警状态 (warning_state = '0'):预警人操作 -->
<template v-if="formData.reportProject.warningState === '0'">
<el-button type="primary" @click="handleSave" :loading="loading">保存</el-button>
<el-button type="warning" @click="handleEnd" :loading="loading">直接结束</el-button>
<el-button type="success" @click="handleSubmit" :loading="loading">提交给领导</el-button>
</template>
<!-- 预警中状态 (warning_state = '2'):领导审批操作 -->
<template v-else-if="isLeaderMode">
<el-button type="danger" @click="handleReject" :loading="loading">驳回</el-button>
<el-button type="success" @click="handlePass" :loading="loading">通过</el-button>
</template>
<el-button type="primary" @click="getAuditTableFun" :loading="reportFlowLoading">审批记录</el-button>
<el-button @click="handleCancel">取消</el-button>
</div>
<!-- 审批记录弹窗 -->
<el-dialog v-model="reportFlowDialog" title="审批记录" width="80vw">
<div class="table-container">
<el-table :data="reportFlowTable" v-loading="reportFlowLoading">
<el-table-column width="50" type="index" label="序号" :index="(index) => index + 1"/>
<el-table-column label="操作" prop="reportCode"/>
<el-table-column label="办理人" prop="approver"/>
<el-table-column label="提交时间" prop="areportTime">
<template #default="{row}">
{{ timeFormat(row.areportTime, 'yyyy-mm-dd hh:MM:ss') }}
</template>
</el-table-column>
<el-table-column label="完成时间" prop="approverTime">
<template #default="{row}">
{{ timeFormat(row.approverTime, 'yyyy-mm-dd hh:MM:ss') }}
</template>
</el-table-column>
<el-table-column label="办理结果" prop="approverState">
<template #default="{row}">
<el-tag type="primary" v-if="row.approverState === 'start'">开始</el-tag>
<el-tag type="success" v-if="row.approverState === 'end'">完成</el-tag>
<el-tag type="danger" v-if="row.approverState === 'reject'">驳回</el-tag>
</template>
</el-table-column>
<el-table-column label="办理意见" prop="approverMessage" show-overflow-tooltip/>
<!-- <el-table-column label="办理状态" prop="approverState"/>-->
</el-table>
</div>
</el-dialog>
<!-- 详情弹窗 -->
<el-dialog v-model="detailShow" title="项目详情" width="90vw" @close="closeDetailShow">
<warningDetail
:id="detailProps.id"
:node="detailProps.node"
:back-path="detailProps.backPath"
:is-end="detailProps.isEnd"
@close-page-fun="closeDetailShow">
</warningDetail>
</el-dialog>
<!-- 提交给领导弹窗 -->
<report-audit
@submitFeedback="submitFeedback"
@closeFun="closeAuditDialogFun"
:isWarning="warningCode"
:reportId="formData.reportProject.id"
:dialog="dialog"
:nextNode="node"
:reportProject="formData.reportProject"
/>
<!-- 领导通过弹窗 -->
<finish-distrbute
@submitFeedback="FinishSubmitFeedback"
@closeFun="FinishCloseAuditDialogFun"
:isWarning="true"
:reportId="formData.reportProject.id"
:flowId="route.query.flowId"
:dialog="finishDialog"
:nextNode="'end'"
/>
</div>
</template>
<style lang="scss">
.warning-business-page {
padding: 20px;
background: #fff;
}
.section {
margin-bottom: 20px;
}
.section h5 {
margin: 0 0 15px 0;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
color: #333;
font-weight: 600;
}
.button-group {
margin-top: 30px;
text-align: center;
padding: 20px 0;
border-top: 1px solid #eee;
}
.el-table .warning-row {
--el-table-tr-bg-color: var(--el-color-warning-light-9);
}
.select-disabled-like {
--el-input-bg-color: #ffffff;
--el-input-border-color: #dcdfe6;
--el-input-text-color: #000000;
.el-input__wrapper {
background-color: #ffffff;
box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset;
cursor: not-allowed;
}
.el-input__inner {
color: #000000;
-webkit-text-fill-color: #000000;
cursor: text;
}
}
</style>