<template> 
 | 
  <div class="app-container"> 
 | 
    <div class="search_form"> 
 | 
      <div> 
 | 
        <span class="search_title">日期:</span> 
 | 
        <!-- <el-time-picker 
 | 
            style="width: 240px;margin-right: 10px" 
 | 
            v-model="searchForm.startTime" 
 | 
            value-format="HH:mm:ss" 
 | 
            format="HH:mm:ss" 
 | 
            type="time" 
 | 
            placeholder="请选择开始时间" 
 | 
            clearable 
 | 
        /> --> 
 | 
        <el-date-picker 
 | 
            v-model="searchForm.date" 
 | 
            type="date" 
 | 
            placeholder="请选择日期" 
 | 
            value-format="YYYY-MM-DD" 
 | 
                  format="YYYY-MM-DD" 
 | 
        /> 
 | 
        <!-- <el-time-picker 
 | 
            v-model="searchForm.timeRange" 
 | 
            is-range 
 | 
            arrow-control 
 | 
            range-separator="To" 
 | 
            start-placeholder="选择结束时间" 
 | 
            end-placeholder="选择结束时间" 
 | 
        /> --> 
 | 
        <span class="search_title">电价(元/度):</span> 
 | 
        <el-input 
 | 
            v-model="searchForm.price" 
 | 
            style="width: 240px" 
 | 
            placeholder="请输入电价" 
 | 
            @change="handleQuery" 
 | 
            clearable 
 | 
            :prefix-icon="Search" 
 | 
        /> 
 | 
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px" 
 | 
        >搜索</el-button> 
 | 
        <el-button @click="resetFilters">重置</el-button> 
 | 
      </div> 
 | 
      <div> 
 | 
        <el-button type="primary" @click="openForm('add')">新增</el-button> 
 | 
        <el-button @click="handleOut">导出</el-button> 
 | 
        <el-button type="danger" plain @click="handleDelete">删除</el-button> 
 | 
      </div> 
 | 
    </div> 
 | 
    <div class="table_list"> 
 | 
      <PIMTable 
 | 
          rowKey="id" 
 | 
          :column="tableColumn" 
 | 
          :tableData="tableData" 
 | 
          :page="page" 
 | 
          :isSelection="true" 
 | 
          @selection-change="handleSelectionChange" 
 | 
          :tableLoading="tableLoading" 
 | 
          @pagination="pagination" 
 | 
      ></PIMTable> 
 | 
    </div> 
 | 
    <el-dialog 
 | 
        v-model="dialogFormVisible" 
 | 
        title="用电时段管理" 
 | 
        width="70%" 
 | 
        @close="closeDia" 
 | 
    > 
 | 
      <el-form 
 | 
          :model="form" 
 | 
          label-width="140px" 
 | 
          label-position="top" 
 | 
          :rules="rules" 
 | 
          ref="formRef" 
 | 
      > 
 | 
        <el-row :gutter="30"> 
 | 
          <el-col :span="12"> 
 | 
            <el-form-item label="日期:" prop="date"> 
 | 
              <el-date-picker 
 | 
                  style="width: 100%" 
 | 
                  v-model="form.date" 
 | 
                  value-format="YYYY-MM-DD" 
 | 
                  format="YYYY-MM-DD" 
 | 
                  type="date" 
 | 
                  placeholder="请选择日期" 
 | 
                  clearable 
 | 
              /> 
 | 
            </el-form-item> 
 | 
          </el-col> 
 | 
          <el-col :span="12"> 
 | 
            <el-form-item label="电价(元/度):" prop="price"> 
 | 
              <el-input 
 | 
                  v-model="form.price" 
 | 
                  placeholder="请输入电价" 
 | 
                  clearable 
 | 
                  type="number" 
 | 
                  step="0.01" 
 | 
                  min="0" 
 | 
              /> 
 | 
            </el-form-item> 
 | 
          </el-col> 
 | 
        </el-row> 
 | 
        <el-row :gutter="30"> 
 | 
         <el-col :span="12"> 
 | 
           <el-form-item label="峰段:" prop="peak"> 
 | 
             <el-input 
 | 
                 v-model="form.peak" 
 | 
                 placeholder="请输入峰段" 
 | 
                 clearable 
 | 
                 type="number" 
 | 
                 step="0.01" 
 | 
                 min="0" 
 | 
             /> 
 | 
           </el-form-item> 
 | 
         </el-col> 
 | 
          <el-col :span="12"> 
 | 
            <el-form-item label="谷段:" prop="valley"> 
 | 
              <el-input 
 | 
                  v-model="form.valley" 
 | 
                  placeholder="请输入谷段" 
 | 
                  clearable 
 | 
                  type="number" 
 | 
                  step="0.01" 
 | 
                  min="0" 
 | 
              /> 
 | 
            </el-form-item> 
 | 
          </el-col> 
 | 
        </el-row> 
 | 
        <el-row :gutter="30"> 
 | 
         <el-col :span="12"> 
 | 
           <el-form-item label="平段:" prop="flat"> 
 | 
             <el-input 
 | 
                 v-model="form.flat" 
 | 
                 placeholder="请输入平段" 
 | 
                 clearable 
 | 
                 type="number" 
 | 
                 step="0.01" 
 | 
                 min="0" 
 | 
             /> 
 | 
           </el-form-item> 
 | 
         </el-col> 
 | 
          <el-col :span="12"> 
 | 
            <el-form-item label="尖段:" prop="sharp"> 
 | 
              <el-input 
 | 
                  v-model="form.sharp" 
 | 
                  placeholder="请输入尖段" 
 | 
                  clearable 
 | 
                  type="number" 
 | 
                  step="0.01" 
 | 
                  min="0" 
 | 
              /> 
 | 
            </el-form-item> 
 | 
          </el-col> 
 | 
        </el-row> 
 | 
      </el-form> 
 | 
      <template #footer> 
 | 
        <div class="dialog-footer"> 
 | 
          <el-button type="primary" @click="submitForm">确认</el-button> 
 | 
          <el-button @click="closeDia">取消</el-button> 
 | 
        </div> 
 | 
      </template> 
 | 
    </el-dialog> 
 | 
  </div> 
 | 
</template> 
 | 
<script setup> 
 | 
import {Search} from "@element-plus/icons-vue"; 
 | 
import {onMounted, ref, getCurrentInstance} from "vue"; 
 | 
import {ElMessageBox} from "element-plus"; 
 | 
import {getToken} from "@/utils/auth.js"; 
 | 
import {periodListPage,periodDelete,periodAdd,periodUpdate} from "@/api/energyManagement/index.js"; 
 | 
const { proxy } = getCurrentInstance(); 
 | 
  
 | 
const data = reactive({ 
 | 
    searchForm: { 
 | 
        date: "", 
 | 
        price: "" 
 | 
    }, 
 | 
    form: { 
 | 
        date: "", 
 | 
        price: "", 
 | 
        peak: "", 
 | 
        valley: "", 
 | 
        flat: "", 
 | 
        sharp: "" 
 | 
    } 
 | 
}); 
 | 
const { searchForm,form } = toRefs(data); 
 | 
const page = ref({ 
 | 
  current: 1, 
 | 
  size: 10, 
 | 
  total: 0 
 | 
}); 
 | 
const dialogFormVisible = ref(false); 
 | 
const selectedRows = ref([]); 
 | 
const operationType = ref(''); 
 | 
const tableData = ref([]); 
 | 
const emit = defineEmits(['close']) 
 | 
const tableLoading = ref(false); 
 | 
const tableColumn = ref([ 
 | 
    // { 
 | 
    //     label: "时段名称", 
 | 
    //     prop: "timeName", 
 | 
    //     width: 200, 
 | 
    // }, 
 | 
    { 
 | 
        label: "日期", 
 | 
        prop: "date", 
 | 
        width: 200, 
 | 
    }, 
 | 
    { 
 | 
        label: "电价(元/度)", 
 | 
        prop: "price", 
 | 
        width: 200, 
 | 
    }, 
 | 
        { 
 | 
        label: "峰段", 
 | 
        prop: "peak", 
 | 
    }, 
 | 
    { 
 | 
        label: "谷段", 
 | 
        prop: "valley", 
 | 
    }, 
 | 
    { 
 | 
        label: "平段", 
 | 
        prop: "flat", 
 | 
    }, 
 | 
    { 
 | 
        label: "尖段", 
 | 
        prop: "sharp", 
 | 
    }, 
 | 
    { 
 | 
        dataType: "action", 
 | 
        label: "操作", 
 | 
        align: "center", 
 | 
        fixed: 'right', 
 | 
        operation: [ 
 | 
            { 
 | 
                name: "编辑", 
 | 
                type: "text", 
 | 
                clickFun: (row) => { 
 | 
                    openForm("edit", row); 
 | 
                }, 
 | 
            }, 
 | 
        ], 
 | 
    }, 
 | 
]); 
 | 
  
 | 
  
 | 
// 表格选择数据 
 | 
const handleSelectionChange = (selection) => { 
 | 
    selectedRows.value = selection; 
 | 
}; 
 | 
const formDia = ref() 
 | 
const upload = reactive({ 
 | 
    // 是否显示弹出层(客户导入) 
 | 
    open: false, 
 | 
    // 弹出层标题(客户导入) 
 | 
    title: "", 
 | 
    // 是否禁用上传 
 | 
    isUploading: false, 
 | 
    // 设置上传的请求头部 
 | 
    headers: { Authorization: "Bearer " + getToken() }, 
 | 
    // 上传的地址 
 | 
    url: import.meta.env.VITE_APP_BASE_API + "/equipmentEnergyConsumption/importData", 
 | 
    // 文件上传前的回调 
 | 
    beforeUpload: (file) => { 
 | 
        console.log('文件即将上传', file); 
 | 
        // 可以在此处做文件类型或大小校验 
 | 
        const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls'); 
 | 
        if (!isValid) { 
 | 
            proxy.$modal.msgError("只能上传 Excel 文件"); 
 | 
        } 
 | 
        return isValid; 
 | 
    }, 
 | 
    // 文件状态改变时的回调 
 | 
    onChange: (file, fileList) => { 
 | 
        console.log('文件状态改变', file, fileList); 
 | 
    }, 
 | 
    // 文件上传成功时的回调 
 | 
    onSuccess: (response, file, fileList) => { 
 | 
        console.log('上传成功', response, file, fileList); 
 | 
        if(response.code === 200){ 
 | 
            proxy.$modal.msgSuccess("文件上传成功"); 
 | 
        }else if(response.code === 500){ 
 | 
            ElMessageBox.error(response.msg); 
 | 
        }else{ 
 | 
            ElMessageBox.warning(response.msg); 
 | 
        } 
 | 
    }, 
 | 
    // 文件上传失败时的回调 
 | 
    onError: (error, file, fileList) => { 
 | 
        console.error('上传失败', error, file, fileList); 
 | 
        ElMessageBox.error("文件上传失败"); 
 | 
    }, 
 | 
    // 文件上传进度回调 
 | 
    onProgress: (event, file, fileList) => { 
 | 
        console.log('上传中...', event.percent); 
 | 
    } 
 | 
}); 
 | 
  
 | 
// 查询列表 
 | 
/** 搜索按钮操作 */ 
 | 
const handleQuery = () => { 
 | 
    page.current = 1; 
 | 
    getList(); 
 | 
}; 
 | 
//重置 
 | 
const resetFilters = () => { 
 | 
    searchForm.value = { 
 | 
        date: "", 
 | 
        price: "" 
 | 
    }; 
 | 
  getList(); 
 | 
  
 | 
}; 
 | 
const pagination = (obj) => { 
 | 
    page.current = obj.page; 
 | 
    page.size = obj.limit; 
 | 
    getList(); 
 | 
}; 
 | 
const getList = () => { 
 | 
    tableLoading.value = true; 
 | 
    periodListPage({ ...searchForm.value, ...page.value }).then((res) => { 
 | 
            tableLoading.value = false; 
 | 
            if (res && res.data) { 
 | 
                tableData.value = res.data.records || []; 
 | 
                page.total = res.data.total || 0; 
 | 
            } else { 
 | 
                tableData.value = []; 
 | 
                page.total = 0; 
 | 
                ElMessageBox.warning('未获取到数据'); 
 | 
            } 
 | 
        }) 
 | 
        .catch((err) => { 
 | 
            tableLoading.value = false; 
 | 
            console.error('数据加载失败:', err); 
 | 
            ElMessageBox.error('数据加载失败,请重试'); 
 | 
        }); 
 | 
}; 
 | 
// 打开弹框 
 | 
const openDialog = (type, row) => { 
 | 
  operationType.value = type; 
 | 
  dialogFormVisible.value = true; 
 | 
    // form.value.maintainer = userStore.nickName; 
 | 
    // form.value.maintenanceTime = getCurrentDate(); 
 | 
    form.value = {} 
 | 
    proxy.resetForm("formRef"); 
 | 
    periodListPage().then((res) => { 
 | 
        codeList.value = res.data; 
 | 
    }); 
 | 
    if (type === "edit") { 
 | 
        form.value = {...row} 
 | 
    } 
 | 
} 
 | 
// 打开弹框 
 | 
const openForm = (type, row) => { 
 | 
    openDialog(type, row) 
 | 
}; 
 | 
// 提交表单 
 | 
const submitForm = () => { 
 | 
    proxy.$refs["formRef"].validate(valid => { 
 | 
        if (valid) { 
 | 
            if (operationType.value === "add") { 
 | 
                periodAdd(form.value).then(response => { 
 | 
                    proxy.$modal.msgSuccess("新增成功") 
 | 
                    closeDia() 
 | 
                    getList() 
 | 
                }) 
 | 
            } else { 
 | 
                periodUpdate(form.value).then(response => { 
 | 
                    proxy.$modal.msgSuccess("修改成功") 
 | 
                    closeDia() 
 | 
                    getList() 
 | 
                }) 
 | 
            } 
 | 
        } 
 | 
    }) 
 | 
} 
 | 
// 关闭弹框 
 | 
const closeDia = () => { 
 | 
    proxy.resetForm("formRef"); 
 | 
    dialogFormVisible.value = false; 
 | 
    emit('close') 
 | 
}; 
 | 
/** 导入按钮操作 */ 
 | 
function handleImport() { 
 | 
    upload.title = "设备能耗"; 
 | 
    upload.open = true; 
 | 
    // 清空上次上传的文件列表 
 | 
    nextTick(() => { 
 | 
        proxy.$refs["uploadRef"]?.clearFiles(); 
 | 
    }); 
 | 
} 
 | 
function importTemplate() { 
 | 
    proxy.download( 
 | 
        "/equipmentEnergyConsumption/export", 
 | 
        {}, 
 | 
        '设备能耗导入模版.xlsx' 
 | 
    ); 
 | 
} 
 | 
/** 提交上传文件 */ 
 | 
function submitFileForm() { 
 | 
    proxy.$refs["uploadRef"].submit(); 
 | 
} 
 | 
  
 | 
/** 弹框关闭时清空文件列表 */ 
 | 
function handleDialogClose() { 
 | 
    nextTick(() => { 
 | 
        proxy.$refs["uploadRef"]?.clearFiles(); 
 | 
    }); 
 | 
} 
 | 
  
 | 
const handleDelete = () => { 
 | 
    let ids = []; 
 | 
    if (selectedRows.value.length > 0) { 
 | 
        ids = selectedRows.value.map((item) => item.id); 
 | 
    } else { 
 | 
        proxy.$modal.msgWarning("请选择数据"); 
 | 
        return; 
 | 
    } 
 | 
    ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", { 
 | 
        confirmButtonText: "确认", 
 | 
        cancelButtonText: "取消", 
 | 
        type: "warning", 
 | 
    }) 
 | 
    .then(() => { 
 | 
        tableLoading.value = true; 
 | 
        periodDelete(ids) 
 | 
            .then((res) => { 
 | 
                proxy.$modal.msgSuccess("删除成功"); 
 | 
                getList(); 
 | 
            }) 
 | 
            .finally(() => { 
 | 
                tableLoading.value = false; 
 | 
            }); 
 | 
    }) 
 | 
    .catch(() => { 
 | 
        proxy.$modal.msg("已取消"); 
 | 
    }); 
 | 
}; 
 | 
  
 | 
// 导出 
 | 
const handleOut = () => { 
 | 
    ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", { 
 | 
        confirmButtonText: "确认", 
 | 
        cancelButtonText: "取消", 
 | 
        type: "warning", 
 | 
    }) 
 | 
        .then(() => { 
 | 
            proxy.download("/energyPeriod/export", {}, "用电时段管理.xlsx"); 
 | 
        }) 
 | 
        .catch(() => { 
 | 
            proxy.$modal.msg("已取消"); 
 | 
        }); 
 | 
}; 
 | 
  
 | 
onMounted(() => { 
 | 
    getList(); 
 | 
}); 
 | 
</script> 
 | 
  
 | 
<style scoped> 
 | 
  
 | 
</style> 
 |