| src/api/safeProduction/hazardReport.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/safeProduction/lineInspection.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/safeProduction/safetyFacility.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/safeProduction/hazardReport/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/safeProduction/lineInspection/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/safeProduction/safetyFacility/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/safeProduction/hazardReport.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,60 @@ import request from "@/utils/request"; /** * 鿣䏿¥APIæ¥å£ */ // è·å鿣䏿¥å表 export function getHazardReportList(params) { return request({ url: "/device/hazardReport/list", method: "get", params, }); } // æ°å¢éæ£ä¸æ¥ export function addHazardReport(data) { return request({ url: "/device/hazardReport/add", method: "post", data, }); } // è®°å½æ´æ¹ç»æ export function rectifyHazardReport(data) { return request({ url: "/device/hazardReport/rectify", method: "post", data, }); } // è®°å½éªæ¶ç»æ export function acceptHazardReport(data) { return request({ url: "/device/hazardReport/accept", method: "post", data, }); } // å é¤éæ£ä¸æ¥è®°å½ export function deleteHazardReport(ids) { return request({ url: "/device/hazardReport/delete", method: "delete", data: ids, }); } // 导åºéæ£ä¸æ¥è®°å½ export function exportHazardReport(params) { return request({ url: "/device/hazardReport/export", method: "post", params, responseType: 'blob', }); } src/api/safeProduction/lineInspection.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ import request from "@/utils/request"; /** * 线路巡æ£APIæ¥å£ */ // è·å线路巡æ£å表 export function getLineInspectionList(params) { return request({ url: "/device/lineInspection/list", method: "get", params, }); } // æ°å¢æä¿®æ¹çº¿è·¯å·¡æ£è®°å½ export function addOrEditLineInspection(data) { return request({ url: "/device/lineInspection/addOrEdit", method: "post", data, }); } // å é¤çº¿è·¯å·¡æ£è®°å½ export function deleteLineInspection(ids) { return request({ url: "/device/lineInspection/delete", method: "delete", data: ids, }); } // 导åºçº¿è·¯å·¡æ£è®°å½ export function exportLineInspection(params) { return request({ url: "/device/lineInspection/export", method: "post", params, responseType: 'blob', }); } src/api/safeProduction/safetyFacility.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ import request from "@/utils/request"; /** * å®å ¨è®¾æ½å·¡æ£APIæ¥å£ */ // è·åå®å ¨è®¾æ½å表 export function getSafetyFacilityList(params) { return request({ url: "/device/safetyFacility/list", method: "get", params, }); } // æ°å¢æä¿®æ¹å®å ¨è®¾æ½ export function addOrEditSafetyFacility(data) { return request({ url: "/device/safetyFacility/addOrEdit", method: "post", data, }); } // å é¤å®å ¨è®¾æ½ export function deleteSafetyFacility(ids) { return request({ url: "/device/safetyFacility/delete", method: "delete", data: ids, }); } // 导åºå®å ¨è®¾æ½è®°å½ export function exportSafetyFacility(params) { return request({ url: "/device/safetyFacility/export", method: "post", params, responseType: 'blob', }); } src/views/safeProduction/hazardReport/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,529 @@ <template> <div class="hazard-report"> <!-- æç´¢åºå --> <div class="search-area"> <el-form :inline="true" :model="searchForm"> <el-form-item label="䏿¥ç±»å"> <el-select v-model="searchForm.reportType" placeholder="è¯·éæ©ç±»å" clearable> <el-option label="线路巡æ£" value="线路巡æ£" /> <el-option label="å®å ¨è®¾æ½å·¡æ£" value="å®å ¨è®¾æ½å·¡æ£" /> </el-select> </el-form-item> <el-form-item label="严éç¨åº¦"> <el-select v-model="searchForm.severity" placeholder="è¯·éæ©ç¨åº¦" clearable> <el-option label="轻微" value="轻微" /> <el-option label="ä¸è¬" value="ä¸è¬" /> <el-option label="严é" value="严é" /> </el-select> </el-form-item> <el-form-item label="æ´æ¹ç¶æ"> <el-select v-model="searchForm.rectificationStatus" placeholder="è¯·éæ©ç¶æ" clearable> <el-option label="å¾ æ´æ¹" value="å¾ æ´æ¹" /> <el-option label="æ´æ¹ä¸" value="æ´æ¹ä¸" /> <el-option label="已宿" value="已宿" /> </el-select> </el-form-item> <el-form-item label="䏿¥äºº"> <el-input v-model="searchForm.reporter" placeholder="请è¾å ¥ä¸æ¥äºº" clearable /> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSearch">æç´¢</el-button> <el-button @click="resetSearch">éç½®</el-button> </el-form-item> </el-form> </div> <!-- æä½æé® --> <div class="actions"> <el-button type="primary" @click="handleAdd">䏿¥éæ£</el-button> <el-button type="success" @click="handleExport">导åº</el-button> </div> <!-- 鿣å表 --> <el-table :data="reportList" style="width: 100%; margin-top: 10px;" border> <el-table-column prop="reportType" label="䏿¥ç±»å" width="150" /> <el-table-column prop="facilityName" label="å ³è设æ½" width="150" /> <el-table-column prop="hazardDescription" label="鿣æè¿°" min-width="200" show-overflow-tooltip /> <el-table-column prop="severity" label="严éç¨åº¦" width="120"> <template #default="{ row }"> <el-tag :type="getSeverityType(row.severity)"> {{ row.severity }} </el-tag> </template> </el-table-column> <el-table-column prop="reporter" label="䏿¥äºº" width="120" /> <el-table-column prop="reportTime" label="䏿¥æ¶é´" width="180" /> <el-table-column prop="rectificationStatus" label="æ´æ¹ç¶æ" width="120"> <template #default="{ row }"> <el-tag :type="getRectificationStatusType(row.rectificationStatus)"> {{ row.rectificationStatus }} </el-tag> </template> </el-table-column> <el-table-column prop="rectificationPerson" label="æ´æ¹è´£ä»»äºº" width="120" /> <el-table-column label="æä½" width="280" fixed="right"> <template #default="{ row }"> <el-button v-if="row.rectificationStatus === 'å¾ æ´æ¹'" type="warning" link @click="handleRectify(row)" > æ´æ¹ </el-button> <el-button v-if="row.rectificationStatus === '已宿' && !row.acceptancePerson" type="success" link @click="handleAccept(row)" > éªæ¶ </el-button> <el-button type="primary" link @click="handleView(row)">æ¥ç</el-button> <el-button type="danger" link @click="handleDelete(row)">å é¤</el-button> </template> </el-table-column> </el-table> <!-- å页 --> <div class="pagination"> <el-pagination v-model:current-page="pagination.currentPage" v-model:page-size="pagination.pageSize" :page-sizes="[10, 20, 50, 100]" :total="pagination.total" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> <!-- 䏿¥éæ£å¯¹è¯æ¡ --> <el-dialog title="䏿¥éæ£" v-model="showAddDialog" width="600px"> <el-form :model="addForm" :rules="addFormRules" ref="addFormRef" label-width="100px"> <el-form-item label="䏿¥ç±»å" prop="reportType"> <el-select v-model="addForm.reportType" placeholder="è¯·éæ©ç±»å"> <el-option label="线路巡æ£" value="线路巡æ£" /> <el-option label="å®å ¨è®¾æ½å·¡æ£" value="å®å ¨è®¾æ½å·¡æ£" /> </el-select> </el-form-item> <el-form-item label="å ³è设æ½"> <el-select v-model="addForm.facilityId" placeholder="è¯·éæ©è®¾æ½" clearable> <el-option v-for="item in facilityOptions" :key="item.id" :label="item.facilityName" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="鿣æè¿°" prop="hazardDescription"> <el-input type="textarea" v-model="addForm.hazardDescription" placeholder="请è¾å ¥éæ£æè¿°" /> </el-form-item> <el-form-item label="严éç¨åº¦" prop="severity"> <el-select v-model="addForm.severity" placeholder="è¯·éæ©ç¨åº¦"> <el-option label="轻微" value="轻微" /> <el-option label="ä¸è¬" value="ä¸è¬" /> <el-option label="严é" value="严é" /> </el-select> </el-form-item> <el-form-item label="䏿¥äºº" prop="reporter"> <el-input v-model="addForm.reporter" placeholder="请è¾å ¥ä¸æ¥äºº" /> </el-form-item> <el-form-item label="夿³¨"> <el-input type="textarea" v-model="addForm.remarks" placeholder="请è¾å ¥å¤æ³¨" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="submitAddForm">ç¡®å®</el-button> <el-button @click="showAddDialog = false">åæ¶</el-button> </span> </template> </el-dialog> <!-- æ´æ¹å¯¹è¯æ¡ --> <el-dialog title="è®°å½æ´æ¹ç»æ" v-model="showRectifyDialog" width="500px"> <el-form :model="rectifyForm" label-width="100px"> <el-form-item label="鿣æè¿°"> <el-input type="textarea" v-model="rectifyForm.hazardDescription" disabled /> </el-form-item> <el-form-item label="æ´æ¹è´£ä»»äºº"> <el-input v-model="rectifyForm.rectificationPerson" placeholder="请è¾å ¥æ´æ¹è´£ä»»äºº" /> </el-form-item> <el-form-item label="æ´æ¹æè¿°"> <el-input type="textarea" v-model="rectifyForm.rectificationDescription" placeholder="请è¾å ¥æ´æ¹æªæ½" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="submitRectify">ç¡®å®</el-button> <el-button @click="showRectifyDialog = false">åæ¶</el-button> </span> </template> </el-dialog> <!-- éªæ¶å¯¹è¯æ¡ --> <el-dialog title="è®°å½éªæ¶ç»æ" v-model="showAcceptDialog" width="500px"> <el-form :model="acceptForm" label-width="100px"> <el-form-item label="æ´æ¹æè¿°"> <el-input type="textarea" v-model="acceptForm.rectificationDescription" disabled /> </el-form-item> <el-form-item label="éªæ¶äºº"> <el-input v-model="acceptForm.acceptancePerson" placeholder="请è¾å ¥éªæ¶äºº" /> </el-form-item> <el-form-item label="éªæ¶ç»æ"> <el-radio-group v-model="acceptForm.acceptanceResult"> <el-radio label="éè¿">éè¿</el-radio> <el-radio label="ä¸éè¿">ä¸éè¿</el-radio> </el-radio-group> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="submitAccept">ç¡®å®</el-button> <el-button @click="showAcceptDialog = false">åæ¶</el-button> </span> </template> </el-dialog> <!-- æ¥ç详æ å¯¹è¯æ¡ --> <el-dialog title="éæ£è¯¦æ " v-model="showViewDialog" width="600px"> <el-descriptions :column="2" border> <el-descriptions-item label="䏿¥ç±»å">{{ viewData.reportType }}</el-descriptions-item> <el-descriptions-item label="å ³è设æ½">{{ viewData.facilityName }}</el-descriptions-item> <el-descriptions-item label="鿣æè¿°" :span="2">{{ viewData.hazardDescription }}</el-descriptions-item> <el-descriptions-item label="严éç¨åº¦">{{ viewData.severity }}</el-descriptions-item> <el-descriptions-item label="䏿¥äºº">{{ viewData.reporter }}</el-descriptions-item> <el-descriptions-item label="䏿¥æ¶é´">{{ viewData.reportTime }}</el-descriptions-item> <el-descriptions-item label="æ´æ¹ç¶æ">{{ viewData.rectificationStatus }}</el-descriptions-item> <el-descriptions-item label="æ´æ¹è´£ä»»äºº">{{ viewData.rectificationPerson }}</el-descriptions-item> <el-descriptions-item label="æ´æ¹æ¶é´">{{ viewData.rectificationTime }}</el-descriptions-item> <el-descriptions-item label="æ´æ¹æè¿°" :span="2">{{ viewData.rectificationDescription }}</el-descriptions-item> <el-descriptions-item label="éªæ¶äºº">{{ viewData.acceptancePerson }}</el-descriptions-item> <el-descriptions-item label="éªæ¶æ¶é´">{{ viewData.acceptanceTime }}</el-descriptions-item> <el-descriptions-item label="éªæ¶ç»æ">{{ viewData.acceptanceResult }}</el-descriptions-item> </el-descriptions> <template #footer> <span class="dialog-footer"> <el-button @click="showViewDialog = false">å ³é</el-button> </span> </template> </el-dialog> </div> </template> <script setup> import { ref, reactive, onMounted } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { getHazardReportList, addHazardReport, rectifyHazardReport, acceptHazardReport, deleteHazardReport, exportHazardReport } from '@/api/safeProduction/hazardReport' import { getSafetyFacilityList } from '@/api/equipmentManagement/safetyFacility' // æç´¢è¡¨å const searchForm = reactive({ reportType: '', severity: '', rectificationStatus: '', reporter: '' }) // åé¡µæ°æ® const pagination = reactive({ currentPage: 1, pageSize: 10, total: 0 }) // åè¡¨æ°æ® const reportList = ref([]) // 设æ½é项 const facilityOptions = ref([]) // å¯¹è¯æ¡ç¶æ const showAddDialog = ref(false) const showRectifyDialog = ref(false) const showAcceptDialog = ref(false) const showViewDialog = ref(false) // 䏿¥è¡¨å const addForm = reactive({ reportType: '', facilityId: null, hazardDescription: '', severity: '', reporter: '', remarks: '' }) // 䏿¥è¡¨åéªè¯è§å const addFormRules = reactive({ reportType: [{ required: true, message: 'è¯·éæ©ä¸æ¥ç±»å', trigger: 'change' }], hazardDescription: [{ required: true, message: '请è¾å ¥éæ£æè¿°', trigger: 'blur' }], severity: [{ required: true, message: 'è¯·éæ©ä¸¥éç¨åº¦', trigger: 'change' }], reporter: [{ required: true, message: '请è¾å ¥ä¸æ¥äºº', trigger: 'blur' }] }) const addFormRef = ref(null) // æ´æ¹è¡¨å const rectifyForm = reactive({ id: null, hazardDescription: '', rectificationPerson: '', rectificationDescription: '' }) // éªæ¶è¡¨å const acceptForm = reactive({ id: null, rectificationDescription: '', acceptancePerson: '', acceptanceResult: 'éè¿' }) // æ¥çæ°æ® const viewData = ref({}) // è·å严éç¨åº¦æ ç¾ç±»å const getSeverityType = (severity) => { const map = { '轻微': 'info', 'ä¸è¬': 'warning', '严é': 'danger' } return map[severity] || 'info' } // è·åæ´æ¹ç¶ææ ç¾ç±»å const getRectificationStatusType = (status) => { const map = { 'å¾ æ´æ¹': 'danger', 'æ´æ¹ä¸': 'warning', '已宿': 'success' } return map[status] || 'info' } // è·å鿣å表 const fetchList = async () => { try { const params = { ...searchForm, current: pagination.currentPage, size: pagination.pageSize } const res = await getHazardReportList(params) if (res.code === 200) { reportList.value = res.data.records || [] pagination.total = res.data.total || 0 } else { ElMessage.error(res.message || 'è·åå表失败') } } catch (error) { ElMessage.error('è·åå表失败') } } // è·å设æ½å表 const fetchFacilityOptions = async () => { try { const res = await getSafetyFacilityList({ size: 1000 }) if (res.code === 200) { facilityOptions.value = res.data.records || [] } } catch (error) { console.error('è·å设æ½å表失败') } } // æç´¢ const handleSearch = () => { pagination.currentPage = 1 fetchList() } // éç½®æç´¢ const resetSearch = () => { Object.assign(searchForm, { reportType: '', severity: '', rectificationStatus: '', reporter: '' }) handleSearch() } // 䏿¥éæ£ const handleAdd = () => { Object.assign(addForm, { reportType: '', facilityId: null, hazardDescription: '', severity: '', reporter: '', remarks: '' }) showAddDialog.value = true } // æ´æ¹ const handleRectify = (row) => { Object.assign(rectifyForm, { id: row.id, hazardDescription: row.hazardDescription, rectificationPerson: '', rectificationDescription: '' }) showRectifyDialog.value = true } // éªæ¶ const handleAccept = (row) => { Object.assign(acceptForm, { id: row.id, rectificationDescription: row.rectificationDescription, acceptancePerson: '', acceptanceResult: 'éè¿' }) showAcceptDialog.value = true } // æ¥ç详æ const handleView = (row) => { viewData.value = { ...row } showViewDialog.value = true } // å é¤ const handleDelete = async (row) => { try { await ElMessageBox.confirm('确认å é¤è¯¥éæ£è®°å½åï¼', 'æç¤º', { type: 'warning' }) const res = await deleteHazardReport([row.id]) if (res.code === 200) { ElMessage.success('å 餿å') fetchList() } else { ElMessage.error(res.message || 'å é¤å¤±è´¥') } } catch (error) { // åæ¶å é¤ } } // æäº¤ä¸æ¥è¡¨å const submitAddForm = async () => { if (!addFormRef.value) return try { await addFormRef.value.validate() const res = await addHazardReport(addForm) if (res.code === 200) { ElMessage.success('䏿¥æå') showAddDialog.value = false fetchList() } else { ElMessage.error(res.message || '䏿¥å¤±è´¥') } } catch (error) { ElMessage.error('请填å宿´è¡¨åä¿¡æ¯') } } // æäº¤æ´æ¹ const submitRectify = async () => { try { const res = await rectifyHazardReport(rectifyForm) if (res.code === 200) { ElMessage.success('æ´æ¹è®°å½æå') showRectifyDialog.value = false fetchList() } else { ElMessage.error(res.message || 'æä½å¤±è´¥') } } catch (error) { ElMessage.error('æä½å¤±è´¥') } } // æäº¤éªæ¶ const submitAccept = async () => { try { const res = await acceptHazardReport(acceptForm) if (res.code === 200) { ElMessage.success('éªæ¶è®°å½æå') showAcceptDialog.value = false fetchList() } else { ElMessage.error(res.message || 'æä½å¤±è´¥') } } catch (error) { ElMessage.error('æä½å¤±è´¥') } } // å¯¼åº const handleExport = async () => { try { const res = await exportHazardReport(searchForm) const blob = new Blob([res]) const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = '鿣䏿¥è®°å½.xlsx' link.click() window.URL.revokeObjectURL(url) ElMessage.success('å¯¼åºæå') } catch (error) { ElMessage.error('导åºå¤±è´¥') } } // å页大尿¹å const handleSizeChange = (val) => { pagination.pageSize = val fetchList() } // å½å页æ¹å const handleCurrentChange = (val) => { pagination.currentPage = val fetchList() } onMounted(() => { fetchList() fetchFacilityOptions() }) </script> <style scoped> .hazard-report { padding: 20px; } .search-area { background: #f5f7fa; padding: 20px; border-radius: 4px; margin-bottom: 15px; } .actions { margin-bottom: 15px; } .pagination { margin-top: 20px; display: flex; justify-content: flex-end; } </style> src/views/safeProduction/lineInspection/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,374 @@ <template> <div class="line-inspection"> <!-- æç´¢åºå --> <div class="search-area"> <el-form :inline="true" :model="searchForm"> <el-form-item label="ä»»å¡åç§°"> <el-input v-model="searchForm.taskName" placeholder="请è¾å ¥ä»»å¡åç§°" clearable /> </el-form-item> <el-form-item label="线路åç§°"> <el-input v-model="searchForm.routeName" placeholder="请è¾å ¥çº¿è·¯åç§°" clearable /> </el-form-item> <el-form-item label="å·¡æ£äºº"> <el-input v-model="searchForm.inspector" placeholder="请è¾å ¥å·¡æ£äºº" clearable /> </el-form-item> <el-form-item label="ç¶æ"> <el-select v-model="searchForm.status" placeholder="è¯·éæ©ç¶æ" clearable> <el-option label="å¾ å·¡æ£" value="å¾ å·¡æ£" /> <el-option label="è¿è¡ä¸" value="è¿è¡ä¸" /> <el-option label="已宿" value="已宿" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSearch">æç´¢</el-button> <el-button @click="resetSearch">éç½®</el-button> </el-form-item> </el-form> </div> <!-- æä½æé® --> <div class="actions"> <el-button type="primary" @click="handleAdd">æ°å¢å·¡æ£</el-button> <el-button type="success" @click="handleExport">导åº</el-button> </div> <!-- å·¡æ£å表 --> <el-table :data="inspectionList" style="width: 100%; margin-top: 10px;" border> <el-table-column prop="taskName" label="ä»»å¡åç§°" width="180" /> <el-table-column prop="routeName" label="线路åç§°" width="180" /> <el-table-column prop="deviceName" label="å ³è设å¤" width="150" /> <el-table-column prop="inspector" label="å·¡æ£äºº" width="120" /> <el-table-column prop="inspectionTime" label="å·¡æ£æ¶é´" width="180" /> <el-table-column prop="inspectionResult" label="å·¡æ£ç»æ" width="120"> <template #default="{ row }"> <el-tag :type="row.inspectionResult === 'æ£å¸¸' ? 'success' : 'danger'"> {{ row.inspectionResult || 'æªå·¡æ£' }} </el-tag> </template> </el-table-column> <el-table-column prop="status" label="ç¶æ" width="120"> <template #default="{ row }"> <el-tag :type="getStatusType(row.status)"> {{ row.status }} </el-tag> </template> </el-table-column> <el-table-column label="æä½" width="200" fixed="right"> <template #default="{ row }"> <el-button type="primary" link @click="handleEdit(row)">ç¼è¾</el-button> <el-button type="danger" link @click="handleDelete(row)">å é¤</el-button> </template> </el-table-column> </el-table> <!-- å页 --> <div class="pagination"> <el-pagination v-model:current-page="pagination.currentPage" v-model:page-size="pagination.pageSize" :page-sizes="[10, 20, 50, 100]" :total="pagination.total" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> <!-- æ°å¢/ç¼è¾å¯¹è¯æ¡ --> <el-dialog :title="dialogTitle" v-model="showDialog" width="600px"> <el-form :model="form" :rules="formRules" ref="formRef" label-width="100px"> <el-form-item label="ä»»å¡åç§°" prop="taskName"> <el-input v-model="form.taskName" placeholder="请è¾å ¥ä»»å¡åç§°" /> </el-form-item> <el-form-item label="线路åç§°" prop="routeName"> <el-input v-model="form.routeName" placeholder="请è¾å ¥çº¿è·¯åç§°" /> </el-form-item> <el-form-item label="å ³è设å¤"> <el-select v-model="form.deviceId" placeholder="è¯·éæ©è®¾å¤" clearable> <el-option v-for="item in deviceOptions" :key="item.id" :label="item.deviceName" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="å·¡æ£äºº" prop="inspector"> <el-input v-model="form.inspector" placeholder="请è¾å ¥å·¡æ£äºº" /> </el-form-item> <el-form-item label="å·¡æ£æ¶é´"> <el-date-picker v-model="form.inspectionTime" type="datetime" placeholder="è¯·éæ©å·¡æ£æ¶é´" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" /> </el-form-item> <el-form-item label="å·¡æ£ç»æ"> <el-radio-group v-model="form.inspectionResult"> <el-radio label="æ£å¸¸">æ£å¸¸</el-radio> <el-radio label="å¼å¸¸">å¼å¸¸</el-radio> </el-radio-group> </el-form-item> <el-form-item label="鿣æè¿°" v-if="form.inspectionResult === 'å¼å¸¸'"> <el-input type="textarea" v-model="form.hazardDescription" placeholder="请è¾å ¥éæ£æè¿°" /> </el-form-item> <el-form-item label="夿³¨"> <el-input type="textarea" v-model="form.remarks" placeholder="请è¾å ¥å¤æ³¨" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="submitForm">ç¡®å®</el-button> <el-button @click="showDialog = false">åæ¶</el-button> </span> </template> </el-dialog> </div> </template> <script setup> import { ref, reactive, onMounted } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { getLineInspectionList, addOrEditLineInspection, deleteLineInspection, exportLineInspection } from '@/api/safeProduction/lineInspection' import { getDeviceLedger } from '@/api/equipmentManagement/ledger' // æç´¢è¡¨å const searchForm = reactive({ taskName: '', routeName: '', inspector: '', status: '' }) // åé¡µæ°æ® const pagination = reactive({ currentPage: 1, pageSize: 10, total: 0 }) // åè¡¨æ°æ® const inspectionList = ref([]) // 设å¤é项 const deviceOptions = ref([]) // å¯¹è¯æ¡ç¶æ const showDialog = ref(false) const dialogTitle = ref('æ°å¢å·¡æ£') // è¡¨åæ°æ® const form = reactive({ id: null, taskName: '', routeName: '', deviceId: null, inspector: '', inspectionTime: '', inspectionResult: '', hazardDescription: '', remarks: '' }) // 表åéªè¯è§å const formRules = reactive({ taskName: [{ required: true, message: '请è¾å ¥ä»»å¡åç§°', trigger: 'blur' }], routeName: [{ required: true, message: '请è¾å ¥çº¿è·¯åç§°', trigger: 'blur' }], inspector: [{ required: true, message: '请è¾å ¥å·¡æ£äºº', trigger: 'blur' }] }) const formRef = ref(null) // è·åç¶ææ ç¾ç±»å const getStatusType = (status) => { const map = { 'å¾ å·¡æ£': 'info', 'è¿è¡ä¸': 'warning', '已宿': 'success' } return map[status] || 'info' } // è·åå·¡æ£å表 const fetchList = async () => { try { const params = { ...searchForm, current: pagination.currentPage, size: pagination.pageSize } const res = await getLineInspectionList(params) if (res.code === 200) { inspectionList.value = res.data.records || [] pagination.total = res.data.total || 0 } else { ElMessage.error(res.message || 'è·åå表失败') } } catch (error) { ElMessage.error('è·åå表失败') } } // è·å设å¤å表 const fetchDeviceOptions = async () => { try { const res = await getDeviceLedger() if (res.code === 200) { deviceOptions.value = res.data || [] } } catch (error) { console.error('è·å设å¤å表失败') } } // æç´¢ const handleSearch = () => { pagination.currentPage = 1 fetchList() } // éç½®æç´¢ const resetSearch = () => { Object.assign(searchForm, { taskName: '', routeName: '', inspector: '', status: '' }) handleSearch() } // æ°å¢ const handleAdd = () => { dialogTitle.value = 'æ°å¢å·¡æ£' Object.assign(form, { id: null, taskName: '', routeName: '', deviceId: null, inspector: '', inspectionTime: '', inspectionResult: '', hazardDescription: '', remarks: '' }) showDialog.value = true } // ç¼è¾ const handleEdit = (row) => { dialogTitle.value = 'ç¼è¾å·¡æ£' Object.assign(form, { id: row.id, taskName: row.taskName, routeName: row.routeName, deviceId: row.deviceId, inspector: row.inspector, inspectionTime: row.inspectionTime, inspectionResult: row.inspectionResult, hazardDescription: row.hazardDescription, remarks: row.remarks }) showDialog.value = true } // å é¤ const handleDelete = async (row) => { try { await ElMessageBox.confirm('确认å é¤è¯¥å·¡æ£è®°å½åï¼', 'æç¤º', { type: 'warning' }) const res = await deleteLineInspection([row.id]) if (res.code === 200) { ElMessage.success('å 餿å') fetchList() } else { ElMessage.error(res.message || 'å é¤å¤±è´¥') } } catch (error) { // åæ¶å é¤ } } // æäº¤è¡¨å const submitForm = async () => { if (!formRef.value) return try { await formRef.value.validate() const res = await addOrEditLineInspection(form) if (res.code === 200) { ElMessage.success('æä½æå') showDialog.value = false fetchList() } else { ElMessage.error(res.message || 'æä½å¤±è´¥') } } catch (error) { ElMessage.error('请填å宿´è¡¨åä¿¡æ¯') } } // å¯¼åº const handleExport = async () => { try { const res = await exportLineInspection(searchForm) const blob = new Blob([res]) const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = '线路巡æ£è®°å½.xlsx' link.click() window.URL.revokeObjectURL(url) ElMessage.success('å¯¼åºæå') } catch (error) { ElMessage.error('导åºå¤±è´¥') } } // å页大尿¹å const handleSizeChange = (val) => { pagination.pageSize = val fetchList() } // å½å页æ¹å const handleCurrentChange = (val) => { pagination.currentPage = val fetchList() } onMounted(() => { fetchList() fetchDeviceOptions() }) </script> <style scoped> .line-inspection { padding: 20px; } .search-area { background: #f5f7fa; padding: 20px; border-radius: 4px; margin-bottom: 15px; } .actions { margin-bottom: 15px; } .pagination { margin-top: 20px; display: flex; justify-content: flex-end; } </style> src/views/safeProduction/safetyFacility/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,439 @@ <template> <div class="safety-facility"> <!-- æç´¢åºå --> <div class="search-area"> <el-form :inline="true" :model="searchForm"> <el-form-item label="设æ½åç§°"> <el-input v-model="searchForm.facilityName" placeholder="请è¾å ¥è®¾æ½åç§°" clearable /> </el-form-item> <el-form-item label="设æ½ç±»å"> <el-select v-model="searchForm.facilityType" placeholder="è¯·éæ©ç±»å" clearable> <el-option label="æ¶é²å¨æ" value="æ¶é²å¨æ" /> <el-option label="å®å ¨è®¾å¤" value="å®å ¨è®¾å¤" /> <el-option label="鲿¤ç¨å" value="鲿¤ç¨å" /> <el-option label="çæ§è®¾å¤" value="çæ§è®¾å¤" /> </el-select> </el-form-item> <el-form-item label="ç¶æ"> <el-select v-model="searchForm.status" placeholder="è¯·éæ©ç¶æ" clearable> <el-option label="æ£å¸¸" value="æ£å¸¸" /> <el-option label="å¼å¸¸" value="å¼å¸¸" /> <el-option label="åç¨" value="åç¨" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSearch">æç´¢</el-button> <el-button @click="resetSearch">éç½®</el-button> </el-form-item> </el-form> </div> <!-- æä½æé® --> <div class="actions"> <el-button type="primary" @click="handleAdd">æ°å¢è®¾æ½</el-button> <el-button type="success" @click="handleExport">导åº</el-button> </div> <!-- 设æ½å表 --> <el-table :data="facilityList" style="width: 100%; margin-top: 10px;" border> <el-table-column prop="facilityName" label="设æ½åç§°" width="180" /> <el-table-column prop="facilityType" label="设æ½ç±»å" width="120" /> <el-table-column prop="location" label="æå¨ä½ç½®" width="200" /> <el-table-column prop="deviceName" label="å ³è设å¤" width="150" /> <el-table-column prop="status" label="ç¶æ" width="100"> <template #default="{ row }"> <el-tag :type="getFacilityStatusType(row.status)"> {{ row.status }} </el-tag> </template> </el-table-column> <el-table-column prop="lastInspectionTime" label="䏿¬¡å·¡æ£" width="180" /> <el-table-column prop="nextInspectionTime" label="䏿¬¡å·¡æ£" width="180" /> <el-table-column prop="responsibilityPerson" label="责任人" width="120" /> <el-table-column label="æä½" width="250" fixed="right"> <template #default="{ row }"> <el-button type="primary" link @click="handleEdit(row)">ç¼è¾</el-button> <el-button type="warning" link @click="handleInspection(row)">å·¡æ£</el-button> <el-button type="danger" link @click="handleDelete(row)">å é¤</el-button> </template> </el-table-column> </el-table> <!-- å页 --> <div class="pagination"> <el-pagination v-model:current-page="pagination.currentPage" v-model:page-size="pagination.pageSize" :page-sizes="[10, 20, 50, 100]" :total="pagination.total" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> <!-- æ°å¢/ç¼è¾å¯¹è¯æ¡ --> <el-dialog :title="dialogTitle" v-model="showDialog" width="600px"> <el-form :model="form" :rules="formRules" ref="formRef" label-width="100px"> <el-form-item label="设æ½åç§°" prop="facilityName"> <el-input v-model="form.facilityName" placeholder="请è¾å ¥è®¾æ½åç§°" /> </el-form-item> <el-form-item label="设æ½ç±»å" prop="facilityType"> <el-select v-model="form.facilityType" placeholder="è¯·éæ©ç±»å"> <el-option label="æ¶é²å¨æ" value="æ¶é²å¨æ" /> <el-option label="å®å ¨è®¾å¤" value="å®å ¨è®¾å¤" /> <el-option label="鲿¤ç¨å" value="鲿¤ç¨å" /> <el-option label="çæ§è®¾å¤" value="çæ§è®¾å¤" /> </el-select> </el-form-item> <el-form-item label="æå¨ä½ç½®" prop="location"> <el-input v-model="form.location" placeholder="请è¾å ¥æå¨ä½ç½®" /> </el-form-item> <el-form-item label="å ³è设å¤"> <el-select v-model="form.deviceId" placeholder="è¯·éæ©è®¾å¤" clearable> <el-option v-for="item in deviceOptions" :key="item.id" :label="item.deviceName" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="责任é¨é¨"> <el-input v-model="form.responsibilityDept" placeholder="请è¾å ¥è´£ä»»é¨é¨" /> </el-form-item> <el-form-item label="责任人"> <el-input v-model="form.responsibilityPerson" placeholder="请è¾å ¥è´£ä»»äºº" /> </el-form-item> <el-form-item label="䏿¬¡å·¡æ£"> <el-date-picker v-model="form.nextInspectionTime" type="datetime" placeholder="è¯·éæ©ä¸æ¬¡å·¡æ£æ¶é´" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" /> </el-form-item> <el-form-item label="夿³¨"> <el-input type="textarea" v-model="form.remarks" placeholder="请è¾å ¥å¤æ³¨" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="submitForm">ç¡®å®</el-button> <el-button @click="showDialog = false">åæ¶</el-button> </span> </template> </el-dialog> <!-- å·¡æ£è®°å½å¯¹è¯æ¡ --> <el-dialog title="è®°å½å·¡æ£ç»æ" v-model="showInspectionDialog" width="500px"> <el-form :model="inspectionForm" label-width="100px"> <el-form-item label="设æ½åç§°"> <el-input v-model="inspectionForm.facilityName" disabled /> </el-form-item> <el-form-item label="å·¡æ£ç»æ"> <el-radio-group v-model="inspectionForm.status"> <el-radio label="æ£å¸¸">æ£å¸¸</el-radio> <el-radio label="å¼å¸¸">å¼å¸¸</el-radio> </el-radio-group> </el-form-item> <el-form-item label="å·¡æ£è¯´æ" v-if="inspectionForm.status === 'å¼å¸¸'"> <el-input type="textarea" v-model="inspectionForm.description" placeholder="请è¾å ¥å¼å¸¸è¯´æ" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="submitInspection">ç¡®å®</el-button> <el-button @click="showInspectionDialog = false">åæ¶</el-button> </span> </template> </el-dialog> </div> </template> <script setup> import { ref, reactive, onMounted } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { getSafetyFacilityList, addOrEditSafetyFacility, deleteSafetyFacility, exportSafetyFacility } from '@/api/safeProduction/safetyFacility' import { getDeviceLedger } from '@/api/equipmentManagement/ledger' // æç´¢è¡¨å const searchForm = reactive({ facilityName: '', facilityType: '', status: '' }) // åé¡µæ°æ® const pagination = reactive({ currentPage: 1, pageSize: 10, total: 0 }) // åè¡¨æ°æ® const facilityList = ref([]) // 设å¤é项 const deviceOptions = ref([]) // å¯¹è¯æ¡ç¶æ const showDialog = ref(false) const dialogTitle = ref('æ°å¢è®¾æ½') // å·¡æ£å¯¹è¯æ¡ç¶æ const showInspectionDialog = ref(false) // è¡¨åæ°æ® const form = reactive({ id: null, facilityName: '', facilityType: '', location: '', deviceId: null, responsibilityDept: '', responsibilityPerson: '', nextInspectionTime: '', remarks: '' }) // å·¡æ£è¡¨åæ°æ® const inspectionForm = reactive({ id: null, facilityName: '', status: 'æ£å¸¸', description: '' }) // 表åéªè¯è§å const formRules = reactive({ facilityName: [{ required: true, message: '请è¾å ¥è®¾æ½åç§°', trigger: 'blur' }], facilityType: [{ required: true, message: 'è¯·éæ©è®¾æ½ç±»å', trigger: 'change' }], location: [{ required: true, message: '请è¾å ¥æå¨ä½ç½®', trigger: 'blur' }] }) const formRef = ref(null) // è·åç¶ææ ç¾ç±»å const getFacilityStatusType = (status) => { const map = { 'æ£å¸¸': 'success', 'å¼å¸¸': 'danger', 'åç¨': 'info' } return map[status] || 'info' } // è·å设æ½å表 const fetchList = async () => { try { const params = { ...searchForm, current: pagination.currentPage, size: pagination.pageSize } const res = await getSafetyFacilityList(params) if (res.code === 200) { facilityList.value = res.data.records || [] pagination.total = res.data.total || 0 } else { ElMessage.error(res.message || 'è·åå表失败') } } catch (error) { ElMessage.error('è·åå表失败') } } // è·å设å¤å表 const fetchDeviceOptions = async () => { try { const res = await getDeviceLedger() if (res.code === 200) { deviceOptions.value = res.data || [] } } catch (error) { console.error('è·å设å¤å表失败') } } // æç´¢ const handleSearch = () => { pagination.currentPage = 1 fetchList() } // éç½®æç´¢ const resetSearch = () => { Object.assign(searchForm, { facilityName: '', facilityType: '', status: '' }) handleSearch() } // æ°å¢ const handleAdd = () => { dialogTitle.value = 'æ°å¢è®¾æ½' Object.assign(form, { id: null, facilityName: '', facilityType: '', location: '', deviceId: null, responsibilityDept: '', responsibilityPerson: '', nextInspectionTime: '', remarks: '' }) showDialog.value = true } // ç¼è¾ const handleEdit = (row) => { dialogTitle.value = 'ç¼è¾è®¾æ½' Object.assign(form, { id: row.id, facilityName: row.facilityName, facilityType: row.facilityType, location: row.location, deviceId: row.deviceId, responsibilityDept: row.responsibilityDept, responsibilityPerson: row.responsibilityPerson, nextInspectionTime: row.nextInspectionTime, remarks: row.remarks }) showDialog.value = true } // å·¡æ£ const handleInspection = (row) => { Object.assign(inspectionForm, { id: row.id, facilityName: row.facilityName, status: 'æ£å¸¸', description: '' }) showInspectionDialog.value = true } // å é¤ const handleDelete = async (row) => { try { await ElMessageBox.confirm('确认å é¤è¯¥è®¾æ½åï¼', 'æç¤º', { type: 'warning' }) const res = await deleteSafetyFacility([row.id]) if (res.code === 200) { ElMessage.success('å 餿å') fetchList() } else { ElMessage.error(res.message || 'å é¤å¤±è´¥') } } catch (error) { // åæ¶å é¤ } } // æäº¤è¡¨å const submitForm = async () => { if (!formRef.value) return try { await formRef.value.validate() const res = await addOrEditSafetyFacility(form) if (res.code === 200) { ElMessage.success('æä½æå') showDialog.value = false fetchList() } else { ElMessage.error(res.message || 'æä½å¤±è´¥') } } catch (error) { ElMessage.error('请填å宿´è¡¨åä¿¡æ¯') } } // æäº¤å·¡æ£ç»æ const submitInspection = async () => { try { const data = { id: inspectionForm.id, status: inspectionForm.status, lastInspectionTime: new Date().toISOString() } const res = await addOrEditSafetyFacility(data) if (res.code === 200) { ElMessage.success('å·¡æ£è®°å½æå') showInspectionDialog.value = false fetchList() } else { ElMessage.error(res.message || 'æä½å¤±è´¥') } } catch (error) { ElMessage.error('æä½å¤±è´¥') } } // å¯¼åº const handleExport = async () => { try { const res = await exportSafetyFacility(searchForm) const blob = new Blob([res]) const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = 'å®å ¨è®¾æ½å°è´¦.xlsx' link.click() window.URL.revokeObjectURL(url) ElMessage.success('å¯¼åºæå') } catch (error) { ElMessage.error('导åºå¤±è´¥') } } // å页大尿¹å const handleSizeChange = (val) => { pagination.pageSize = val fetchList() } // å½å页æ¹å const handleCurrentChange = (val) => { pagination.currentPage = val fetchList() } onMounted(() => { fetchList() fetchDeviceOptions() }) </script> <style scoped> .safety-facility { padding: 20px; } .search-area { background: #f5f7fa; padding: 20px; border-radius: 4px; margin-bottom: 15px; } .actions { margin-bottom: 15px; } .pagination { margin-top: 20px; display: flex; justify-content: flex-end; } </style>