| | |
| | | <!-- 操作按钮 --> |
| | | <div class="table-operations"> |
| | | <el-button type="primary" @click="handleAdd">新增预警规则</el-button> |
| | | <el-button type="success" @click="handleBatchProcess">批量处理</el-button> |
| | | <!-- <el-button type="success" @click="handleBatchProcess">批量处理@</el-button> --> |
| | | <el-button @click="handleExport">导出</el-button> |
| | | </div> |
| | | <el-table |
| | | :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | <el-table |
| | | :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | @selection-change="handleSelectionChange" |
| | | style="width: 100%" |
| | | height="calc(100vh - 280px)" |
| | | > |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | | |
| | | |
| | | <!-- 基础信息字段 --> |
| | | <el-table-column label="储气罐编码" prop="tankCode" width="120" show-overflow-tooltip /> |
| | | <el-table-column label="储气罐名称" prop="tankName" width="200" show-overflow-tooltip /> |
| | | <el-table-column label="储气罐类型" prop="tankType" width="120" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="specificationModel" width="150" show-overflow-tooltip /> |
| | | <el-table-column label="容积(m³)" prop="volume" width="100" show-overflow-tooltip /> |
| | | |
| | | |
| | | <!-- 库存相关字段 --> |
| | | <el-table-column label="当前气体量" prop="currentGasLevel" width="120" show-overflow-tooltip> |
| | | <template #default="scope"> |
| | |
| | | <el-table-column label="最低气体量" prop="minGasLevel" width="120" show-overflow-tooltip /> |
| | | <el-table-column label="最高气体量" prop="maxGasLevel" width="120" show-overflow-tooltip /> |
| | | <el-table-column label="当前压力(MPa)" prop="currentPressure" width="140" show-overflow-tooltip /> |
| | | |
| | | |
| | | <!-- 预警规则字段 --> |
| | | <el-table-column label="预警类型" prop="warningType" width="100" show-overflow-tooltip> |
| | | <template #default="scope"> |
| | |
| | | <el-switch v-model="scope.row.isEnabled" @change="handleEnableChange(scope.row)" /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | |
| | | <!-- 时间相关字段 --> |
| | | <el-table-column label="预警时间" prop="warningTime" width="150" show-overflow-tooltip /> |
| | | <el-table-column label="预警持续天数" prop="warningDuration" width="120" show-overflow-tooltip /> |
| | |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | |
| | | <!-- 操作列 --> |
| | | <el-table-column fixed="right" label="操作" width="200" align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button> |
| | | <el-button link type="success" size="small" @click="handleProcess(scope.row)">处理</el-button> |
| | | <el-button link type="success" size="small" @click="handleProcess(scope.row)">处理@</el-button> |
| | | <el-button link type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | |
| | | <!-- 分页 --> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" |
| | | /> |
| | | </div> |
| | | |
| | | <!-- 新增/编辑预警规则弹窗 --> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? '新增预警规则' : '编辑预警规则'" |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? '新增预警规则' : '编辑预警规则'" |
| | | width="50%" |
| | | @close="closeDialog" |
| | | > |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="储气罐类型:" prop="tankType"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="容积(m³):" prop="volume"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <!-- 库存相关 --> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="最高气体量(%):" prop="maxGasLevel"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <!-- 预警规则 --> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="预警阈值:" prop="warningThreshold"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <!-- 时间相关 --> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="预警时间:" prop="warningTime"> |
| | | <el-date-picker |
| | | v-model="form.warningTime" |
| | | type="datetime" |
| | | placeholder="请选择预警时间" |
| | | <el-date-picker |
| | | v-model="form.warningTime" |
| | | type="datetime" |
| | | placeholder="请选择预警时间" |
| | | style="width: 100%" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | /> |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="预计充装时间:" prop="expectedRefillTime"> |
| | | <el-date-picker |
| | | v-model="form.expectedRefillTime" |
| | | type="datetime" |
| | | placeholder="请选择预计充装时间" |
| | | <el-date-picker |
| | | v-model="form.expectedRefillTime" |
| | | type="datetime" |
| | | placeholder="请选择预计充装时间" |
| | | style="width: 100%" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="预计缺气时间:" prop="expectedShortageTime"> |
| | | <el-date-picker |
| | | v-model="form.expectedShortageTime" |
| | | type="datetime" |
| | | placeholder="请选择预计缺气时间" |
| | | <el-date-picker |
| | | v-model="form.expectedShortageTime" |
| | | type="datetime" |
| | | placeholder="请选择预计缺气时间" |
| | | style="width: 100%" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | /> |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="预警规则描述:" prop="warningRule"> |
| | | <el-input |
| | | v-model="form.warningRule" |
| | | type="textarea" |
| | | :rows="3" |
| | | <el-input |
| | | v-model="form.warningRule" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请输入预警规则描述" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="closeDialog">取消</el-button> |
| | |
| | | import { WarningFilled } from '@element-plus/icons-vue' |
| | | import pagination from '@/components/PIMTable/Pagination.vue' |
| | | // 注释掉API导入,使用假数据 |
| | | // import { |
| | | // getStockWarningPage, |
| | | // addStockWarning, |
| | | // updateStockWarning, |
| | | // deleteStockWarning, |
| | | // batchProcessStockWarning, |
| | | // exportStockWarning, |
| | | // toggleStockWarningStatus |
| | | // } from '@/api/inventoryManagement/stockWarning.js' |
| | | import { |
| | | getStockWarningPage, |
| | | addStockWarning, |
| | | updateStockWarning, |
| | | deleteStockWarning, |
| | | batchProcessStockWarning, |
| | | exportStockWarning, |
| | | toggleStockWarningStatus |
| | | } from '@/api/inventoryManagement/stockWarning.js' |
| | | |
| | | const { proxy } = getCurrentInstance() |
| | | |
| | |
| | | // 分页参数 |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 10 |
| | | size: 10, |
| | | total: 0 |
| | | }) |
| | | |
| | | // 搜索表单 |
| | |
| | | // 获取倒计时信息 |
| | | const getCountdown = (expectedTime) => { |
| | | if (!expectedTime) return { text: '-', isExpired: false } |
| | | |
| | | |
| | | const now = new Date().getTime() |
| | | const expected = new Date(expectedTime).getTime() |
| | | const diff = expected - now |
| | | |
| | | |
| | | if (diff <= 0) { |
| | | return { text: '已缺气', isExpired: true } |
| | | } |
| | | |
| | | |
| | | const days = Math.floor(diff / (1000 * 60 * 60 * 24)) |
| | | const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) |
| | | const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)) |
| | | |
| | | |
| | | if (days > 0) { |
| | | return { text: `${days}天${hours}小时`, isExpired: false } |
| | | } else if (hours > 0) { |
| | |
| | | // 获取倒计时样式类 |
| | | const getCountdownClass = (expectedTime) => { |
| | | if (!expectedTime) return '' |
| | | |
| | | |
| | | const now = new Date().getTime() |
| | | const expected = new Date(expectedTime).getTime() |
| | | const diff = expected - now |
| | | |
| | | |
| | | if (diff <= 0) { |
| | | return 'countdown-expired' |
| | | } else if (diff <= 24 * 60 * 60 * 1000) { // 24小时内 |
| | |
| | | const showShortageWarning = (tank) => { |
| | | currentWarningTank.value = tank |
| | | shortageWarningVisible.value = true |
| | | |
| | | |
| | | // 播放提示音(可选) |
| | | // const audio = new Audio('/path/to/warning-sound.mp3') |
| | | // audio.play() |
| | |
| | | // 这里可以调用处理API |
| | | } |
| | | |
| | | |
| | | |
| | | // 生成假数据 |
| | | const generateMockData = () => { |
| | | const mockData = [ |
| | | { |
| | | id: 1, |
| | | tankCode: 'TANK001', |
| | | tankName: '液化气储罐A', |
| | | tankType: '液化气储罐', |
| | | specificationModel: 'LPG-5000L', |
| | | volume: 5000, |
| | | currentGasLevel: 15, |
| | | safetyGasLevel: 30, |
| | | minGasLevel: 10, |
| | | maxGasLevel: 95, |
| | | currentPressure: 2.5, |
| | | warningType: '气体不足', |
| | | warningLevel: '紧急', |
| | | warningThreshold: 20, |
| | | isEnabled: true, |
| | | warningTime: '2025-01-15 08:30:00', |
| | | warningDuration: 3, |
| | | lastUpdateTime: '2025-01-15 10:00:00', |
| | | expectedRefillTime: '2025-01-16 14:00:00', |
| | | expectedShortageTime: '2025-01-15 18:30:00', // 今天下午6:30缺气 |
| | | warningRule: '当气体量低于20%时触发预警' |
| | | }, |
| | | { |
| | | id: 2, |
| | | tankCode: 'TANK002', |
| | | tankName: '压缩气储罐B', |
| | | tankType: '压缩气储罐', |
| | | specificationModel: 'COMP-3000L', |
| | | volume: 3000, |
| | | currentGasLevel: 45, |
| | | safetyGasLevel: 25, |
| | | minGasLevel: 15, |
| | | maxGasLevel: 90, |
| | | currentPressure: 8.2, |
| | | warningType: '压力异常', |
| | | warningLevel: '重要', |
| | | warningThreshold: 10, |
| | | isEnabled: true, |
| | | warningTime: '2025-01-14 16:20:00', |
| | | warningDuration: 2, |
| | | lastUpdateTime: '2025-01-15 09:15:00', |
| | | expectedRefillTime: '2025-01-17 09:00:00', |
| | | expectedShortageTime: '2025-01-18 12:00:00', // 3天后缺气 |
| | | warningRule: '当压力超过8MPa时触发预警' |
| | | }, |
| | | { |
| | | id: 3, |
| | | tankCode: 'TANK003', |
| | | tankName: '天然气储罐C', |
| | | tankType: '天然气储罐', |
| | | specificationModel: 'NG-8000L', |
| | | volume: 8000, |
| | | currentGasLevel: 75, |
| | | safetyGasLevel: 20, |
| | | minGasLevel: 10, |
| | | maxGasLevel: 95, |
| | | currentPressure: 4.8, |
| | | warningType: '温度异常', |
| | | warningLevel: '一般', |
| | | warningThreshold: 5, |
| | | isEnabled: true, |
| | | warningTime: '2025-01-13 11:45:00', |
| | | warningDuration: 1, |
| | | lastUpdateTime: '2025-01-15 08:45:00', |
| | | expectedRefillTime: '2025-01-20 10:00:00', |
| | | expectedShortageTime: '2025-01-22 15:30:00', // 7天后缺气 |
| | | warningRule: '当温度超过60°C时触发预警' |
| | | }, |
| | | { |
| | | id: 4, |
| | | tankCode: 'TANK004', |
| | | tankName: '氧气储罐D', |
| | | tankType: '氧气储罐', |
| | | specificationModel: 'O2-2000L', |
| | | volume: 2000, |
| | | currentGasLevel: 8, |
| | | safetyGasLevel: 25, |
| | | minGasLevel: 5, |
| | | maxGasLevel: 90, |
| | | currentPressure: 6.5, |
| | | warningType: '泄漏预警', |
| | | warningLevel: '紧急', |
| | | warningThreshold: 15, |
| | | isEnabled: true, |
| | | warningTime: '2025-01-15 07:15:00', |
| | | warningDuration: 4, |
| | | lastUpdateTime: '2025-01-15 11:30:00', |
| | | expectedRefillTime: '2025-01-15 16:00:00', |
| | | expectedShortageTime: '2025-01-15 14:00:00', // 今天下午2点缺气 |
| | | warningRule: '当检测到气体泄漏时触发预警' |
| | | }, |
| | | { |
| | | id: 5, |
| | | tankCode: 'TANK005', |
| | | tankName: '液化气储罐E', |
| | | tankType: '液化气储罐', |
| | | specificationModel: 'LPG-6000L', |
| | | volume: 6000, |
| | | currentGasLevel: 35, |
| | | safetyGasLevel: 30, |
| | | minGasLevel: 15, |
| | | maxGasLevel: 95, |
| | | currentPressure: 3.2, |
| | | warningType: '气体不足', |
| | | warningLevel: '重要', |
| | | warningThreshold: 20, |
| | | isEnabled: false, |
| | | warningTime: '2025-01-14 14:30:00', |
| | | warningDuration: 2, |
| | | lastUpdateTime: '2025-01-15 09:00:00', |
| | | expectedRefillTime: '2025-01-19 08:00:00', |
| | | expectedShortageTime: '2025-01-21 10:00:00', // 6天后缺气 |
| | | warningRule: '当气体量低于20%时触发预警' |
| | | }, |
| | | { |
| | | id: 6, |
| | | tankCode: 'TANK006', |
| | | tankName: '压缩气储罐F', |
| | | tankType: '压缩气储罐', |
| | | specificationModel: 'COMP-4000L', |
| | | volume: 4000, |
| | | currentGasLevel: 85, |
| | | safetyGasLevel: 20, |
| | | minGasLevel: 10, |
| | | maxGasLevel: 90, |
| | | currentPressure: 7.8, |
| | | warningType: '压力异常', |
| | | warningLevel: '一般', |
| | | warningThreshold: 8, |
| | | isEnabled: true, |
| | | warningTime: '2025-01-12 09:20:00', |
| | | warningDuration: 1, |
| | | lastUpdateTime: '2025-01-15 08:30:00', |
| | | expectedRefillTime: '2025-01-25 14:00:00', |
| | | expectedShortageTime: '2025-01-28 16:00:00', // 13天后缺气 |
| | | warningRule: '当压力超过8MPa时触发预警' |
| | | }, |
| | | { |
| | | id: 7, |
| | | tankCode: 'TANK007', |
| | | tankName: '天然气储罐G', |
| | | tankType: '天然气储罐', |
| | | specificationModel: 'NG-10000L', |
| | | volume: 10000, |
| | | currentGasLevel: 92, |
| | | safetyGasLevel: 15, |
| | | minGasLevel: 8, |
| | | maxGasLevel: 95, |
| | | currentPressure: 5.2, |
| | | warningType: '温度异常', |
| | | warningLevel: '重要', |
| | | warningThreshold: 6, |
| | | isEnabled: true, |
| | | warningTime: '2025-01-11 16:45:00', |
| | | warningDuration: 1, |
| | | lastUpdateTime: '2025-01-15 07:45:00', |
| | | expectedRefillTime: '2025-01-30 09:00:00', |
| | | expectedShortageTime: '2025-02-05 12:00:00', // 21天后缺气 |
| | | warningRule: '当温度超过60°C时触发预警' |
| | | }, |
| | | { |
| | | id: 8, |
| | | tankCode: 'TANK008', |
| | | tankName: '氧气储罐H', |
| | | tankType: '氧气储罐', |
| | | specificationModel: 'O2-1500L', |
| | | volume: 1500, |
| | | currentGasLevel: 12, |
| | | safetyGasLevel: 30, |
| | | minGasLevel: 8, |
| | | maxGasLevel: 90, |
| | | currentPressure: 4.5, |
| | | warningType: '泄漏预警', |
| | | warningLevel: '紧急', |
| | | warningThreshold: 12, |
| | | isEnabled: true, |
| | | warningTime: '2025-01-15 06:30:00', |
| | | warningDuration: 5, |
| | | lastUpdateTime: '2025-01-15 12:15:00', |
| | | expectedRefillTime: '2025-01-15 20:00:00', |
| | | expectedShortageTime: '2025-01-15 17:30:00', // 今天下午5:30缺气 |
| | | warningRule: '当检测到气体泄漏时触发预警' |
| | | } |
| | | ] |
| | | |
| | | // 根据搜索条件过滤数据 |
| | | let filteredData = mockData.filter(item => { |
| | | if (searchForm.tankName && !item.tankName.includes(searchForm.tankName)) return false |
| | | if (searchForm.tankType && item.tankType !== searchForm.tankType) return false |
| | | if (searchForm.warningType && item.warningType !== searchForm.warningType) return false |
| | | if (searchForm.warningLevel && item.warningLevel !== searchForm.warningLevel) return false |
| | | return true |
| | | }) |
| | | |
| | | // 分页处理 |
| | | const start = (page.current - 1) * page.size |
| | | const end = start + page.size |
| | | const paginatedData = filteredData.slice(start, end) |
| | | |
| | | return { |
| | | records: paginatedData, |
| | | total: filteredData.length |
| | | } |
| | | } |
| | | |
| | | // 获取列表数据 |
| | | const getList = async () => { |
| | | tableLoading.value = true |
| | | try { |
| | | // 模拟网络延迟 |
| | | await new Promise(resolve => setTimeout(resolve, 500)) |
| | | |
| | | const result = generateMockData() |
| | | tableData.value = result.records |
| | | total.value = result.total |
| | | |
| | | // 检查缺气预警 |
| | | getStockWarningPage(page, searchForm) |
| | | .then(res => { |
| | | |
| | | tableData.value = res.data.records |
| | | page.value.total = res.data.total; |
| | | tableLoading.value = false; |
| | | // 检查缺气预警 |
| | | checkShortageWarnings() |
| | | } catch (error) { |
| | | console.error('获取列表失败:', error) |
| | | ElMessage.error('获取列表失败') |
| | | } finally { |
| | | tableLoading.value = false |
| | | } |
| | | }).catch(err => { |
| | | tableLoading.value = false; |
| | | }) |
| | | } |
| | | |
| | | // 搜索 |
| | |
| | | // 新增 |
| | | const handleAdd = () => { |
| | | operationType.value = 'add' |
| | | resetForm() |
| | | // resetForm() |
| | | dialogFormVisible.value = true |
| | | } |
| | | |
| | |
| | | // 模拟API调用延迟 |
| | | await new Promise(resolve => setTimeout(resolve, 300)) |
| | | ElMessage.success(`正在处理预警:${row.tankName}`) |
| | | getList() |
| | | // getList() |
| | | } catch (error) { |
| | | ElMessage.error('处理预警失败') |
| | | } |
| | |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }) |
| | | |
| | | // 模拟API调用延迟 |
| | | await new Promise(resolve => setTimeout(resolve, 300)) |
| | | ElMessage.success('删除成功') |
| | | getList() |
| | | let ids = []; |
| | | ids.push(row.id); |
| | | deleteStockWarning(ids).then(res => { |
| | | if(res.code == 200){ |
| | | ElMessage.success("删除成功"); |
| | | ids.value = []; |
| | | getList(); |
| | | } |
| | | }).catch(err => { |
| | | ElMessage.error(err.msg); |
| | | }) |
| | | // // 模拟API调用延迟 |
| | | // await new Promise(resolve => setTimeout(resolve, 300)) |
| | | // ElMessage.success('删除成功') |
| | | // getList() |
| | | } catch (error) { |
| | | if (error !== 'cancel') { |
| | | ElMessage.error('删除失败') |
| | |
| | | ElMessage.warning('请选择要处理的预警') |
| | | return |
| | | } |
| | | |
| | | |
| | | try { |
| | | // 模拟API调用延迟 |
| | | await new Promise(resolve => setTimeout(resolve, 500)) |
| | |
| | | |
| | | // 导出 |
| | | const handleExport = async () => { |
| | | try { |
| | | // 模拟API调用延迟 |
| | | await new Promise(resolve => setTimeout(resolve, 800)) |
| | | |
| | | // 生成导出数据 |
| | | const exportData = generateMockData().records |
| | | const csvContent = generateCSV(exportData) |
| | | |
| | | // 创建下载链接 |
| | | const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }) |
| | | const url = window.URL.createObjectURL(blob) |
| | | const link = document.createElement('a') |
| | | link.href = url |
| | | link.download = `储气罐预警数据_${new Date().getTime()}.csv` |
| | | link.click() |
| | | window.URL.revokeObjectURL(url) |
| | | |
| | | ElMessage.success('导出成功') |
| | | } catch (error) { |
| | | ElMessage.error('导出失败') |
| | | } |
| | | // if (selectedRows.value.length === 0) { |
| | | // exportStockWarning().then(res => { |
| | | // // // 创建下载链接 |
| | | // // const blob = new Blob([res.data], { type: 'text/csv;charset=utf-8;' }) |
| | | // // const url = window.URL.createObjectURL(blob) |
| | | // // const link = document.createElement('a') |
| | | // // link.href = url |
| | | // // link.download = `储气罐预警数据_${new Date().getTime()}.csv` |
| | | // // link.click() |
| | | // // window.URL.revokeObjectURL(url) |
| | | // }).catch(err => { |
| | | // ElMessage.error(err.msg); |
| | | // }) |
| | | // }else{ |
| | | // let ids = []; |
| | | // selectedRows.value.forEach(item => { |
| | | // ids.push(item.id); |
| | | // }) |
| | | // exportStockWarning(ids).then(res => { |
| | | // // // 创建下载链接 |
| | | // // const blob = new Blob([res.data], { type: 'text/csv;charset=utf-8;' }) |
| | | // // const url = window.URL.createObjectURL(blob) |
| | | // // const link = document.createElement('a') |
| | | // // link.href = url |
| | | // // link.download = `储气罐预警数据_${new Date().getTime()}.csv` |
| | | // // link.click() |
| | | // // window.URL.revokeObjectURL(url) |
| | | // }).catch(err => { |
| | | // ElMessage.error(err.msg); |
| | | // }) |
| | | // } |
| | | |
| | | ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | proxy.download("/gasTankWarning/export", {ids: selectedRows.value.map(item => item.id)}, "储气罐预警.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | } |
| | | |
| | | // 生成CSV内容 |
| | | const generateCSV = (data) => { |
| | | const headers = [ |
| | | '储气罐编码', '储气罐名称', '储气罐类型', '规格型号', '容积(m³)', |
| | | '当前气体量(%)', '安全气体量(%)', '最低气体量(%)', '最高气体量(%)', |
| | | '当前压力(MPa)', '预警类型', '预警级别', '预警阈值', '是否启用', |
| | | '预警时间', '预警持续天数', '最后更新时间', '预计充装时间', '预计缺气时间', '预警规则描述' |
| | | ] |
| | | |
| | | const csvRows = [headers.join(',')] |
| | | |
| | | data.forEach(item => { |
| | | const row = [ |
| | | item.tankCode, |
| | | item.tankName, |
| | | item.tankType, |
| | | item.specificationModel, |
| | | item.volume, |
| | | item.currentGasLevel, |
| | | item.safetyGasLevel, |
| | | item.minGasLevel, |
| | | item.maxGasLevel, |
| | | item.currentPressure, |
| | | item.warningType, |
| | | item.warningLevel, |
| | | item.warningThreshold, |
| | | item.isEnabled ? '是' : '否', |
| | | item.warningTime, |
| | | item.warningDuration, |
| | | item.lastUpdateTime, |
| | | item.expectedRefillTime, |
| | | item.expectedShortageTime, |
| | | item.warningRule |
| | | ] |
| | | csvRows.push(row.join(',')) |
| | | }) |
| | | |
| | | return csvRows.join('\n') |
| | | } |
| | | |
| | | // 启用状态变化 |
| | | |
| | | // // 启用状态变化 |
| | | const handleEnableChange = async (row) => { |
| | | |
| | | try { |
| | | // 模拟API调用延迟 |
| | | await new Promise(resolve => setTimeout(resolve, 200)) |
| | | ElMessage.success(`${row.tankName} 的启用状态已更新`) |
| | | updateStockWarning(row).then(res => { |
| | | if(res.code == 200){ |
| | | ElMessage.success(`${row.tankName} 的启用状态已更新`); |
| | | getList(); |
| | | } |
| | | }).catch(err => { |
| | | ElMessage.error(err.msg); |
| | | }) |
| | | } catch (error) { |
| | | ElMessage.error('状态更新失败') |
| | | // 恢复原状态 |
| | |
| | | const submitForm = async () => { |
| | | try { |
| | | await proxy.$refs.formRef.validate() |
| | | |
| | | |
| | | // 模拟API调用延迟 |
| | | await new Promise(resolve => setTimeout(resolve, 500)) |
| | | |
| | | // await new Promise(resolve => setTimeout(resolve, 500)) |
| | | |
| | | if (operationType.value === 'add') { |
| | | ElMessage.success('新增成功') |
| | | addStockWarning(form).then(res => { |
| | | if(res.code == 200){ |
| | | ElMessage.success("添加成功"); |
| | | dialogFormVisible.value = false |
| | | getList() |
| | | resetForm() |
| | | } |
| | | }).catch(err => { |
| | | ElMessage.error(err.msg); |
| | | }) |
| | | |
| | | // ElMessage.success('新增成功') |
| | | } else { |
| | | ElMessage.success('编辑成功') |
| | | updateStockWarning(form).then(res => { |
| | | if(res.code == 200){ |
| | | ElMessage.success("更新成功"); |
| | | dialogFormVisible.value = false |
| | | getList() |
| | | resetForm() |
| | | } |
| | | }).catch(err => { |
| | | ElMessage.error(err.msg); |
| | | }) |
| | | // ElMessage.success('编辑成功') |
| | | } |
| | | |
| | | closeDialog() |
| | | getList() |
| | | |
| | | // closeDialog() |
| | | // getList() |
| | | } catch (error) { |
| | | if (!error.errors) { |
| | | ElMessage.error(operationType.value === 'add' ? '新增失败' : '编辑失败') |
| | |
| | | // 关闭弹窗 |
| | | const closeDialog = () => { |
| | | dialogFormVisible.value = false |
| | | resetForm() |
| | | // resetForm() |
| | | } |
| | | |
| | | // 重置表单 |
| | |
| | | <style scoped lang="scss"> |
| | | .app-container { |
| | | padding: 20px; |
| | | |
| | | |
| | | .table-operations { |
| | | text-align: right; |
| | | margin-bottom: 20px; |
| | | |
| | | |
| | | .el-button { |
| | | margin-right: 10px; |
| | | } |
| | | } |
| | | |
| | | |
| | | .table_list { |
| | | background: #fff; |
| | | border-radius: 4px; |
| | | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | |
| | | .text-danger { |
| | | color: #f56c6c; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | |
| | | .text-warning { |
| | | color: #e6a23c; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | |
| | | .text-success { |
| | | color: #67c23a; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | |
| | | .dialog-footer { |
| | | text-align: right; |
| | | } |
| | | |
| | | |
| | | // 倒计时样式 |
| | | .countdown-timer { |
| | | font-weight: bold; |
| | | } |
| | | |
| | | |
| | | .countdown-normal { |
| | | color: #67c23a; |
| | | } |
| | | |
| | | |
| | | .countdown-warning { |
| | | color: #e6a23c; |
| | | } |
| | | |
| | | |
| | | .countdown-urgent { |
| | | color: #f56c6c; |
| | | animation: blink 1s infinite; |
| | | } |
| | | |
| | | |
| | | .countdown-expired { |
| | | color: #f56c6c; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | |
| | | @keyframes blink { |
| | | 0%, 50% { opacity: 1; } |
| | | 51%, 100% { opacity: 0.5; } |
| | | } |
| | | |
| | | |
| | | // 缺气预警弹框样式 |
| | | .shortage-warning-content { |
| | | text-align: center; |
| | | padding: 20px 0; |
| | | |
| | | |
| | | .warning-icon { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | |
| | | .warning-message { |
| | | h3 { |
| | | color: #f56c6c; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | |
| | | p { |
| | | margin-bottom: 10px; |
| | | color: #606266; |
| | | } |
| | | |
| | | |
| | | .warning-details { |
| | | background: #f5f7fa; |
| | | padding: 15px; |