|
|
@@ -10,19 +10,31 @@
|
|
|
<el-input placeholder="请输入地址" v-model="queryParams.address" />
|
|
|
</el-form-item>
|
|
|
|
|
|
+ <el-form-item label="来源" prop="source">
|
|
|
+ <el-select
|
|
|
+ v-model="queryParams.source"
|
|
|
+ placeholder="请选择来源"
|
|
|
+ clearable
|
|
|
+ style="width: 150px">
|
|
|
+ <el-option
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_HAZARD_SOURCE)"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
<el-form-item label="状态" prop="status">
|
|
|
<el-select
|
|
|
v-model="queryParams.status"
|
|
|
placeholder="请选择状态"
|
|
|
clearable
|
|
|
- style="width: 180px"
|
|
|
- >
|
|
|
+ style="width: 150px">
|
|
|
<el-option
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_HAZARD_STATUS)"
|
|
|
:key="dict.value"
|
|
|
:label="dict.label"
|
|
|
- :value="dict.value"
|
|
|
- />
|
|
|
+ :value="dict.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
|
|
|
@@ -50,8 +62,7 @@
|
|
|
:data="list"
|
|
|
:stripe="true"
|
|
|
height="calc(85vh - 135px)"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- >
|
|
|
+ :show-overflow-tooltip="true">
|
|
|
<zm-table-column :label="t('monitor.serial')" width="70" align="center">
|
|
|
<template #default="scope">
|
|
|
{{ scope.$index + 1 }}
|
|
|
@@ -59,6 +70,12 @@
|
|
|
</zm-table-column>
|
|
|
|
|
|
<zm-table-column label="单位" align="center" prop="deptName" />
|
|
|
+ <zm-table-column label="类型" align="center" prop="classifyName" />
|
|
|
+ <zm-table-column label="来源" align="center" min-width="90">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :type="DICT_TYPE.QHSE_HAZARD_SOURCE" :value="scope.row.source" />
|
|
|
+ </template>
|
|
|
+ </zm-table-column>
|
|
|
|
|
|
<zm-table-column label="地点" align="center" prop="address" />
|
|
|
|
|
|
@@ -113,23 +130,20 @@
|
|
|
align="center"
|
|
|
fixed="right"
|
|
|
min-width="150px"
|
|
|
- action
|
|
|
- >
|
|
|
+ action>
|
|
|
<template #default="scope">
|
|
|
<el-button
|
|
|
v-if="scope.row.status === 'todo'"
|
|
|
link
|
|
|
type="primary"
|
|
|
- @click="handleFix(scope.row)"
|
|
|
- >
|
|
|
+ @click="handleFix(scope.row)">
|
|
|
整改
|
|
|
</el-button>
|
|
|
<el-button
|
|
|
v-if="scope.row.status === 'todo'"
|
|
|
link
|
|
|
type="primary"
|
|
|
- @click="handleEdit(scope.row)"
|
|
|
- >
|
|
|
+ @click="handleEdit(scope.row)">
|
|
|
编辑
|
|
|
</el-button>
|
|
|
<el-button link type="danger" @click="handleDelete(scope.row.id)"> 删除 </el-button>
|
|
|
@@ -142,8 +156,7 @@
|
|
|
:total="total"
|
|
|
v-model:page="queryParams.pageNo"
|
|
|
v-model:limit="queryParams.pageSize"
|
|
|
- @pagination="getList"
|
|
|
- />
|
|
|
+ @pagination="getList" />
|
|
|
</ContentWrap>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
@@ -154,15 +167,34 @@
|
|
|
v-model="dialogVisible"
|
|
|
width="600px"
|
|
|
destroy-on-close
|
|
|
- @close="closeDialog"
|
|
|
- >
|
|
|
+ @close="closeDialog">
|
|
|
<el-form
|
|
|
ref="formRef"
|
|
|
:model="formData"
|
|
|
:rules="formRules"
|
|
|
label-width="120px"
|
|
|
- v-loading="formLoading"
|
|
|
- >
|
|
|
+ v-loading="formLoading">
|
|
|
+ <el-form-item label="隐患排查类型" prop="classify">
|
|
|
+ <el-tree-select
|
|
|
+ style="width: 500px; overflow: auto"
|
|
|
+ v-model="formData.classify"
|
|
|
+ :data="deptTree"
|
|
|
+ :props="defaultProps"
|
|
|
+ :check-strictly="false"
|
|
|
+ placeholder="请选择隐患排查类型"
|
|
|
+ value-key="id" />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="隐患排查来源" prop="source">
|
|
|
+ <el-select v-model="formData.source" placeholder="请选择隐患排查来源" clearable>
|
|
|
+ <el-option
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_HAZARD_SOURCE)"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
<el-form-item label="地点" prop="address">
|
|
|
<el-input v-model="formData.address" placeholder="请输入地点" />
|
|
|
</el-form-item>
|
|
|
@@ -172,8 +204,7 @@
|
|
|
type="textarea"
|
|
|
:rows="2"
|
|
|
v-model="formData.problem"
|
|
|
- placeholder="请输入存在问题"
|
|
|
- />
|
|
|
+ placeholder="请输入存在问题" />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="照片" prop="hazardFile">
|
|
|
@@ -182,8 +213,7 @@
|
|
|
:file-type="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'jpg', 'png', 'jpeg']"
|
|
|
:limit="3"
|
|
|
:file-size="100"
|
|
|
- class="min-w-80px"
|
|
|
- />
|
|
|
+ class="min-w-80px" />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="备注" prop="remark">
|
|
|
@@ -192,8 +222,7 @@
|
|
|
v-model="formData.remark"
|
|
|
:rows="2"
|
|
|
placeholder="请输入备注"
|
|
|
- style="width: 100%"
|
|
|
- />
|
|
|
+ style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
|
|
|
@@ -209,22 +238,19 @@
|
|
|
v-model="fixdDialogVisible"
|
|
|
width="600px"
|
|
|
destroy-on-close
|
|
|
- @close="closeDialog"
|
|
|
- >
|
|
|
+ @close="closeDialog">
|
|
|
<el-form
|
|
|
ref="formRef"
|
|
|
:model="formData"
|
|
|
:rules="formRules"
|
|
|
label-width="120px"
|
|
|
- v-loading="formLoading"
|
|
|
- >
|
|
|
+ v-loading="formLoading">
|
|
|
<el-form-item label="整改描述" prop="rectifyDesc">
|
|
|
<el-input
|
|
|
type="textarea"
|
|
|
:rows="2"
|
|
|
v-model="formData.rectifyDesc"
|
|
|
- placeholder="请输入整改描述"
|
|
|
- />
|
|
|
+ placeholder="请输入整改描述" />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="整改附件" prop="rectifyFile">
|
|
|
@@ -233,8 +259,7 @@
|
|
|
:file-type="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'jpg', 'png', 'jpeg']"
|
|
|
:limit="3"
|
|
|
:file-size="100"
|
|
|
- class="min-w-80px"
|
|
|
- />
|
|
|
+ class="min-w-80px" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
|
|
|
@@ -248,8 +273,7 @@
|
|
|
<div
|
|
|
v-for="(file, index) in fileList"
|
|
|
:key="index"
|
|
|
- class="flex items-center justify-between mt-5"
|
|
|
- >
|
|
|
+ class="flex items-center justify-between mt-5">
|
|
|
<span class="file-name-text">{{ extractFileName(file) }}</span>
|
|
|
<div>
|
|
|
<el-button link type="primary" @click="viewFileInfo(file)">
|
|
|
@@ -271,25 +295,22 @@
|
|
|
<FilePreviewDialog
|
|
|
v-model="filePreviewVisible"
|
|
|
:title="filePreviewTitle"
|
|
|
- :urls="filePreviewUrls"
|
|
|
- />
|
|
|
+ :urls="filePreviewUrls" />
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { IotHiddenApi } from '@/api/pms/qhse/index'
|
|
|
+import { IotHiddenApi, IotHiddenTypeApi } from '@/api/pms/qhse/index'
|
|
|
import DeptTree from '@/views/system/user/DeptTree2.vue'
|
|
|
-import { handleTree } from '@/utils/tree'
|
|
|
+
|
|
|
import * as DeptApi from '@/api/system/dept'
|
|
|
import { ElMessageBox, ElMessage } from 'element-plus'
|
|
|
const deptList2 = ref<Tree[]>([]) // 树形结构
|
|
|
import { formatDate } from '@/utils/formatTime'
|
|
|
-
|
|
|
+import { defaultProps, handleTree } from '@/utils/tree'
|
|
|
import UploadFile from '@/components/UploadFile/src/UploadFile.vue'
|
|
|
import FilePreviewDialog from '@/components/FilePreview/src/FilePreviewDialog.vue'
|
|
|
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
|
|
|
|
|
|
-import { selectedDeptsEmployee } from '@/api/system/user'
|
|
|
-
|
|
|
import { useTableComponents } from '@/components/ZmTable/useTableComponents'
|
|
|
const { ZmTable, ZmTableColumn } = useTableComponents()
|
|
|
|
|
|
@@ -302,7 +323,7 @@ const exportLoading = ref(false) // 导出按钮加载中
|
|
|
const isLeftContentCollapsed = ref(false)
|
|
|
|
|
|
const { t } = useI18n()
|
|
|
-
|
|
|
+const deptTree = ref() // 树形结构
|
|
|
const list = ref([]) // 列表的数据
|
|
|
const total = ref(0) // 列表的总页数
|
|
|
const queryParams = reactive({
|
|
|
@@ -310,7 +331,8 @@ const queryParams = reactive({
|
|
|
pageSize: 10,
|
|
|
status: '',
|
|
|
deptId: '',
|
|
|
- address: ''
|
|
|
+ address: '',
|
|
|
+ source: ''
|
|
|
})
|
|
|
const queryFormRef = ref(null) // 搜索的表单
|
|
|
|
|
|
@@ -337,7 +359,9 @@ const formData = ref({
|
|
|
hazardFile: '',
|
|
|
rectifyDesc: '',
|
|
|
rectifyFile: '',
|
|
|
- status: ''
|
|
|
+ status: '',
|
|
|
+ classify: '',
|
|
|
+ source: ''
|
|
|
})
|
|
|
|
|
|
// 表单验证规则
|
|
|
@@ -348,7 +372,9 @@ const formRules = {
|
|
|
problem: [{ required: true, message: '存在问题不能为空', trigger: 'blur' }],
|
|
|
rectifyDesc: [{ required: true, message: '整改描述不能为空', trigger: 'blur' }],
|
|
|
rectifyFile: [{ required: true, message: '整改附件不能为空', trigger: 'blur' }],
|
|
|
- hazardFile: [{ required: true, message: '照片不能为空', trigger: 'blur' }]
|
|
|
+ hazardFile: [{ required: true, message: '照片不能为空', trigger: 'blur' }],
|
|
|
+ classify: [{ required: true, message: '分类不能为空', trigger: 'blur' }],
|
|
|
+ source: [{ required: true, message: '来源不能为空', trigger: 'blur' }]
|
|
|
}
|
|
|
|
|
|
/** 查询列表 */
|
|
|
@@ -397,9 +423,10 @@ const resetQuery = () => {
|
|
|
}
|
|
|
|
|
|
// 显示新增对话框
|
|
|
-const handleAdd = () => {
|
|
|
+const handleAdd = async () => {
|
|
|
isEdit.value = false
|
|
|
dialogTitle.value = '新增隐患排查'
|
|
|
+ await getTree()
|
|
|
resetForm()
|
|
|
dialogVisible.value = true
|
|
|
}
|
|
|
@@ -425,27 +452,6 @@ const handleFix = (row) => {
|
|
|
currentFixId.value = row.id
|
|
|
}
|
|
|
|
|
|
-// 查看证书图片
|
|
|
-const viewHazardFile = (value: string) => {
|
|
|
- filePreviewTitle.value = '隐患附件'
|
|
|
- filePreviewUrls.value = normalizeUrls(value)
|
|
|
- filePreviewVisible.value = true
|
|
|
-}
|
|
|
-
|
|
|
-const viewRectifyFile = (value: string) => {
|
|
|
- filePreviewTitle.value = '整改附件'
|
|
|
- filePreviewUrls.value = normalizeUrls(value)
|
|
|
- filePreviewVisible.value = true
|
|
|
-}
|
|
|
-
|
|
|
-const normalizeUrls = (value: string) => {
|
|
|
- if (!value) return []
|
|
|
- return value
|
|
|
- .split(',')
|
|
|
- .map((s) => s.trim())
|
|
|
- .filter(Boolean)
|
|
|
-}
|
|
|
-
|
|
|
// 确保时间戳是毫秒级的
|
|
|
const ensureMillisecondTimestamp = (timestamp) => {
|
|
|
let time = Number(timestamp)
|
|
|
@@ -580,16 +586,6 @@ const handleDownload = async (url) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-let userList = ref([])
|
|
|
-const handleDeptChange = async (value) => {
|
|
|
- const res = await selectedDeptsEmployee({
|
|
|
- deptIds: value
|
|
|
- })
|
|
|
-
|
|
|
- userList.value = res
|
|
|
- console.log('value>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>', userList.value)
|
|
|
-}
|
|
|
-
|
|
|
let dialogFileView = ref(false)
|
|
|
let fileList = ref([])
|
|
|
const viewFile = (file) => {
|
|
|
@@ -618,7 +614,15 @@ const extractFileName = (url: string): string => {
|
|
|
return url
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+/** 获得分类树 */
|
|
|
+const getTree = async () => {
|
|
|
+ deptTree.value = []
|
|
|
+ const data = await IotHiddenTypeApi.getParentCategory()
|
|
|
+ let dept: Tree = { id: 0, name: '顶级分类', children: [] }
|
|
|
+ dept.children = handleTree(data)
|
|
|
+ deptTree.value.push(dept)
|
|
|
+ // firstLevelKeys.value = deptTree.value.map((node) => node.id)
|
|
|
+}
|
|
|
onMounted(async () => {
|
|
|
getList()
|
|
|
deptList2.value = handleTree(await DeptApi.getSimpleDeptList())
|