| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="filters" :inline="true"> |
| | | <el-form-item label="å·¡æ£åç§°"> |
| | | <el-input |
| | | v-model="filters.name" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥å·¡æ£åç§°" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | @change="getTableData" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£ç¶æ"> |
| | | <el-select |
| | | v-model="filters.status" |
| | | style="width: 240px" |
| | | placeholder="è¯·éæ©å·¡æ£ç¶æ" |
| | | clearable |
| | | @change="getTableData" |
| | | > |
| | | <el-option label="å¾
æ§è¡" value="0"></el-option> |
| | | <el-option label="æ§è¡ä¸" value="1"></el-option> |
| | | <el-option label="已宿" value="2"></el-option> |
| | | <el-option label="已忶" value="3"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£ç±»å"> |
| | | <el-select |
| | | v-model="filters.type" |
| | | style="width: 240px" |
| | | placeholder="è¯·éæ©å·¡æ£ç±»å" |
| | | clearable |
| | | @change="getTableData" |
| | | > |
| | | <el-option label="宿巡æ£" value="0"></el-option> |
| | | <el-option label="临æ¶å·¡æ£" value="1"></el-option> |
| | | <el-option label="æ
éå·¡æ£" value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getTableData">æç´¢</el-button> |
| | | <el-button @click="resetFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <div></div> |
| | | <div> |
| | | <el-button type="primary" @click="add" icon="Plus"> æ°å¢ </el-button> |
| | | <el-button |
| | | type="danger" |
| | | icon="Delete" |
| | | :disabled="multipleList.length <= 0" |
| | | @click="batchDelete" |
| | | >æ¹éå é¤</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | <PIMTable |
| | | rowKey="id" |
| | | isSelection |
| | | :column="columns" |
| | | :tableData="dataList" |
| | | :page="{ |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize, |
| | | total: pagination.total, |
| | | }" |
| | | @selection-change="handleSelectionChange" |
| | | @pagination="changePage" |
| | | > |
| | | </PIMTable> |
| | | </div> |
| | | <!-- æ°å¢ç¼è¾å¼¹çª --> |
| | | <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px"> |
| | | <el-form :model="formData" label-width="100px"> |
| | | <el-form-item label="å·¡æ£åç§°" required> |
| | | <el-input |
| | | v-model="formData.name" |
| | | placeholder="请è¾å
¥å·¡æ£åç§°" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£ç±»å" required> |
| | | <el-select v-model="formData.type" placeholder="è¯·éæ©å·¡æ£ç±»å"> |
| | | <el-option label="宿巡æ£" value="0"></el-option> |
| | | <el-option label="临æ¶å·¡æ£" value="1"></el-option> |
| | | <el-option label="æ
éå·¡æ£" value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£åºå" required> |
| | | <el-input |
| | | v-model="formData.area" |
| | | placeholder="请è¾å
¥å·¡æ£åºå" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£äººå" required> |
| | | <el-input |
| | | v-model="formData.inspector" |
| | | placeholder="请è¾å
¥å·¡æ£äººå" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="计åå¼å§æ¶é´" required> |
| | | <el-date-picker |
| | | v-model="formData.planStartTime" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©è®¡åå¼å§æ¶é´" |
| | | style="width: 100%" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="计åç»ææ¶é´" required> |
| | | <el-date-picker |
| | | v-model="formData.planEndTime" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©è®¡åç»ææ¶é´" |
| | | style="width: 100%" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£å
容"> |
| | | <el-input |
| | | v-model="formData.content" |
| | | type="textarea" |
| | | rows="3" |
| | | placeholder="请è¾å
¥å·¡æ£å
容" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="dialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="saveData">ç¡®å®</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, computed, onMounted } from "vue"; |
| | | import { Search, Plus, Delete } from "@element-plus/icons-vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import dayjs from "dayjs"; |
| | | |
| | | // å®ä¹åæ°æ® |
| | | const mockData = [ |
| | | { |
| | | id: 1, |
| | | name: "ä¸é¨åºåæ¥å¸¸å·¡æ£", |
| | | type: "0", |
| | | status: "2", |
| | | planStartTime: "2025-12-30 08:00:00", |
| | | planEndTime: "2025-12-30 09:00:00", |
| | | actualStartTime: "2025-12-30 08:05:00", |
| | | actualEndTime: "2025-12-30 08:55:00", |
| | | inspector: "å¼ ä¸", |
| | | area: "ä¸é¨åºå", |
| | | content: "æ£æ¥é¨ç¦è®¾å¤è¿è¡ç¶æãç¯å¢çæµè®¾å¤æ°æ®", |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: "西é¨åºå临æ¶å·¡æ£", |
| | | type: "1", |
| | | status: "2", |
| | | planStartTime: "2025-12-30 10:00:00", |
| | | planEndTime: "2025-12-30 11:00:00", |
| | | actualStartTime: "2025-12-30 10:00:00", |
| | | actualEndTime: "2025-12-30 10:45:00", |
| | | inspector: "æå", |
| | | area: "西é¨åºå", |
| | | content: "æ£æ¥å¼å¸¸æ¥è¦è®¾å¤", |
| | | }, |
| | | { |
| | | id: 3, |
| | | name: "åé¨é¨ç¦æ
éå·¡æ£", |
| | | type: "2", |
| | | status: "1", |
| | | planStartTime: "2025-12-30 13:00:00", |
| | | planEndTime: "2025-12-30 14:00:00", |
| | | actualStartTime: "2025-12-30 13:10:00", |
| | | actualEndTime: "", |
| | | inspector: "çäº", |
| | | area: "åé¨åºå", |
| | | content: "ä¿®å¤é¨ç¦æ
é", |
| | | }, |
| | | { |
| | | id: 4, |
| | | name: "䏿§å®¤å®æå·¡æ£", |
| | | type: "0", |
| | | status: "0", |
| | | planStartTime: "2025-12-31 09:00:00", |
| | | planEndTime: "2025-12-31 10:00:00", |
| | | actualStartTime: "", |
| | | actualEndTime: "", |
| | | inspector: "èµµå
", |
| | | area: "䏿§åºå", |
| | | content: "æ£æ¥çæ§è®¾å¤ãæå¡å¨è¿è¡ç¶æ", |
| | | }, |
| | | { |
| | | id: 5, |
| | | name: "åé¨åºåæ¥å¸¸å·¡æ£", |
| | | type: "0", |
| | | status: "2", |
| | | planStartTime: "2025-12-30 15:00:00", |
| | | planEndTime: "2025-12-30 16:00:00", |
| | | actualStartTime: "2025-12-30 15:00:00", |
| | | actualEndTime: "2025-12-30 15:50:00", |
| | | inspector: "å¼ ä¸", |
| | | area: "åé¨åºå", |
| | | content: "æ£æ¥è½¦è¾è¯å«è®¾å¤ãéé¸è¿è¡ç¶æ", |
| | | }, |
| | | ]; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const filters = reactive({ |
| | | name: "", |
| | | status: "", |
| | | type: "", |
| | | }); |
| | | |
| | | const dataList = ref([]); |
| | | const pagination = reactive({ |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | total: 0, |
| | | }); |
| | | |
| | | const multipleList = ref([]); |
| | | const dialogVisible = ref(false); |
| | | const dialogTitle = ref("æ°å¢å·¡æ£"); |
| | | const formData = reactive({ |
| | | id: "", |
| | | name: "", |
| | | type: "0", |
| | | status: "0", |
| | | planStartTime: "", |
| | | planEndTime: "", |
| | | actualStartTime: "", |
| | | actualEndTime: "", |
| | | inspector: "", |
| | | area: "", |
| | | content: "", |
| | | }); |
| | | |
| | | // ç¶ææ å° |
| | | const statusMap = { |
| | | '0': '<el-tag type="warning">å¾
æ§è¡</el-tag>', |
| | | '1': '<el-tag type="primary">æ§è¡ä¸</el-tag>', |
| | | '2': '<el-tag type="success">已宿</el-tag>', |
| | | '3': '<el-tag type="danger">已忶</el-tag>', |
| | | }; |
| | | |
| | | // ç±»åæ å° |
| | | const typeMap = { |
| | | 0: "宿巡æ£", |
| | | 1: "临æ¶å·¡æ£", |
| | | 2: "æ
éå·¡æ£", |
| | | }; |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const columns = [ |
| | | { |
| | | label: "å·¡æ£åç§°", |
| | | align: "center", |
| | | prop: "name", |
| | | }, |
| | | { |
| | | label: "å·¡æ£ç±»å", |
| | | align: "center", |
| | | prop: "type", |
| | | formatter: (row) => { |
| | | return typeMap[row.type]; |
| | | }, |
| | | }, |
| | | { |
| | | label: "å·¡æ£ç¶æ", |
| | | align: "center", |
| | | prop: "status", |
| | | formatter: (row) => { |
| | | return statusMap[row.status]; |
| | | }, |
| | | }, |
| | | { |
| | | label: "计åå¼å§æ¶é´", |
| | | align: "center", |
| | | prop: "planStartTime", |
| | | }, |
| | | { |
| | | label: "计åç»ææ¶é´", |
| | | align: "center", |
| | | prop: "planEndTime", |
| | | }, |
| | | { |
| | | label: "å®é
å¼å§æ¶é´", |
| | | align: "center", |
| | | prop: "actualStartTime", |
| | | formatter: (row) => { |
| | | return row.actualStartTime || "-"; |
| | | }, |
| | | }, |
| | | { |
| | | label: "å®é
ç»ææ¶é´", |
| | | align: "center", |
| | | prop: "actualEndTime", |
| | | formatter: (row) => { |
| | | return row.actualEndTime || "-"; |
| | | }, |
| | | }, |
| | | { |
| | | label: "å·¡æ£äººå", |
| | | align: "center", |
| | | prop: "inspector", |
| | | }, |
| | | { |
| | | label: "å·¡æ£åºå", |
| | | align: "center", |
| | | prop: "area", |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | label: "æä½", |
| | | align: "center", |
| | | fixed: "right", |
| | | width: 180, |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | edit(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "å¼å§æ§è¡", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | startInspection(row); |
| | | }, |
| | | visible: (row) => { |
| | | return row.status === "0"; |
| | | }, |
| | | }, |
| | | { |
| | | name: "宿巡æ£", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | completeInspection(row); |
| | | }, |
| | | visible: (row) => { |
| | | return row.status === "1"; |
| | | }, |
| | | }, |
| | | { |
| | | name: "åæ¶å·¡æ£", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | cancelInspection(row); |
| | | }, |
| | | visible: (row) => { |
| | | return ["0", "1"].includes(row.status); |
| | | }, |
| | | }, |
| | | { |
| | | name: "å é¤", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | deleteRow(row.id); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ]; |
| | | |
| | | // è¿æ»¤åçæ°æ® |
| | | const filteredData = computed(() => { |
| | | return mockData.filter((item) => { |
| | | const nameMatch = !filters.name || item.name.includes(filters.name); |
| | | const statusMatch = !filters.status || item.status === filters.status; |
| | | const typeMatch = !filters.type || item.type === filters.type; |
| | | return nameMatch && statusMatch && typeMatch; |
| | | }); |
| | | }); |
| | | |
| | | // è·åè¡¨æ ¼æ°æ® |
| | | const getTableData = () => { |
| | | pagination.total = filteredData.value.length; |
| | | const start = (pagination.currentPage - 1) * pagination.pageSize; |
| | | const end = start + pagination.pageSize; |
| | | dataList.value = filteredData.value.slice(start, end); |
| | | }; |
| | | |
| | | // éç½®è¿æ»¤å¨ |
| | | const resetFilters = () => { |
| | | filters.name = ""; |
| | | filters.status = ""; |
| | | filters.type = ""; |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å页åå |
| | | const changePage = ({ page, limit }) => { |
| | | pagination.currentPage = page; |
| | | pagination.pageSize = limit; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å¤éå¤ç |
| | | const handleSelectionChange = (selectionList) => { |
| | | multipleList.value = selectionList; |
| | | }; |
| | | |
| | | // æ°å¢ |
| | | const add = () => { |
| | | dialogTitle.value = "æ°å¢å·¡æ£"; |
| | | formData.id = ""; |
| | | formData.name = ""; |
| | | formData.type = "0"; |
| | | formData.status = "0"; |
| | | formData.planStartTime = ""; |
| | | formData.planEndTime = ""; |
| | | formData.actualStartTime = ""; |
| | | formData.actualEndTime = ""; |
| | | formData.inspector = ""; |
| | | formData.area = ""; |
| | | formData.content = ""; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ç¼è¾ |
| | | const edit = (row) => { |
| | | dialogTitle.value = "ç¼è¾å·¡æ£"; |
| | | formData.id = row.id; |
| | | formData.name = row.name; |
| | | formData.type = row.type; |
| | | formData.status = row.status; |
| | | formData.planStartTime = row.planStartTime; |
| | | formData.planEndTime = row.planEndTime; |
| | | formData.actualStartTime = row.actualStartTime; |
| | | formData.actualEndTime = row.actualEndTime; |
| | | formData.inspector = row.inspector; |
| | | formData.area = row.area; |
| | | formData.content = row.content; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ä¿åæ°æ® |
| | | const saveData = () => { |
| | | if ( |
| | | !formData.name || |
| | | !formData.planStartTime || |
| | | !formData.planEndTime || |
| | | !formData.inspector || |
| | | !formData.area |
| | | ) { |
| | | ElMessage.warning("请填åå¿
å¡«åæ®µ"); |
| | | return; |
| | | } |
| | | |
| | | if (formData.id) { |
| | | // ç¼è¾ |
| | | const index = mockData.findIndex((item) => item.id === formData.id); |
| | | if (index !== -1) { |
| | | mockData[index] = { |
| | | ...mockData[index], |
| | | ...formData, |
| | | }; |
| | | ElMessage.success("ç¼è¾æå"); |
| | | } |
| | | } else { |
| | | // æ°å¢ |
| | | const newId = Math.max(...mockData.map((item) => item.id), 0) + 1; |
| | | mockData.unshift({ |
| | | ...formData, |
| | | id: newId, |
| | | }); |
| | | ElMessage.success("æ°å¢æå"); |
| | | } |
| | | dialogVisible.value = false; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å¼å§å·¡æ£ |
| | | const startInspection = (row) => { |
| | | const index = mockData.findIndex((item) => item.id === row.id); |
| | | if (index !== -1) { |
| | | mockData[index].status = "1"; |
| | | mockData[index].actualStartTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
| | | ElMessage.success("å·¡æ£å·²å¼å§"); |
| | | getTableData(); |
| | | } |
| | | }; |
| | | |
| | | // å®æå·¡æ£ |
| | | const completeInspection = (row) => { |
| | | const index = mockData.findIndex((item) => item.id === row.id); |
| | | if (index !== -1) { |
| | | mockData[index].status = "2"; |
| | | mockData[index].actualEndTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
| | | ElMessage.success("å·¡æ£å·²å®æ"); |
| | | getTableData(); |
| | | } |
| | | }; |
| | | |
| | | // åæ¶å·¡æ£ |
| | | const cancelInspection = (row) => { |
| | | ElMessageBox.confirm("ç¡®å®è¦åæ¶è¯¥å·¡æ£å?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | const index = mockData.findIndex((item) => item.id === row.id); |
| | | if (index !== -1) { |
| | | mockData[index].status = "3"; |
| | | ElMessage.success("å·¡æ£å·²åæ¶"); |
| | | getTableData(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }; |
| | | |
| | | // å é¤ |
| | | const deleteRow = (id) => { |
| | | ElMessageBox.confirm("æ¤æä½å°æ°¸ä¹
å é¤è¯¥å·¡æ£è®°å½, æ¯å¦ç»§ç»?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | const index = mockData.findIndex((item) => item.id === id); |
| | | if (index !== -1) { |
| | | mockData.splice(index, 1); |
| | | ElMessage.success("å 餿å"); |
| | | getTableData(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }; |
| | | |
| | | // æ¹éå é¤ |
| | | const batchDelete = () => { |
| | | if (multipleList.value.length === 0) { |
| | | ElMessage.warning("è¯·éæ©è¦å é¤çæ°æ®"); |
| | | return; |
| | | } |
| | | |
| | | ElMessageBox.confirm("æ¤æä½å°æ°¸ä¹
å 餿éå·¡æ£è®°å½, æ¯å¦ç»§ç»?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | const ids = multipleList.value.map((item) => item.id); |
| | | mockData.forEach((item, index) => { |
| | | if (ids.includes(item.id)) { |
| | | mockData.splice(index, 1); |
| | | } |
| | | }); |
| | | ElMessage.success("å 餿å"); |
| | | getTableData(); |
| | | multipleList.value = []; |
| | | }) |
| | | .catch(() => {}); |
| | | }; |
| | | |
| | | // åå§åæ°æ® |
| | | onMounted(() => { |
| | | getTableData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .table_list { |
| | | margin-top: unset; |
| | | } |
| | | .actions { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 10px; |
| | | } |
| | | </style> |