|
|
@@ -24,11 +24,10 @@
|
|
|
<el-button :icon="Refresh" @click="handleReset">重置</el-button>
|
|
|
</el-form-item>
|
|
|
<el-form-item style="float: right">
|
|
|
- <el-button type="success" @click="handleAdd">新增</el-button>
|
|
|
+ <el-button type="success" @click="handleAdd" v-hasPermi="['dispatch:plan:add']">新增</el-button>
|
|
|
<el-button @click="openTemplateLibrary">模板库</el-button>
|
|
|
- <el-button type="danger" @click="handleBatchDelete">批量删除</el-button>
|
|
|
+ <el-button type="danger" @click="handleBatchDelete" v-hasPermi="['dispatch:plan:remove']">批量删除</el-button>
|
|
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
|
|
- <el-button type="primary" @click="handleDownloadTemplate">下载模版</el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
|
|
|
@@ -81,6 +80,7 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="publishDate" label="发布时间" width="120" align="center" />
|
|
|
+ <el-table-column prop="createTime" label="创建时间" width="150" align="center" />
|
|
|
<el-table-column prop="compileUnit" label="编制单位" width="100" />
|
|
|
<el-table-column prop="statusName" label="状态" width="100" align="center">
|
|
|
<template #default="{ row }">
|
|
|
@@ -89,9 +89,9 @@
|
|
|
</el-table-column>
|
|
|
<el-table-column label="操作" width="270" align="center">
|
|
|
<template #default="{ row }">
|
|
|
- <el-button type="primary" plain size="small" @click="handleEdit(row)">{{ isReviseRow(row) ? '修订' : '编辑' }}</el-button>
|
|
|
- <el-button type="danger" plain size="small" @click="handleDelete(row)">删除</el-button>
|
|
|
- <el-button v-if="row.submittable" type="success" plain size="small" @click="handleSubmitApproval(row)">提交审核</el-button>
|
|
|
+ <el-button type="primary" plain size="small" @click="handleEdit(row)" v-hasPermi="['dispatch:plan:edit']">{{ isReviseRow(row) ? '修订' : '编辑' }}</el-button>
|
|
|
+ <el-button type="danger" plain size="small" @click="handleDelete(row)" v-hasPermi="['dispatch:plan:remove']">删除</el-button>
|
|
|
+ <el-button v-if="row.submittable" type="success" plain size="small" @click="handleSubmitApproval(row)" v-hasPermi="['dispatch:plan:submit']">提交审核</el-button>
|
|
|
<el-button type="warning" plain size="small" @click="handleVersions(row)">版本</el-button>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
@@ -116,7 +116,7 @@
|
|
|
<el-tab-pane label="预案模板库" name="templates">
|
|
|
<div style="margin-bottom:12px;display:flex;justify-content:space-between;align-items:center">
|
|
|
<span style="color:#909399;font-size:13px">模板用于「新建预案」时预填名称与章节正文</span>
|
|
|
- <el-button type="primary" size="small" @click="handleTemplateAdd">新增模板</el-button>
|
|
|
+ <el-button type="primary" size="small" @click="handleTemplateAdd" v-hasPermi="['dispatch:planLibrary:add']">新增模板</el-button>
|
|
|
</div>
|
|
|
<el-table :data="templatePageList" border stripe style="width:100%" v-loading="templateLoading">
|
|
|
<el-table-column type="index" :index="templateIndex" label="序号" width="60" align="center" />
|
|
|
@@ -129,10 +129,11 @@
|
|
|
<el-table-column prop="planSummary" label="概要" min-width="260" show-overflow-tooltip>
|
|
|
<template #default="{ row }">{{ row.planSummary || '-' }}</template>
|
|
|
</el-table-column>
|
|
|
+ <el-table-column prop="createTime" label="创建时间" width="150" align="center" />
|
|
|
<el-table-column label="操作" width="140" align="center">
|
|
|
<template #default="{ row }">
|
|
|
- <el-button type="primary" plain size="small" @click="handleTemplateEdit(row)">编辑</el-button>
|
|
|
- <el-button type="danger" plain size="small" @click="handleTemplateDelete(row)">删除</el-button>
|
|
|
+ <el-button type="primary" plain size="small" @click="handleTemplateEdit(row)" v-hasPermi="['dispatch:planLibrary:add']">编辑</el-button>
|
|
|
+ <el-button type="danger" plain size="small" @click="handleTemplateDelete(row)" v-hasPermi="['dispatch:planLibrary:remove']">删除</el-button>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
@@ -178,25 +179,37 @@
|
|
|
</el-dialog>
|
|
|
|
|
|
<!-- 新增/修改预案弹窗 -->
|
|
|
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="580px" destroy-on-close>
|
|
|
+ <el-dialog v-model="dialogVisible" :title="dialogTitle" width="840px" top="5vh" destroy-on-close class="plan-dialog">
|
|
|
<div @paste="handleDialogPaste">
|
|
|
<el-form ref="formRef" :model="form" :rules="formRules" label-width="100px">
|
|
|
- <el-form-item label="预案名称" prop="planName">
|
|
|
- <el-input v-model="form.planName" placeholder="请输入预案名称" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="预案级别" prop="planLevel">
|
|
|
- <el-select v-model="form.planLevel" placeholder="请选择" style="width: 100%">
|
|
|
- <el-option v-for="d in dis_plan_level" :key="d.value" :label="d.label" :value="d.value" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="预案类型" prop="planType">
|
|
|
- <el-select v-model="form.planType" placeholder="请选择预案类型" style="width: 100%">
|
|
|
- <el-option v-for="d in dis_plan_type" :key="d.value" :label="d.label" :value="d.value" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="预案版本">
|
|
|
- <el-input v-model="form.version" disabled placeholder="由系统在审批通过后生成" />
|
|
|
- </el-form-item>
|
|
|
+ <el-row :gutter="16">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="预案名称" prop="planName">
|
|
|
+ <el-input v-model="form.planName" placeholder="请输入预案名称" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="预案级别" prop="planLevel">
|
|
|
+ <el-select v-model="form.planLevel" placeholder="请选择" style="width: 100%">
|
|
|
+ <el-option v-for="d in dis_plan_level" :key="d.value" :label="d.label" :value="d.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="16">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="预案类型" prop="planType">
|
|
|
+ <el-select v-model="form.planType" placeholder="请选择预案类型" style="width: 100%">
|
|
|
+ <el-option v-for="d in dis_plan_type" :key="d.value" :label="d.label" :value="d.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="预案版本">
|
|
|
+ <el-input v-model="form.version" disabled placeholder="由系统在审批通过后生成" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
<el-form-item label="编制单位" prop="compileUnit">
|
|
|
<!-- 可从系统部门选择,也可手动输入(allow-create 允许创建新条目) -->
|
|
|
<el-select
|
|
|
@@ -220,14 +233,8 @@
|
|
|
<el-input v-model="form.changeNote" type="textarea" :rows="3" placeholder="请填写本次修订说明(修订已通过预案必填)" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="预案正文">
|
|
|
- <el-input
|
|
|
- v-model="form.content"
|
|
|
- type="textarea"
|
|
|
- :rows="5"
|
|
|
- maxlength="2000"
|
|
|
- show-word-limit
|
|
|
- placeholder="请输入预案正文要点(将随版本快照保存,可在版本管理中查看历史正文)"
|
|
|
- />
|
|
|
+ <!-- 与模板库章节正文同一套纯文本富文本(无图片/视频控件);内容随版本快照保存 -->
|
|
|
+ <editor v-model="form.content" :media="false" :min-height="320" placeholder="请输入预案正文(将随版本快照保存,可在版本管理中查看历史正文)" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="附件上传">
|
|
|
<el-upload
|
|
|
@@ -259,7 +266,7 @@
|
|
|
</el-dialog>
|
|
|
|
|
|
<!-- 模板新增/编辑弹窗 -->
|
|
|
- <el-dialog v-model="templateFormVisible" :title="templateForm.id ? '编辑模板' : '新增模板'" width="620px" destroy-on-close>
|
|
|
+ <el-dialog v-model="templateFormVisible" :title="templateForm.id ? '编辑模板' : '新增模板'" width="840px" top="5vh" destroy-on-close class="plan-dialog">
|
|
|
<el-form ref="templateFormRef" :model="templateForm" :rules="templateRules" label-width="90px">
|
|
|
<el-form-item label="模板名称" prop="planName">
|
|
|
<el-input v-model="templateForm.planName" maxlength="60" placeholder="请输入模板名称" />
|
|
|
@@ -280,14 +287,21 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
- <el-form-item label="责任单位">
|
|
|
- <el-input v-model="templateForm.responsibleUnit" maxlength="50" placeholder="请输入责任单位(选填)" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="模板概要">
|
|
|
- <el-input v-model="templateForm.planSummary" type="textarea" :rows="2" maxlength="200" show-word-limit placeholder="一句话说明模板适用场景(新建预案选择时展示)" />
|
|
|
- </el-form-item>
|
|
|
+ <el-row :gutter="16">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="责任单位">
|
|
|
+ <el-input v-model="templateForm.responsibleUnit" maxlength="50" placeholder="请输入责任单位(选填)" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="模板概要">
|
|
|
+ <el-input v-model="templateForm.planSummary" maxlength="200" show-word-limit placeholder="一句话说明模板适用场景(新建预案选择时展示)" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
<el-form-item label="章节正文">
|
|
|
- <el-input v-model="templateForm.planContent" type="textarea" :rows="8" placeholder="模板章节大纲/正文,新建预案套用后可在正文基础上编写" />
|
|
|
+ <!-- 纯文本富文本:无图片/视频/链接控件 -->
|
|
|
+ <editor v-model="templateForm.planContent" :media="false" :min-height="320" placeholder="模板章节大纲/正文,新建预案套用后可在正文基础上编写" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -634,7 +648,8 @@ function handleBeforeUpload(file) {
|
|
|
function handleUploadSuccess(res) {
|
|
|
if (res.code === 200) {
|
|
|
form.value.attachName = res.originalFilename
|
|
|
- form.value.attachPath = res.url
|
|
|
+ // 库内只存相对路径(迁移环境不用改数据),展示/下载由后端拼 MinIO 地址
|
|
|
+ form.value.attachPath = res.relativePath || res.url
|
|
|
} else {
|
|
|
ElMessage.error(res.msg || '上传失败')
|
|
|
}
|
|
|
@@ -728,22 +743,6 @@ function attachCell(row) {
|
|
|
return `=HYPERLINK("${excelQuote(row.attachPath)}","${excelQuote(name)}")`
|
|
|
}
|
|
|
|
|
|
-// 下载模板:真实 xlsx 模板(表头 + 示例行),供后续批量导入参照
|
|
|
-const handleDownloadTemplate = () => {
|
|
|
- const headers = ['预案名称', '预案类型', '预案级别', '编制单位', '附件名称', '预案正文']
|
|
|
- const sampleType = dis_plan_type.value?.[0]?.label || '综合'
|
|
|
- const sampleLevel = dis_plan_level.value?.[0]?.label || 'Ⅲ级'
|
|
|
- const aoa = [
|
|
|
- headers,
|
|
|
- ['示例:沅陵县供水管网爆管专项预案', sampleType, sampleLevel, '沅陵县供水公司', '示例_预案文档.docx', '预案正文要点:适用场景、响应分级、处置流程…(导入前请删除本示例行)']
|
|
|
- ]
|
|
|
- const ws = XLSX.utils.aoa_to_sheet(aoa)
|
|
|
- ws['!cols'] = [{ wch: 32 }, { wch: 12 }, { wch: 10 }, { wch: 18 }, { wch: 24 }, { wch: 50 }]
|
|
|
- const wb = XLSX.utils.book_new()
|
|
|
- XLSX.utils.book_append_sheet(wb, ws, '预案导入模板')
|
|
|
- XLSX.writeFile(wb, '应急预案导入模板.xlsx')
|
|
|
-}
|
|
|
-
|
|
|
const handleExport = () => {
|
|
|
if (!tableData.value.length) return ElMessage.warning('暂无数据可导出')
|
|
|
const headers = ['预案编号', '预案名称', '预案类型', '预案级别', '版本', '附件名称', '发布时间', '编制单位', '状态']
|
|
|
@@ -879,4 +878,13 @@ async function handlePreviewVersion(row) {
|
|
|
color: #909399;
|
|
|
margin-top: 4px;
|
|
|
}
|
|
|
+
|
|
|
+/* 宽体弹窗:小屏下内容超出时在弹窗体内滚动,footer 始终可见 */
|
|
|
+.plan-dialog {
|
|
|
+ :deep(.el-dialog__body) {
|
|
|
+ max-height: calc(86vh - 110px);
|
|
|
+ overflow-y: auto;
|
|
|
+ padding-top: 16px;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|