|
@@ -1,43 +1,29 @@
|
|
|
<template>
|
|
|
<div class="container">
|
|
|
- <div v-show="!dataManagementAddState.show && !dataManagementEditState.show && !dataManagementViewState.show" class="search-bar">
|
|
|
- <h1>数据管理</h1>
|
|
|
- <transition name="fade">
|
|
|
- <div v-show="showSearch" class="mb-[10px]">
|
|
|
- <el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
|
|
- <el-form-item label="选择数据:" prop="planType" label-width="auto">
|
|
|
- <div class="flex" style="align-items: center; justify-content: flex-start;">
|
|
|
- <el-select v-model="queryParams.search" placeholder="选择数据" clearable>
|
|
|
- <el-option v-for="item in type" :key="item.value" :label="item.label" :value="item.value"></el-option>
|
|
|
- </el-select>
|
|
|
- <div class="info" style="margin-left: 20px">
|
|
|
- <span>数据更新:{{ dataUpdateTime }}</span>
|
|
|
- <span class="spacer">数源单位:{{ dataSourceUnit }}</span>
|
|
|
- </div>
|
|
|
+ <div v-show="!dataManagementAddState.show && !dataManagementViewState.show" class="search-bar">
|
|
|
+ <div class="mb-[10px]">
|
|
|
+ <el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
|
|
+ <el-form-item label="选择数据:" prop="planType" label-width="auto">
|
|
|
+ <div class="flex" style="align-items: center; justify-content: flex-start">
|
|
|
+ <el-select v-model="queryParams.dataType" placeholder="选择数据" @change="onDataTypeChange">
|
|
|
+ <el-option v-for="item in type" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ <div class="info">
|
|
|
+ <span>数据更新:{{ dataUpdateTime }}</span>
|
|
|
+ <span class="spacer">数源单位:{{ dataSourceUnit }}</span>
|
|
|
</div>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </div>
|
|
|
- </transition>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" icon="Plus" @click="handleAdd">录入</el-button>
|
|
|
- <input ref="excelFileInput" type="file" style="display: none" accept=".xlsx, .xls" @change="handleExcelUpload" />
|
|
|
- <el-button class="spacer" plain icon="Upload" @click="triggerExcelUpload">批量导入</el-button>
|
|
|
+ <el-button plain icon="Upload" @click="openImportDialog">批量导入</el-button>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
- <el-table :data="tableData" style="width: 100%">
|
|
|
- <el-table-column type="selection" width="55"></el-table-column>
|
|
|
- <el-table-column prop="id" label="序号" width="50"></el-table-column>
|
|
|
- <el-table-column prop="name" label="工程名称"></el-table-column>
|
|
|
- <el-table-column prop="unit" label="建设单位"></el-table-column>
|
|
|
- <el-table-column prop="maintainUnit" label="维护单位"></el-table-column>
|
|
|
- <el-table-column prop="engineer" label="人防专业监理工程师"></el-table-column>
|
|
|
- <el-table-column prop="location" label="建设地点"></el-table-column>
|
|
|
- <el-table-column prop="operation" label="操作方式"></el-table-column>
|
|
|
- <el-table-column prop="plannedArea" label="应建人防地下室面积(㎡)"></el-table-column>
|
|
|
- <el-table-column prop="actualArea" label="实建人防地下室面积(㎡)"></el-table-column>
|
|
|
- <el-table-column prop="updateTime" label="更新时间"></el-table-column>
|
|
|
- <el-table-column label="操作" align="center" width="150px" class-name="small-padding fixed-width">
|
|
|
+ <el-table v-loading="loading" :data="tableData">
|
|
|
+ <el-table-column v-for="(item, index) in tableHeader" :key="index" :prop="item.prop" :label="item.label" :fixed="item.fixed" min-width="80" />
|
|
|
+ <el-table-column label="操作" align="center" width="150px" fixed="right">
|
|
|
<template #default="scope">
|
|
|
<el-text v-hasPermi="['system:menu:View']" class="common-btn-text-primary" @click="handleView(scope.row)">查看</el-text>
|
|
|
<el-text v-hasPermi="['system:menu:edit']" class="common-btn-text-primary" @click="handleUpdate(scope.row)">修改</el-text>
|
|
@@ -45,165 +31,225 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
- <div class="pagination">
|
|
|
- <el-pagination
|
|
|
- background
|
|
|
- layout="prev, pager, next, jumper"
|
|
|
- :total="total"
|
|
|
- :page-size="pageSize"
|
|
|
- :class="paginationRight"
|
|
|
- @current-change="handlePageChange"
|
|
|
- ></el-pagination>
|
|
|
- </div>
|
|
|
- <DataManagementAdd v-if="dataManagementAddState.show" @close="handleCancel" @refresh="tableData" />
|
|
|
- <DataManagementEdit v-if="dataManagementEditState.show" :event-id="dataManagementEditState.eventId" @close="handleCancel" @refresh="tableData" />
|
|
|
- <DataManagementView v-if="dataManagementViewState.show" :event-id="dataManagementViewState.eventId" @close="handleCancel" />
|
|
|
+ <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
|
|
|
+ <AddDataManagement
|
|
|
+ v-if="dataManagementAddState.show"
|
|
|
+ :dataType="queryParams.dataType"
|
|
|
+ :detailId="dataManagementAddState.id"
|
|
|
+ @onCancel="handleCancel"
|
|
|
+ @onConfirm="onConfirm"
|
|
|
+ />
|
|
|
+ <ViewDataManagement
|
|
|
+ v-if="dataManagementViewState.show"
|
|
|
+ :dataType="queryParams.dataType"
|
|
|
+ :detailId="dataManagementViewState.id"
|
|
|
+ @onCancel="handleCancel"
|
|
|
+ />
|
|
|
+ <DataImport v-model="showImportDialog" :url="importUrl" :file-name="importUrl" :steps-text="fileName" />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
-<script setup lang="ts">
|
|
|
-import { onMounted, reactive, ref } from 'vue';
|
|
|
-import { ElFormItem } from 'element-plus';
|
|
|
-import DataManagementView from '@/views/dataManagement/dataManagementView.vue';
|
|
|
-import DataManagementAdd from '@/views/dataManagement/dataManagementADD.vue';
|
|
|
-import DataManagementEdit from '@/views/dataManagement/dataManagementEdit.vue';
|
|
|
+<script lang="ts" setup>
|
|
|
+import ViewDataManagement from './ViewDataManagement.vue';
|
|
|
+import AddDataManagement from './AddDataManagement.vue';
|
|
|
|
|
|
-const queryParams = ref({
|
|
|
- search: ''
|
|
|
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
+const queryParams = reactive({
|
|
|
+ dataType: '',
|
|
|
+ page: 1,
|
|
|
+ pageSize: 10
|
|
|
});
|
|
|
+let loading = ref(false);
|
|
|
+const total = ref(0); // 总条目数
|
|
|
+const type = ref([]);
|
|
|
|
|
|
-const type = [{ value: '1', label: '在建工地' }];
|
|
|
-const showSearch = ref(true);
|
|
|
-const excelFileInput = ref(null);
|
|
|
+const tableHeader = ref([]);
|
|
|
+// 表格数据
|
|
|
+const tableData = ref([]);
|
|
|
+const dataUpdateTime = ref('');
|
|
|
+const dataSourceUnit = ref('');
|
|
|
|
|
|
-const triggerExcelUpload = () => {
|
|
|
- // 触发文件输入的点击事件
|
|
|
- excelFileInput.value.click();
|
|
|
-};
|
|
|
-
|
|
|
-const tableData = ref([
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- name: '光华北路人防工程',
|
|
|
- unit: '茂名市应急管理局',
|
|
|
- maintainUnit: '茂名市应急管理局',
|
|
|
- engineer: '',
|
|
|
- location: '茂名市茂南区光华北路668号',
|
|
|
- operation: '',
|
|
|
- plannedArea: 122,
|
|
|
- actualArea: 123,
|
|
|
- updateTime: '2023-12-12 12:13'
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- name: '光华北路人防工程2',
|
|
|
- unit: '茂名市应急管理局',
|
|
|
- maintainUnit: '茂名市应急管理局',
|
|
|
- engineer: '',
|
|
|
- location: '茂名市茂南区光华北路668号',
|
|
|
- operation: '',
|
|
|
- plannedArea: 122,
|
|
|
- actualArea: 123,
|
|
|
- updateTime: '2023-12-12 12:13'
|
|
|
- },
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- name: '光华北路人防工程3',
|
|
|
- unit: '茂名市应急管理局',
|
|
|
- maintainUnit: '茂名市应急管理局',
|
|
|
- engineer: '',
|
|
|
- location: '茂名市茂南区光华北路668号',
|
|
|
- operation: '',
|
|
|
- plannedArea: 122,
|
|
|
- actualArea: 123,
|
|
|
- updateTime: '2023-12-12 12:13'
|
|
|
- }
|
|
|
-]);
|
|
|
-
|
|
|
-const total = ref(30); // 总条目数
|
|
|
-const pageSize = ref(10); // 每页显示条目数
|
|
|
-
|
|
|
-const dataUpdateTime = ref('2023-12-12 12:13');
|
|
|
-const dataSourceUnit = ref('茂名市应急管理局');
|
|
|
-
|
|
|
-const handleExcelUpload = (event) => {
|
|
|
- const files = event.target.files;
|
|
|
- if (files.length) {
|
|
|
- const file = files[0];
|
|
|
- // 这里可以添加前端的文件验证逻辑,比如文件类型和大小
|
|
|
-
|
|
|
- // 假设有一个后端API处理Excel文件上传
|
|
|
- const formData = new FormData();
|
|
|
- formData.append('file', file);
|
|
|
-
|
|
|
- // 发送请求到后端API
|
|
|
- fetch('YOUR_BACKEND_API_URL', {
|
|
|
- // 替换为你的后端API URL
|
|
|
- method: 'POST',
|
|
|
- body: formData
|
|
|
- })
|
|
|
- .then((response) => response.json())
|
|
|
- .then((data) => {
|
|
|
- console.log('文件上传成功', data);
|
|
|
- // 处理上传成功的逻辑
|
|
|
- })
|
|
|
- .catch((error) => {
|
|
|
- console.error('文件上传失败', error);
|
|
|
- // 处理上传失败的逻辑
|
|
|
- });
|
|
|
- }
|
|
|
-};
|
|
|
+let showImportDialog = ref(false);
|
|
|
+let importUrl = ref('');
|
|
|
+let fileName = ref('');
|
|
|
|
|
|
let dataManagementViewState = reactive({
|
|
|
show: false,
|
|
|
- eventId: ''
|
|
|
+ id: ''
|
|
|
});
|
|
|
|
|
|
-let dataManagementEditState = reactive({
|
|
|
- show: false,
|
|
|
- eventId: ''
|
|
|
-});
|
|
|
let dataManagementAddState = reactive({
|
|
|
- show: false
|
|
|
+ show: false,
|
|
|
+ id: ''
|
|
|
});
|
|
|
+
|
|
|
+// 打开新增
|
|
|
const handleAdd = () => {
|
|
|
+ dataManagementAddState.id = '';
|
|
|
dataManagementAddState.show = true;
|
|
|
};
|
|
|
-
|
|
|
+// 打开详情
|
|
|
const handleView = (row: any) => {
|
|
|
- dataManagementViewState.eventId = row.id;
|
|
|
+ dataManagementViewState.id = row.id;
|
|
|
dataManagementViewState.show = true;
|
|
|
};
|
|
|
-
|
|
|
+// 打开修改
|
|
|
const handleUpdate = (row: any) => {
|
|
|
- dataManagementEditState.eventId = row.id;
|
|
|
- dataManagementEditState.show = true;
|
|
|
+ dataManagementAddState.id = row.id;
|
|
|
+ dataManagementAddState.show = true;
|
|
|
};
|
|
|
-
|
|
|
+// 关闭
|
|
|
const handleCancel = () => {
|
|
|
dataManagementViewState.show = false;
|
|
|
- dataManagementEditState.show = false;
|
|
|
dataManagementAddState.show = false;
|
|
|
};
|
|
|
|
|
|
-onMounted(() => {
|
|
|
- loadData();
|
|
|
-});
|
|
|
-
|
|
|
-const loadData = () => {
|
|
|
- // 实现数据加载逻辑
|
|
|
+const onConfirm = () => {
|
|
|
+ handleCancel();
|
|
|
+ queryParams.page = 1;
|
|
|
+ getList();
|
|
|
};
|
|
|
-
|
|
|
+// 删除
|
|
|
const removeItem = (item) => {
|
|
|
- const index = tableData.value.findIndex((row) => row.id === item.id);
|
|
|
+ proxy?.$modal.confirm('是否确认删除选择的数据项?').then(() => {
|
|
|
+ const index = tableData.value.findIndex((row) => row.id === item.id);
|
|
|
+ if (index !== -1) {
|
|
|
+ tableData.value.splice(index, 1);
|
|
|
+ }
|
|
|
+ proxy?.$modal.msgSuccess('删除成功');
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+// 数据选择变化
|
|
|
+const onDataTypeChange = () => {
|
|
|
+ const index = type.value.findIndex((row) => row.value === queryParams.dataType);
|
|
|
if (index !== -1) {
|
|
|
- tableData.value.splice(index, 1);
|
|
|
+ importUrl.value = type.value[index].label + '.xlsx';
|
|
|
+ fileName.value = type.value[index].label;
|
|
|
}
|
|
|
+ queryParams.page = 1;
|
|
|
+ getList();
|
|
|
};
|
|
|
|
|
|
-const handlePageChange = (page) => {
|
|
|
- console.log('当前页码', page);
|
|
|
+// 获取表格数据
|
|
|
+const getList = () => {
|
|
|
+ loading.value = true;
|
|
|
+ setTimeout(() => {
|
|
|
+ if (queryParams.dataType === '1') {
|
|
|
+ const tempTableHeader = [
|
|
|
+ { label: 'ID', prop: 'id' },
|
|
|
+ { label: '工程名称', prop: 'name' },
|
|
|
+ { label: '建设单位', prop: 'unit' },
|
|
|
+ { label: '人防专业监理工程师', prop: 'engineer' },
|
|
|
+ { label: '建设地点', prop: 'location' },
|
|
|
+ { label: '操作方式', prop: 'operation' },
|
|
|
+ { label: '应建人防地下室面积(㎡)', prop: 'plannedArea' },
|
|
|
+ { label: '实建人防地下室面积(㎡)', prop: 'actualArea' },
|
|
|
+ { label: '更新时间', prop: 'updateTime' }
|
|
|
+ ];
|
|
|
+ for (let i = 0; i < tempTableHeader.length; i++) {
|
|
|
+ if (tempTableHeader[i].prop === 'id') {
|
|
|
+ tempTableHeader[i].fixed = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tableHeader.value = tempTableHeader;
|
|
|
+ tableData.value = [
|
|
|
+ {
|
|
|
+ id: '1',
|
|
|
+ name: '光华北路人防工程',
|
|
|
+ unit: '茂名市应急管理局',
|
|
|
+ maintainUnit: '茂名市应急管理局',
|
|
|
+ engineer: '',
|
|
|
+ location: '茂名市茂南区光华北路668号',
|
|
|
+ operation: '',
|
|
|
+ plannedArea: 122,
|
|
|
+ actualArea: 123,
|
|
|
+ updateTime: '2023-12-12 12:13'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: '2',
|
|
|
+ name: '光华北路人防工程2',
|
|
|
+ unit: '茂名市应急管理局',
|
|
|
+ maintainUnit: '茂名市应急管理局',
|
|
|
+ engineer: '',
|
|
|
+ location: '茂名市茂南区光华北路668号',
|
|
|
+ operation: '',
|
|
|
+ plannedArea: 122,
|
|
|
+ actualArea: 123,
|
|
|
+ updateTime: '2023-12-12 12:13'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: '3',
|
|
|
+ name: '光华北路人防工程3',
|
|
|
+ unit: '茂名市应急管理局',
|
|
|
+ maintainUnit: '茂名市应急管理局',
|
|
|
+ engineer: '',
|
|
|
+ location: '茂名市茂南区光华北路668号',
|
|
|
+ operation: '',
|
|
|
+ plannedArea: 122,
|
|
|
+ actualArea: 123,
|
|
|
+ updateTime: '2023-12-12 12:13'
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ total.value = 3;
|
|
|
+ } else {
|
|
|
+ const tempTableHeader = [
|
|
|
+ { label: 'ID', prop: 'id' },
|
|
|
+ { label: '姓名', prop: 'name' },
|
|
|
+ { label: '所属区域', prop: 'area' },
|
|
|
+ { label: '单位', prop: 'company' },
|
|
|
+ { label: '职位', prop: 'official' },
|
|
|
+ { label: '联系电话', prop: 'phone' },
|
|
|
+ { label: '专家类型', prop: 'type' }
|
|
|
+ ];
|
|
|
+ for (let i = 0; i < tempTableHeader.length; i++) {
|
|
|
+ if (tempTableHeader[i].prop === 'id') {
|
|
|
+ tempTableHeader[i].fixed = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tableHeader.value = tempTableHeader;
|
|
|
+ tableData.value = [
|
|
|
+ {
|
|
|
+ id: '1',
|
|
|
+ name: '陈洋',
|
|
|
+ area: '高州市',
|
|
|
+ company: '高州市明洋化工有限公司',
|
|
|
+ official: '工程师',
|
|
|
+ phone: '13509917455',
|
|
|
+ type: '森林火灾'
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ total.value = 1;
|
|
|
+ }
|
|
|
+ dataUpdateTime.value = '2023-12-12 12:13';
|
|
|
+ dataSourceUnit.value = '茂名市应急管理局';
|
|
|
+ loading.value = false;
|
|
|
+ }, 500);
|
|
|
};
|
|
|
+// 加载数据
|
|
|
+const loadData = () => {
|
|
|
+ // 实现数据加载逻辑
|
|
|
+ // 需要先获取选项,根据第一个选项获取tableData和导入配置
|
|
|
+ type.value = [
|
|
|
+ { label: '在建工地', value: '1' },
|
|
|
+ { label: '应急管理专家', value: '2' }
|
|
|
+ ];
|
|
|
+ importUrl.value = type.value[0].label + '.xlsx';
|
|
|
+ fileName.value = type.value[0].label;
|
|
|
+ queryParams.dataType = type.value[0].value;
|
|
|
+ getList();
|
|
|
+};
|
|
|
+
|
|
|
+// 打开批量导入弹窗
|
|
|
+const openImportDialog = () => {
|
|
|
+ showImportDialog.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ loadData();
|
|
|
+});
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
@@ -219,15 +265,10 @@ const handlePageChange = (page) => {
|
|
|
margin-bottom: 20px;
|
|
|
}
|
|
|
|
|
|
-.pagination {
|
|
|
- margin-top: 20px;
|
|
|
- display: flex;
|
|
|
- justify-content: flex-end;
|
|
|
-}
|
|
|
-
|
|
|
.info {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
+ margin-left: 20px;
|
|
|
}
|
|
|
|
|
|
.spacer {
|