520 lines
15 KiB
Vue
Raw Normal View History

2025-10-30 15:34:23 +08:00
<template>
2025-10-31 16:16:56 +08:00
<div class="root">
<div class="search-box">
<el-input
2025-10-31 16:26:53 +08:00
v-model="params.mc"
2025-10-31 16:16:56 +08:00
style="width: 240px; margin-right: 10px"
size="large"
2025-10-31 16:26:53 +08:00
placeholder="请输入服务点名称"
2025-10-31 16:16:56 +08:00
:suffix-icon="Search"
@change="handleSearch"
/>
<el-select
v-model="params.zdlx"
style="width: 240px; margin-right: 10px"
size="large"
placeholder="站点类型"
:suffix-icon="Search"
@change="handleSearch"
:options="zdlxOptions"
clearable
/>
</div>
<div class="event-box">
<el-button type="primary" size="large" @click="openAddDialog"
>新增</el-button
>
</div>
<DynamicTable
:dataSource="tableData"
:columns="columns"
:autoHeight="true"
:pagination="pagination"
></DynamicTable>
<div class="dialog-container">
<MyDialog
v-model="dialogVisible"
title="站点详情"
:onConfirm="handleConfirm"
:onCancel="handleCancel"
2025-11-04 14:16:30 +08:00
width="60%"
2025-10-31 16:16:56 +08:00
>
<el-form
label-position="right"
label-width="auto"
2025-11-04 14:16:30 +08:00
style="overflow-y: auto; max-height: 60vh; padding-right: 50px"
2025-10-31 16:16:56 +08:00
>
2025-11-04 14:16:30 +08:00
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="区县名称:" prop="qxmc">
<el-input disabled v-model="detailData.qxmc" />
</el-form-item>
<el-form-item label="站点类型:" prop="zdlx">
<el-select
2025-11-05 15:10:15 +08:00
disabled
2025-11-04 14:16:30 +08:00
v-model="detailData.zdlx"
placeholder="请选择站点类型"
:options="zdlxOptions"
/>
</el-form-item>
<el-form-item label="路线编码:" prop="lxbm">
<el-input disabled v-model="detailData.lxbm" />
</el-form-item>
<el-form-item label="里程桩号:" prop="lczh">
<el-input disabled v-model="detailData.lczh" />
</el-form-item>
<el-form-item label="行政等级:" prop="xzdj">
<el-input disabled v-model="detailData.xzdj" />
</el-form-item>
<el-form-item label="机动车月交通流量:" prop="yjtll">
<el-input disabled v-model="detailData.yjtll" />
</el-form-item>
<el-form-item label="技术等级:" prop="jsdj">
2025-11-05 15:10:15 +08:00
<el-input disabled v-model="detailData.jsdj" />
2025-11-04 14:16:30 +08:00
</el-form-item>
<el-form-item label="备注:" prop="bz">
<el-input disabled v-model="detailData.bz" type="textarea" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="服务保障点具体名称:" prop="mc">
<el-input disabled v-model="detailData.mc" />
</el-form-item>
<el-form-item label="产权隶属单位:" prop="ssdw">
<el-input disabled v-model="detailData.ssdw" />
</el-form-item>
<el-form-item label="经度:" prop="jd">
<el-input disabled v-model="detailData.jd" />
</el-form-item>
<el-form-item label="纬度:" prop="wd">
<el-input disabled v-model="detailData.wd" />
</el-form-item>
<el-form-item label="充电桩根数:" prop="cdzgs">
<el-input disabled v-model="detailData.cdzgs" />
</el-form-item>
<el-form-item label="是否对外开放:" prop="sfdwkf">
<el-input disabled v-model="detailData.sfdwkf" />
</el-form-item>
<el-form-item label="对外开放的是否有如厕功能:" prop="sfdwkfrc">
<el-input disabled v-model="detailData.sfdwkfrc" />
</el-form-item>
</el-col>
</el-row>
2025-10-31 16:16:56 +08:00
</el-form>
</MyDialog>
<MyDialog
v-model="editDialogVisible"
:title="isEdit ? '编辑站点' : '新增站点'"
:onConfirm="isEdit ? handleEditConfirm : handleAddConfirm"
:onCancel="handleEditCancel"
2025-11-04 13:56:26 +08:00
width="60%"
2025-10-31 16:16:56 +08:00
>
<el-form
ref="editFormRef"
:model="editForm"
2025-11-04 14:16:30 +08:00
label-position="right"
2025-10-31 16:16:56 +08:00
label-width="auto"
2025-11-04 13:56:26 +08:00
:rules="{}"
2025-11-04 14:16:30 +08:00
style="overflow-y: auto; max-height: 60vh; padding-right: 50px"
2025-10-31 16:16:56 +08:00
>
2025-11-04 13:56:26 +08:00
<el-row :gutter="20">
<el-col :span="12">
2025-11-04 14:16:30 +08:00
<el-form-item label="区县名称:" prop="qxmc">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.qxmc" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="站点类型:" prop="zdlx">
2025-11-04 13:56:26 +08:00
<el-select
v-model="editForm.zdlx"
placeholder="请选择站点类型"
:options="zdlxOptions"
/>
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="路线编码:" prop="lxbm">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.lxbm" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="里程桩号:" prop="lczh">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.lczh" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="行政等级:" prop="xzdj">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.xzdj" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="机动车月交通流量:" prop="yjtll">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.yjtll" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="技术等级:" prop="jsdj">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.jsdj" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="备注:" prop="bz">
<el-input v-model="editForm.bz" type="textarea" />
</el-form-item>
2025-11-04 13:56:26 +08:00
</el-col>
<el-col :span="12">
2025-11-04 14:16:30 +08:00
<el-form-item label="服务保障点具体名称:" prop="mc">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.mc" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="产权隶属单位:" prop="ssdw">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.ssdw" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="经度:" prop="jd">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.jd" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="纬度:" prop="wd">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.wd" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="充电桩根数:" prop="cdzgs">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.cdzgs" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="是否对外开放:" prop="sfdwkf">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.sfdwkf" />
</el-form-item>
2025-11-04 14:16:30 +08:00
<el-form-item label="对外开放的是否有如厕功能:" prop="sfdwkfrc">
2025-11-04 13:56:26 +08:00
<el-input v-model="editForm.sfdwkfrc" />
</el-form-item>
</el-col>
</el-row>
2025-10-31 16:16:56 +08:00
</el-form>
</MyDialog>
</div>
</div>
2025-10-30 15:34:23 +08:00
</template>
<script lang="ts" setup>
2025-10-30 16:34:29 +08:00
import DynamicTable from "../../component/DynamicTable";
2025-10-31 16:16:56 +08:00
import { h, ref, onMounted, reactive, watch, toRaw } from "vue";
2025-10-30 16:34:29 +08:00
import { request } from "@/utils/request";
2025-10-31 16:16:56 +08:00
import { Search } from "@element-plus/icons-vue";
import MyDialog from "../../component/MyDialog";
2025-10-30 17:08:19 +08:00
2025-10-31 16:16:56 +08:00
const tableData = ref([]);
const detailData = ref({});
const dialogVisible = ref(false);
const handleCancel = () => {
dialogVisible.value = false;
};
const handleConfirm = () => {
dialogVisible.value = false;
};
2025-10-30 17:45:10 +08:00
2025-10-31 16:16:56 +08:00
// 表单初始状态
const INIT_FORM = {
id: "",
zdlx: "",
lxbm: "",
qxmc: "",
lczh: "",
xzdj: "",
yjtll: 0,
jsdj: "",
mc: "",
ssdw: "",
jd: "",
wd: "",
cdzgs: "",
sfdwkf: "",
sfdwkfrc: "",
bz: "",
};
// 站点类型选项
const zdlxOptions = [
{ label: "服务设施", value: "服务设施" },
{ label: "加油站", value: "加油站" },
{ label: "加气站", value: "加气站" },
{ label: "加氢站", value: "加氢站" },
{ label: "充电站", value: "充电站" },
];
// 是否在编辑状态
const isEdit = ref(false);
const editFormRef = ref();
const editForm = reactive({ ...INIT_FORM });
const editDialogVisible = ref(false);
const openEditDialog = (row) => {
editForm.id = row.id;
Object.assign(editForm, row);
editDialogVisible.value = true;
};
// 表单校验规则
const editRules = {
qxmc: [{ required: true, message: "请输入区县名称", trigger: "blur" }],
zdlx: [{ required: true, message: "请输入站点类型", trigger: "blur" }],
lxbm: [{ required: true, message: "请输入路线编码", trigger: "blur" }],
lczh: [{ required: true, message: "请输入里程桩号", trigger: "blur" }],
xzdj: [{ required: true, message: "请输入行政等级", trigger: "blur" }],
yjtll: [
{
required: true,
message: "请输入机动车月交通流量",
trigger: "blur",
},
{
type: "number",
message: "请输入正确的机动车月交通流量",
trigger: "blur",
},
],
jsdj: [{ required: true, message: "请输入技术等级", trigger: "blur" }],
mc: [
{ required: true, message: "请输入服务保障点具体名称", trigger: "blur" },
],
ssdw: [{ required: true, message: "请输入产权隶属单位", trigger: "blur" }],
jd: [{ required: true, message: "请输入经度", trigger: "blur" }],
wd: [{ required: true, message: "请输入纬度", trigger: "blur" }],
cdzgs: [{ required: true, message: "请输入充电桩根数", trigger: "blur" }],
sfdwkf: [{ required: true, message: "请输入是否对外开放", trigger: "blur" }],
sfdwkfrc: [
{
required: true,
message: "请输入对外开放的是否有如厕功能",
trigger: "blur",
},
],
};
const handleEditCancel = () => {
editDialogVisible.value = false;
};
const handleEditConfirm = async () => {
2025-10-30 17:08:19 +08:00
try {
2025-10-31 16:16:56 +08:00
await editFormRef.value.validate();
const res = await request({
2025-11-05 15:10:15 +08:00
url: `/api/yhz/update`,
method: "POST",
2025-10-31 16:16:56 +08:00
data: toRaw(editForm),
});
if (res.code === "00000") {
ElMessage({
message: "编辑成功",
type: "success",
});
getTableData();
editDialogVisible.value = false;
} else {
throw new Error(res.message);
}
} catch (error) {
console.log(error.message);
ElMessage({
message: error.message,
type: "error",
});
}
};
const resetForm = () => {
Object.assign(editForm, INIT_FORM);
};
2025-10-30 17:45:10 +08:00
2025-10-31 16:16:56 +08:00
// 打开新增站点弹窗
const openAddDialog = () => {
resetForm();
isEdit.value = false;
editDialogVisible.value = true;
};
// 新增站点
const handleAddConfirm = async () => {
try {
await editFormRef.value.validate();
const res = await request({
2025-11-05 15:10:15 +08:00
url: "/api/yhz/add",
2025-10-31 16:16:56 +08:00
method: "POST",
data: toRaw(editForm),
});
if (res.code === "00000") {
ElMessage({
message: "新增成功",
type: "success",
});
getTableData();
editDialogVisible.value = false;
} else {
throw new Error(res.message);
}
} catch (error) {
ElMessage({
message: error.message,
type: "error",
});
console.log(error.message);
}
};
// 搜索条件
const params = reactive({
2025-10-31 16:26:53 +08:00
mc: "",
2025-10-31 16:16:56 +08:00
zdlx: "",
});
const handleSearch = () => {
// 重置分页到第一页
pagination.current = 1;
getTableData();
};
// 获取养护站详情
const getDetailData = async (row) => {
try {
const res = await request({
2025-11-05 15:10:15 +08:00
url: `/snow-ops-platform/yhz/getById?id=${row.id}`,
2025-10-31 16:16:56 +08:00
method: "GET",
});
if (res.code === "00000") {
detailData.value = res.data;
2025-11-05 15:10:15 +08:00
return res.code;
2025-10-31 16:16:56 +08:00
} else {
detailData.value = {};
throw new Error(res.message);
}
} catch (error) {
2025-11-05 15:10:15 +08:00
ElMessage({
message: error.message,
type: "error",
});
2025-10-31 16:16:56 +08:00
console.log(error.message);
2025-11-05 15:10:15 +08:00
return -1;
2025-10-31 16:16:56 +08:00
}
};
// 获取养护站列表
const getTableData = async () => {
try {
2025-10-30 17:08:19 +08:00
const res = await request({
2025-11-05 15:10:15 +08:00
url: "/snow-ops-platform/yhz/list",
2025-10-30 17:08:19 +08:00
method: "GET",
2025-10-31 16:16:56 +08:00
params: {
...params,
pageNum: pagination.current,
pageSize: pagination.pageSize,
},
2025-10-30 17:08:19 +08:00
});
2025-10-31 16:16:56 +08:00
if (res.code === "00000") {
tableData.value = res.data.records;
pagination.total = res.data.total;
} else {
throw new Error(res.message);
}
} catch (error) {
console.log(error.message);
}
2025-10-30 17:08:19 +08:00
};
onMounted(() => {
getTableData();
});
2025-10-30 16:34:29 +08:00
const columns = [
{
2025-10-31 16:16:56 +08:00
prop: "mc",
2025-11-05 15:10:15 +08:00
label: "服务站名称",
2025-10-31 16:16:56 +08:00
},
{
2025-11-05 15:10:15 +08:00
prop: "sbsl",
label: "设备数量",
2025-10-31 16:16:56 +08:00
},
{
2025-11-05 15:10:15 +08:00
prop: "wzsl",
label: "物资数量",
2025-10-31 16:16:56 +08:00
},
{
2025-11-05 15:10:15 +08:00
prop: "rysl",
label: "人员数量",
2025-10-31 16:16:56 +08:00
},
{
2025-11-05 15:10:15 +08:00
prop: "qxmc",
label: "区县名称",
2025-10-30 16:34:29 +08:00
},
{
label: "操作",
fixed: "right",
2025-10-31 16:16:56 +08:00
width: 150,
2025-10-30 17:45:10 +08:00
render: (row) => () =>
2025-10-31 16:16:56 +08:00
h("div", { class: "action-btns" }, [
h(
ElButton,
{
type: "primary",
link: true,
onClick: async () => {
2025-11-05 15:10:15 +08:00
const res = await getDetailData(row);
if (res === "00000") {
dialogVisible.value = true;
}
2025-10-31 16:16:56 +08:00
},
},
() => "详情"
),
h(
ElButton,
{
type: "success",
link: true,
style: "margin-left: 10px;",
onClick: async () => {
2025-11-05 15:10:15 +08:00
const res = await getDetailData(row);
if (res === "00000") {
isEdit.value = true;
openEditDialog(row);
}
2025-10-31 16:16:56 +08:00
},
},
() => "编辑"
),
h(
ElButton,
{
type: "danger",
link: true,
style: "margin-left: 10px;",
onClick: async () => {
try {
await ElMessageBox.confirm("确定要删除该站点吗?", "删除确认", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
});
const res = await request({
2025-11-05 15:10:15 +08:00
url: `/snow-ops-platform/yhz/delete`,
method: "POST",
data: {
id: row.id,
}
2025-10-31 16:16:56 +08:00
});
if (res.code === "00000") {
ElMessage.success("删除成功");
getTableData();
}
} catch (error) {
if (error instanceof Error) {
ElMessage.error(error.message || "删除失败");
}
}
},
2025-10-30 17:45:10 +08:00
},
2025-10-31 16:16:56 +08:00
() => "删除"
),
]),
2025-10-30 16:34:29 +08:00
},
];
2025-10-30 17:45:10 +08:00
const pagination = reactive({
current: 1,
pageSize: 10,
total: 0,
pageSizes: [10, 20, 50],
layout: "prev, pager, next, jumper",
onChange: (page: number, pageSize: number) => {
pagination.current = page;
pagination.pageSize = pageSize;
2025-10-31 16:16:56 +08:00
getTableData();
2025-10-30 17:45:10 +08:00
},
});
2025-10-30 15:34:23 +08:00
</script>
<style lang="scss" scoped>
2025-10-31 16:16:56 +08:00
.root {
height: 100%;
2025-11-05 18:08:03 +08:00
// padding: 5px;
2025-10-31 16:16:56 +08:00
}
.event-box {
margin: 20px 0;
}
2025-10-30 15:34:23 +08:00
</style>