yaowanxin
2025-08-08 7008407e4961a895b6bdab8e0c3fed11f9f67174
用电区域界面,时段请求
已修改1个文件
已添加2个文件
927 ■■■■■ 文件已修改
src/api/energyManagement/index.js 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/energyManagement/energyArea/index.vue 377 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/energyManagement/energyPeriodTime/index.vue 480 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/energyManagement/index.js
@@ -17,6 +17,23 @@
    params: query,
  })
}
// åŒºåŸŸ-分页查询
export function areaListPage(query) {
  return request({
    url: '/electricityConsumptionArea/listPage',
    method: 'get',
    params: query,
  })
}
// æ—¶é—´å‘¨æœŸ-分页查询
export function periodListPage(query) {
  return request({
    url: '/electricityConsumptionPeriod/listPage',
    method: 'get',
    params: query,
  })
}
// è®¾å¤‡èƒ½è€—-删除
export function equipmentEnergyDelete(query) {
  return request({
@@ -25,10 +42,45 @@
    data: query,
  })
}
// åŒºåŸŸ-删除
export function areaDelete(query) {
  return request({
    url: '/electricityConsumptionArea/delete',
    method: 'delete',
    data: query,
  })
}
// æ—¶é—´å‘¨æœŸ-删除
export function periodDelete(query) {
  return request({
    url: '/electricityConsumptionPeriod/delete',
    method: 'delete',
    data: query,
  })
}
// è®¾å¤‡èƒ½è€—-新增
export function equipmentEnergyAdd(query) {
  return request({
    url: '/equipmentEnergyConsumption/add',
    method: 'post',
    data: query,
  })
}
// åŒºåŸŸ-新增
export function areaAdd(query) {
  return request({
    url: '/electricityConsumptionArea/add',
    method: 'post',
    data: query,
  })
}
// æ—¶é—´å‘¨æœŸ-新增
export function periodAdd(query) {
  return request({
    url: '/electricityConsumptionPeriod/add',
    method: 'post',
    data: query,
  })
@@ -41,6 +93,24 @@
    data: query,
  })
}
//区域-修改
export function areaUpdate(query) {
  return request({
    url: '/electricityConsumptionArea/update',
    method: 'post',
    data: query,
  })
}
// æ—¶é—´å‘¨æœŸ-修改
export function periodUpdate(query) {
  return request({
    url: '/electricityConsumptionPeriod/update',
    method: 'post',
    data: query,
  })
}
// è®¾å¤‡ä¸‹æ‹‰æ¡†æŸ¥è¯¢
export function deviceList(query) {
  return request({
src/views/energyManagement/energyArea/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,377 @@
<template>
    <div class="app-container">
        <div class="search_form">
            <div>
                <span class="search_title">区域名称:</span>
                <el-input
                    v-model="searchForm.areaName"
                    style="width: 240px;margin-right: 30px"
                    placeholder="请输入"
                    @change="handleQuery"
                    clearable
                    :prefix-icon="Search"
                />
                <span class="search_title">区域类型:</span>
                <el-input
                    v-model="searchForm.areaType"
                    style="width: 240px"
                    placeholder="请输入"
                    @change="handleQuery"
                    clearable
                    :prefix-icon="Search"
                />
                <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
                >搜索</el-button
                >
            </div>
            <div>
                <el-button type="primary" @click="openForm('add')">新增</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="areaName">
                            <el-input
                                v-model="form.areaName"
                                placeholder="请输入"
                                clearable
                                @change="setName"
                                :disabled="operationType !== 'add'"
                            >
                                <!-- <el-option
                                    v-for="item in areaTypeList"
                                    :key="item"
                                    :label="item"
                                    :value="item"
                                >
                                    {{item}}
                                </el-option> -->
                            </el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="区域类型:" prop="areaType">
                            <el-input
                                v-model="form.areaType"
                                placeholder="请输入"
                                clearable
                            />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row :gutter="30">
                    <!-- <el-col :span="12">
                        <el-form-item label="运行时间:" prop="runDate">
                            <el-date-picker
                                style="width: 100%"
                                v-model="form.runDate"
                                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="fuId">
                            <el-input
                                v-model="form.fuId"
                                placeholder="请输入"
                                clearable
                            />
                        </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} from "vue";
import {ElMessageBox} from "element-plus";
import {getToken} from "@/utils/auth.js";
import {areaListPage,areaDelete,areaAdd,areaUpdate} from "@/api/energyManagement/index.js";
const { proxy } = getCurrentInstance();
const data = reactive({
    searchForm: {
        areaName: "",
        areaType: ""
    },
    form: {
        areaName: "",
        areaType: "",
        fuId: ""
    }
});
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: "areaName",
        width: 200,
    },
    {
        label: "区域类型",
        prop: "areaType",
        width: 200,
    },
    {
        label: "父区域",
        prop: "fuId",
    },
    {
        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 pagination = (obj) => {
    page.current = obj.page;
    page.size = obj.limit;
    getList();
};
const getList = () => {
    tableLoading.value = true;
    areaListPage({ ...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");
    areaListPage().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") {
                areaAdd(form.value).then(response => {
                    proxy.$modal.msgSuccess("新增成功")
                    closeDia()
                })
            } else {
                areaUpdate(form.value).then(response => {
                    proxy.$modal.msgSuccess("修改成功")
                    closeDia()
                })
            }
        }
    })
}
// å…³é—­å¼¹æ¡†
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;
        areaDelete(ids)
            .then((res) => {
                proxy.$modal.msgSuccess("删除成功");
                getList();
            })
            .finally(() => {
                tableLoading.value = false;
            });
    })
    .catch(() => {
        proxy.$modal.msg("已取消");
    });
};
onMounted(() => {
    getList();
});
</script>
<style scoped>
</style>
src/views/energyManagement/energyPeriodTime/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,480 @@
<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>