| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- æç´¢æ --> |
| | | <el-form :model="searchForm" :inline="true" class="search-form"> |
| | | <el-form-item label="æ¶æ®µåç§°"> |
| | | <el-input |
| | | v-model="searchForm.periodName" |
| | | placeholder="请è¾å
¥æ¶æ®µåç§°" |
| | | clearable |
| | | prefix-icon="Search" |
| | | @change="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æç´¢</el-button> |
| | | <el-button @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- æä½æé® --> |
| | | <div class="table-actions"> |
| | | <el-button |
| | | type="primary" |
| | | icon="Plus" |
| | | @click="handleAdd" |
| | | v-hasPermi="['energy:period:add']" |
| | | >æ°å¢æ¶æ®µ</el-button> |
| | | </div> |
| | | |
| | | <!-- æ¶æ®µåè¡¨è¡¨æ ¼ --> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="periodList" |
| | | @selection-change="handleSelectionChange" |
| | | border |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column |
| | | label="æ¶æ®µåç§°" |
| | | prop="periodName" |
| | | align="center" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column |
| | | label="æ¶æ®µåä»·(å
/度)" |
| | | prop="price" |
| | | align="center" |
| | | :formatter="formatPrice" |
| | | /> |
| | | <el-table-column |
| | | label="ç¶æ" |
| | | prop="status" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | <template #default="scope"> |
| | | <dict-tag :options="statusOptions" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å建æ¶é´" |
| | | prop="createTime" |
| | | align="center" |
| | | width="180" |
| | | /> |
| | | <el-table-column label="æä½" align="center" width="200"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | icon="Edit" |
| | | @click="handleUpdate(scope.row)" |
| | | v-hasPermi="['energy:period:edit']" |
| | | >ä¿®æ¹</el-button> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | icon="Delete" |
| | | @click="handleDelete(scope.row)" |
| | | v-hasPermi="['energy:period:remove']" |
| | | >å é¤</el-button> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | icon="Setting" |
| | | @click="handleTimeConfig(scope.row)" |
| | | v-hasPermi="['energy:period:config']" |
| | | >æ¶é´é
ç½®</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页æ§ä»¶ --> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | |
| | | <!-- æ°å¢/ç¼è¾æ¶æ®µå¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="title" |
| | | v-model="open" |
| | | width="500px" |
| | | append-to-body |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="100px" |
| | | > |
| | | <el-form-item label="æ¶æ®µåç§°" prop="periodName"> |
| | | <el-input v-model="form.periodName" placeholder="请è¾å
¥æ¶æ®µåç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶æ®µåä»·(å
/度)" prop="price"> |
| | | <el-input |
| | | v-model="form.price" |
| | | type="number" |
| | | placeholder="请è¾å
¥æ¶æ®µåä»·" |
| | | step="0.01" |
| | | min="0" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio :label="1">å¯ç¨</el-radio> |
| | | <el-radio :label="0">ç¦ç¨</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input |
| | | v-model="form.remark" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥å¤æ³¨ä¿¡æ¯" |
| | | rows="3" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="cancel">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitForm">ç¡®å®</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- æ¶é´æ®µé
ç½®å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="å³°å¹³è°·å°æ¶é´é
ç½®" |
| | | v-model="timeConfigOpen" |
| | | width="800px" |
| | | append-to-body |
| | | > |
| | | <el-form ref="timeFormRef" :model="timeForm" label-width="100px"> |
| | | <el-form-item label="æ¶æ®µåç§°"> |
| | | <el-input v-model="timeForm.periodName" disabled /> |
| | | </el-form-item> |
| | | |
| | | <el-table |
| | | :data="timeForm.timeSegments" |
| | | border |
| | | style="width: 100%" |
| | | @selection-change="handleTimeSelectionChange" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column label="ç±»å" align="center" prop="segmentType" width="100"> |
| | | <template #default="scope"> |
| | | <el-select v-model="scope.row.segmentType" placeholder="è¯·éæ©"> |
| | | <el-option label="å³°" value="peak" /> |
| | | <el-option label="å¹³" value="flat" /> |
| | | <el-option label="è°·" value="valley" /> |
| | | <el-option label="å°" value="sharp" /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼å§æ¶é´" align="center" prop="startTime" width="140"> |
| | | <template #default="scope"> |
| | | <el-time-picker |
| | | v-model="scope.row.startTime" |
| | | format="HH:mm" |
| | | value-format="HH:mm" |
| | | placeholder="éæ©å¼å§æ¶é´" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç»ææ¶é´" align="center" prop="endTime" width="140"> |
| | | <template #default="scope"> |
| | | <el-time-picker |
| | | v-model="scope.row.endTime" |
| | | format="HH:mm" |
| | | value-format="HH:mm" |
| | | placeholder="éæ©ç»ææ¶é´" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="100"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | icon="Delete" |
| | | @click="handleTimeDelete(scope.row)" |
| | | >å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <div style="margin-top: 15px; text-align: right;"> |
| | | <el-button type="primary" @click="handleAddTimeSegment">æ°å¢æ¶é´æ®µ</el-button> |
| | | </div> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="cancelTimeConfig">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitTimeConfig">ä¿åé
ç½®</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="EnergyPeriodTime"> |
| | | import { ref, reactive, toRefs, getCurrentInstance, onMounted } from 'vue'; |
| | | import { listPeriod, getPeriod, delPeriod, addPeriod, updatePeriod, getTimeSegments, saveTimeSegments } from "@/api/energyManagement/index.js"; |
| | | import { useDict } from '@/hooks/useDict'; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | const { sys_normal_disable } = useDict('sys_normal_disable'); |
| | | import {Search} from "@element-plus/icons-vue"; |
| | | import {onMounted, ref} from "vue"; |
| | | import {ElMessageBox} from "element-plus"; |
| | | import {getToken} from "@/utils/auth.js"; |
| | | import {periodListPage,periodDelete,periodAdd,periodUpdate} from "@/api/energyManagement/index.js"; |
| | | |
| | | // ç¶æå®ä¹ |
| | | const state = reactive({ |
| | | loading: false, |
| | | open: false, |
| | | timeConfigOpen: false, |
| | | title: "", |
| | | total: 0, |
| | | periodList: [], |
| | | timeSegments: [], |
| | | selectedRows: [], |
| | | timeSelectedRows: [], |
| | | statusOptions: sys_normal_disable, |
| | | |
| | | // æç´¢è¡¨å |
| | | searchForm: { |
| | | periodName: "" |
| | | }, |
| | | |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | periodName: undefined |
| | | }, |
| | | |
| | | // 表ååæ° |
| | | form: { |
| | | periodId: undefined, |
| | | periodName: "", |
| | | price: 0, |
| | | status: 1, |
| | | remark: "" |
| | | }, |
| | | |
| | | // æ¶é´é
置表å |
| | | timeForm: { |
| | | periodId: undefined, |
| | | periodName: "", |
| | | timeSegments: [] |
| | | }, |
| | | |
| | | // è¡¨åæ ¡éª |
| | | rules: { |
| | | periodName: [ |
| | | { required: true, message: "请è¾å
¥æ¶æ®µåç§°", trigger: "blur" } |
| | | ], |
| | | price: [ |
| | | { required: true, message: "请è¾å
¥æ¶æ®µåä»·", trigger: "blur" }, |
| | | { type: "number", message: "请è¾å
¥ææçæ°å", trigger: "blur" }, |
| | | { min: 0, message: "åä»·ä¸è½å°äº0", trigger: "blur" } |
| | | ] |
| | | } |
| | | }); |
| | | |
| | | const { |
| | | loading, open, timeConfigOpen, title, total, periodList, |
| | | selectedRows, timeSelectedRows, statusOptions, searchForm, |
| | | queryParams, form, timeForm, rules |
| | | } = toRefs(state); |
| | | |
| | | const formRef = ref(null); |
| | | const timeFormRef = ref(null); |
| | | |
| | | // çå½å¨æ - æè½½å®æ |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | |
| | | // è·åæ¶æ®µå表 |
| | | const getList = async () => { |
| | | state.loading = true; |
| | | try { |
| | | const response = await listPeriod(state.queryParams); |
| | | state.periodList = response.rows; |
| | | state.total = response.total; |
| | | } catch (error) { |
| | | proxy.$modal.msgError("è·åæ¶æ®µå表失败"); |
| | | } finally { |
| | | state.loading = false; |
| | | } |
| | | }; |
| | | |
| | | // æç´¢æé®ç¹å»äºä»¶ |
| | | const handleQuery = () => { |
| | | state.queryParams.pageNum = 1; |
| | | state.queryParams.periodName = state.searchForm.periodName; |
| | | getList(); |
| | | }; |
| | | |
| | | // éç½®æé®ç¹å»äºä»¶ |
| | | const resetQuery = () => { |
| | | state.searchForm = { |
| | | periodName: "" |
| | | }; |
| | | state.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | periodName: undefined |
| | | }; |
| | | getList(); |
| | | }; |
| | | |
| | | // æ°å¢æé®ç¹å»äºä»¶ |
| | | const handleAdd = () => { |
| | | state.form = { |
| | | periodId: undefined, |
| | | periodName: "", |
| | | price: 0, |
| | | status: 1, |
| | | remark: "" |
| | | }; |
| | | state.open = true; |
| | | state.title = "æ°å¢æ¶æ®µ"; |
| | | }; |
| | | |
| | | // ä¿®æ¹æé®ç¹å»äºä»¶ |
| | | const handleUpdate = async (row) => { |
| | | state.form = { ...row }; |
| | | state.open = true; |
| | | state.title = "ä¿®æ¹æ¶æ®µ"; |
| | | }; |
| | | |
| | | // å 餿é®ç¹å»äºä»¶ |
| | | const handleDelete = async (row) => { |
| | | await proxy.$modal.confirm("æ¯å¦ç¡®è®¤å é¤è¯¥æ¶æ®µï¼"); |
| | | try { |
| | | await delPeriod(row.periodId); |
| | | getList(); |
| | | proxy.$modal.msgSuccess("å 餿å"); |
| | | } catch (error) { |
| | | proxy.$modal.msgError("å é¤å¤±è´¥"); |
| | | } |
| | | }; |
| | | |
| | | // æ¶é´æ®µé
ç½®æé®ç¹å»äºä»¶ |
| | | const handleTimeConfig = async (row) => { |
| | | state.timeForm.periodId = row.periodId; |
| | | state.timeForm.periodName = row.periodName; |
| | | |
| | | try { |
| | | const response = await getTimeSegments(row.periodId); |
| | | state.timeForm.timeSegments = response.data || []; |
| | | } catch (error) { |
| | | state.timeForm.timeSegments = []; |
| | | } |
| | | |
| | | state.timeConfigOpen = true; |
| | | }; |
| | | |
| | | // æ°å¢æ¶é´æ®µ |
| | | const handleAddTimeSegment = () => { |
| | | state.timeForm.timeSegments.push({ |
| | | segmentId: undefined, |
| | | periodId: state.timeForm.periodId, |
| | | segmentType: "flat", |
| | | startTime: "00:00", |
| | | endTime: "00:00" |
| | | }); |
| | | }; |
| | | |
| | | // å 餿¶é´æ®µ |
| | | const handleTimeDelete = (row) => { |
| | | const index = state.timeForm.timeSegments.indexOf(row); |
| | | if (index !== -1) { |
| | | state.timeForm.timeSegments.splice(index, 1); |
| | | } |
| | | }; |
| | | |
| | | // æäº¤æ¶æ®µè¡¨å |
| | | const submitForm = async () => { |
| | | await proxy.$refs[formRef.value].validate(); |
| | | |
| | | try { |
| | | if (state.form.periodId) { |
| | | await updatePeriod(state.form); |
| | | proxy.$modal.msgSuccess("ä¿®æ¹æå"); |
| | | } else { |
| | | await addPeriod(state.form); |
| | | proxy.$modal.msgSuccess("æ°å¢æå"); |
| | | } |
| | | state.open = false; |
| | | getList(); |
| | | } catch (error) { |
| | | proxy.$modal.msgError(state.form.periodId ? "ä¿®æ¹å¤±è´¥" : "æ°å¢å¤±è´¥"); |
| | | } |
| | | }; |
| | | |
| | | // æäº¤æ¶é´æ®µé
ç½® |
| | | const submitTimeConfig = async () => { |
| | | try { |
| | | await saveTimeSegments(state.timeForm.timeSegments); |
| | | proxy.$modal.msgSuccess("æ¶é´é
ç½®ä¿åæå"); |
| | | state.timeConfigOpen = false; |
| | | } catch (error) { |
| | | proxy.$modal.msgError("æ¶é´é
ç½®ä¿å失败"); |
| | | } |
| | | }; |
| | | |
| | | // åæ¶æé®ç¹å»äºä»¶ |
| | | const cancel = () => { |
| | | state.open = false; |
| | | proxy.$refs[formRef.value].resetFields(); |
| | | }; |
| | | |
| | | // åæ¶æ¶é´é
ç½®æé®ç¹å»äºä»¶ |
| | | const cancelTimeConfig = () => { |
| | | state.timeConfigOpen = false; |
| | | }; |
| | | |
| | | // 鿩项ååäºä»¶ |
| | | const handleSelectionChange = (selection) => { |
| | | state.selectedRows = selection; |
| | | }; |
| | | |
| | | // æ¶é´æ®µéæ©é¡¹ååäºä»¶ |
| | | const handleTimeSelectionChange = (selection) => { |
| | | state.timeSelectedRows = selection; |
| | | }; |
| | | |
| | | // æ ¼å¼åä»·æ ¼æ¾ç¤º |
| | | const formatPrice = (row, column, cellValue) => { |
| | | return cellValue ? cellValue.toFixed(2) : "0.00"; |
| | | }; |
| | | |
| | | // å¯¼åºæ¹æ³ |
| | | defineExpose({ |
| | | getList |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .search-form { |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .table-actions { |
| | | margin-bottom: 16px; |
| | | display: flex; |
| | | justify-content: flex-start; |
| | | } |
| | | </style> |