123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- <template>
- <n-divider dashed title-placement="left">测站点</n-divider>
- <div class="hc-layout-box">
- <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
- <template #header>
- <div class="hc-card-header flex items-center">
- <div class="w-60">
- <n-input v-model:value="searchForm.name" type="text" placeholder="请输入测站点或关键字进行搜索" clearable/>
- </div>
- <n-button type="primary" class="px-5 ml-3" @click="searchChange">搜索</n-button>
- <n-popover trigger="hover" :disabled="!bubbleVal || !btn_add?.textInfo" v-if="btn_add">
- <template #trigger>
- <n-button type="primary" strong secondary class="px-5 ml-10" @click="AddRowClick">新增</n-button>
- </template>
- <span>{{btn_add?.textInfo}}</span>
- </n-popover>
- <n-popover trigger="hover" :disabled="!bubbleVal || !btn_import?.textInfo" v-if="btn_import">
- <template #trigger>
- <n-button type="primary" strong secondary class="px-5 ml-3" @click="importModalClick">导入</n-button>
- </template>
- <span>{{btn_import?.textInfo}}</span>
- </n-popover>
- <n-popover trigger="hover" :disabled="!bubbleVal || !btn_export?.textInfo" v-if="btn_export">
- <template #trigger>
- <n-button type="primary" strong secondary class="px-5 ml-3" @click="exportModalClick">导出</n-button>
- </template>
- <span>{{btn_export?.textInfo}}</span>
- </n-popover>
- </div>
- </template>
- <template #header-extra>
- <HcTabs :datas="tabsTypeData" :keys="tabsTypeKey" @change="tabsTypeChange"/>
- </template>
- <div v-if="tabsTypeKey==='1'">
- <n-data-table :columns="traverseColumns" :data="traverseTable" :pagination="false" :row-key="row => row.name" :single-line="false" striped/>
- </div>
- <div v-if="tabsTypeKey==='0'">
- <n-data-table :columns="levelColumns" :data="levelTable" :pagination="false" :row-key="row => row.name" :single-line="false" striped/>
- </div>
- <template #action>
- <HcPage :pages="searchForm" @change="pageChange"/>
- </template>
- </n-card>
- </div>
- <!--新增/编辑 弹框-->
- <n-modal v-model:show="showRowModal">
- <n-card class="w-750" :title="rowModalTitle()" :segmented="{content: true}">
- <n-form ref="formRowRef" :model="formRowValue" :rules="rulesRow" label-placement="left" label-width="auto" size="large">
- <n-form-item label="点名称" path="name">
- <n-input class="flex-1" v-model:value="formRowValue.name" placeholder="请输入点名称"/>
- </n-form-item>
- <n-form-item label="X坐标(m)" path="x" v-if="tabsTypeKey === '1'">
- <n-input class="flex-1" v-model:value="formRowValue.x" placeholder="请输入X坐标(m)"/>
- </n-form-item>
- <n-form-item label="Y坐标(m)" path="y" v-if="tabsTypeKey === '1'">
- <n-input class="flex-1" v-model:value="formRowValue.y" placeholder="请输入Y坐标(m)"/>
- </n-form-item>
- <n-form-item label="高程(m)" path="h">
- <n-input class="flex-1" v-model:value="formRowValue.h" placeholder="请输入高程(m)"/>
- </n-form-item>
- <n-form-item label="等级">
- <n-select class="flex-1" v-model:value="formRowValue.level" :options="personData" placeholder="请选择等级"/>
- </n-form-item>
- <n-form-item label="备注">
- <n-input v-model:value="formRowValue.remark" placeholder="请输入文字说明" type="textarea" :autosize="{minRows: 3,maxRows: 5}"/>
- </n-form-item>
- </n-form>
- <template #action>
- <div class="text-center">
- <n-button class="px-5" @click="showRowModal = false">取消</n-button>
- <n-button type="primary" class="px-5 ml-4" :loading="saveFormLoading" @click="saveFormClick">保存</n-button>
- </div>
- </template>
- </n-card>
- </n-modal>
- <!--导入 弹框-->
- <n-modal v-model:show="showImportModal">
- <n-card class="w-750" :title="'导入' + getModalTitle()" :segmented="{content: true}">
- <div class="hc-import-modal-box">
- <div class="tip-box">
- <span>请先下载导入模板(</span>
- <a class="text-link" href="https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220614/a4b08ea228dbf74db1c049c4d878fbe7.xlsx" target="_blank" v-if="tabsTypeKey==='1'">导线点导入模板</a>
- <a class="text-link" href="https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220629/5fa2abeaa1ad553ee4adf64118df4e2a.xlsx" target="_blank" v-if="tabsTypeKey==='0'">水准点导入模板</a>
- <span> ),按模板样式编辑测站点后,再点击"选择文件"按钮选择编辑好的文件,并点击底部的"确认导入"按钮即可导入成功!</span>
- </div>
- <div class="upload-box">
- <n-upload ref="uploadRef" :action="action" :headers="getTokenHeader()" :data="upData" :max="1" :accept="accept" :default-upload="false" multiple @change="handleUploadChange" @finish="uploadFinish">
- <n-button type="primary" class="px-4">选择文件</n-button>
- </n-upload>
- </div>
- <div class="text-orange">导入模板格式示例:</div>
- <div class="demo-img-box" v-if="tabsTypeKey==='1'">
- <img src="../../assets/view/152221@2x.png" alt="">
- </div>
- <div class="demo-img-box" v-if="tabsTypeKey==='0'">
- <img src="../../assets/view/152211@2x.png" alt="">
- </div>
- </div>
- <template #action>
- <div class="text-center">
- <n-button class="px-4" @click="showImportModal = false">取消</n-button>
- <n-button type="primary" :disabled="!fileListLength" :loading="importLoading" class="px-4 ml-4" @click="handleImportClick">确认导入</n-button>
- </div>
- </template>
- </n-card>
- </n-modal>
- </template>
- <script setup>
- import {ref,watch,onMounted} from "vue";
- import {useAppStore} from "~src/store/index";
- import HcTabs from "~com/plugins/naive/HcTabs.vue"
- import HcPage from "~com/plugins/naive/HcPage.vue"
- import {renderTableEditDelButton} from "~src/plugins/renderele";
- import {getTokenHeader} from '~src/api/request/header';
- import station from '~api/gauge/station';
- import {download} from "~src/utils/lib/tools";
- //初始变量
- const useAppState = useAppStore()
- const projectId = ref(useAppState.getProjectId);
- const contractId = ref(useAppState.getContractId);
- //按钮气泡开关
- const bubbleVal = ref(useAppState.getBubble);
- //监听
- watch(() => [
- useAppState.getProjectId,
- useAppState.getContractId,
- useAppState.getBubble,
- ], ([UserProjectId,UserContractId,Bubble]) => {
- projectId.value = UserProjectId
- contractId.value = UserContractId
- //按钮气泡开关
- bubbleVal.value = Bubble
- })
- //获取气泡数据
- const getButtonsVal = (value) => {
- return useAppState.getButtonsVal(value)
- }
- //气泡数据
- const btn_add = ref(getButtonsVal('gauge-station-add'))
- const btn_import = ref(getButtonsVal('gauge-station-import'))
- const btn_export = ref(getButtonsVal('gauge-station-export'))
- const btn_edit = ref(getButtonsVal('gauge-station-edit'))
- const btn_del = ref(getButtonsVal('gauge-station-del'))
- //搜索表单
- const searchForm = ref({
- projectId: projectId.value,
- contractId: contractId.value,
- name: null, type: '1',
- current: 1, size: 20, total: 0
- })
- //结构类型tab数据和相关处理
- const tabsTypeKey = ref('1')
- const tabsTypeData = ref([
- {key:'0', name: '水准点'},
- {key:'1', name: '导线点'}
- ]);
- const tabsTypeChange = (value) => {
- tabsTypeKey.value = value;
- searchForm.value.type = value;
- searchForm.value.current = 1
- getTableData()
- }
- //渲染完成
- onMounted(() => {
- getTableData()
- })
- //新增编辑
- const showRowModal = ref(false)
- const formRowRef = ref(null)
- const formRowValue = ref({
- projectId: projectId.value,
- contractId: contractId.value,
- type: tabsTypeKey.value,
- name: '', x: '', y: '', h: '', level: null, remark: null
- })
- const personData = ref([
- {label: "一级", value: "一级"}, {label: "二级", value: "二级"},
- {label: "三级", value: "三级"}, {label: "四级", value: "四级"}
- ])
- const rulesRow = {
- name: {
- required: true,
- trigger: ["blur", "input"],
- message: "请输入测站点名称"
- },
- x: {
- required: true,
- trigger: ["blur", "input"],
- message: "请输入X坐标(m)"
- },
- y: {
- required: true,
- trigger: ["blur", "input"],
- message: "请输入Y坐标(m)"
- },
- h: {
- required: true,
- trigger: ["blur", "input"],
- message: "请输入高程(m)"
- }
- }
- //卡片弹窗标题
- const rowModalTitle = () => {
- let formType = '新增', tabType = '异常了';
- if (formRowValue.value.id) {
- formType = '编辑'
- }
- if (tabsTypeKey.value === '1') {
- tabType = '导线点'
- } else if (tabsTypeKey.value === '0') {
- tabType = '水准点'
- }
- return formType + tabType
- }
- //导线点的 表格表头
- const createTraverseColumns = ({edit,del}) => {
- return [
- {title: '序号', key: 'num', width: 80, align: 'center',
- render(_, index) {
- return index + 1
- }
- },
- {title: '测站点名称', key: 'name'},
- {title: 'X坐标(m)', key: 'x'},
- {title: 'Y坐标(m)', key: 'y'},
- {title: '高程(m)', key: 'h'},
- {title: '等级', key: 'level'},
- {title: '备注', key: 'remark'},
- {title: "操作", key: "actions", width: 160, align: 'center',
- render(row) {
- return renderTableEditDelButton({
- bubble: bubbleVal.value,
- btn_edit: btn_edit.value,
- btn_del: btn_del.value,
- edit_event: edit,
- del_event: del,
- row:row
- })
- }
- }
- ];
- };
- const traverseColumns = createTraverseColumns({
- edit(row) {
- let form = JSON.parse(JSON.stringify(row));
- let mile = ['name', 'x', 'y', 'h', 'level', 'remark']
- mile.forEach((key) => {
- formRowValue.value[key] = form[key] + '';
- })
- formRowValue.value['id'] = form.id;
- formRowValue.value['projectId'] = projectId.value;
- formRowValue.value['contractId'] = contractId.value;
- showRowModal.value = true
- },
- del(row) {
- station.delData({
- ids: row.id
- }).then(({data}) => {
- if (data.code === 200) {
- window?.$message?.success('删除成功')
- getTableData()
- } else {
- window?.$message?.error('删除失败')
- }
- })
- },
- })
- const traverseTable = ref([]);
- //水准点的 表格表头
- const createLevelColumns = ({edit,del}) => {
- return [
- {title: '序号', key: 'num', width: 80, align: 'center',
- render(_, index) {
- return index + 1
- }
- },
- {title: '测站点名称', key: 'name'},
- {title: '高程(m)', key: 'h'},
- {title: '等级', key: 'level'},
- {title: '备注', key: 'remark'},
- {title: "操作", key: "actions", width: 160, align: 'center',
- render(row) {
- return renderTableEditDelButton({
- bubble: bubbleVal.value,
- btn_edit: btn_edit.value,
- btn_del: btn_del.value,
- edit_event: edit,
- del_event: del,
- row:row
- })
- }
- }
- ];
- };
- const levelColumns = createLevelColumns({
- edit(row) {
- let form = JSON.parse(JSON.stringify(row));
- let mile = ['name', 'h', 'level', 'remark'];
- mile.forEach((key) => {
- formRowValue.value[key] = form[key] + '';
- })
- formRowValue.value['id'] = form.id;
- formRowValue.value['projectId'] = projectId.value;
- formRowValue.value['contractId'] = contractId.value;
- showRowModal.value = true
- },
- del(row) {
- station.delData({
- ids: row.id
- }).then(({data}) => {
- if (data.code === 200) {
- window?.$message?.success('删除成功')
- getTableData()
- } else {
- window?.$message?.error('删除失败')
- }
- })
- },
- })
- //表格数据
- const levelTable = ref([]);
- //新增
- const AddRowClick = () => {
- if (tabsTypeKey.value === '0') {
- formRowValue.value = {
- projectId: projectId.value,
- contractId: contractId.value,
- type: tabsTypeKey.value,
- name: '', h: '', level: null, remark: null
- }
- } else if (tabsTypeKey.value === '1') {
- formRowValue.value = {
- projectId: projectId.value,
- contractId: contractId.value,
- type: tabsTypeKey.value,
- name: '', x: '', y: '', h: '', level: null, remark: null
- }
- }
- showRowModal.value = true
- }
- //保存表单
- const saveFormLoading = ref(false)
- const saveFormClick = () => {
- const form = formRowValue.value
- if (!!form.id) {
- saveFormLoading.value = true
- station.updateSave(formRowValue.value).then(({data}) => {
- saveFormLoading.value = false
- if (data.code === 200) {
- getTableData()
- showRowModal.value = false
- window?.$message?.success('保存成功')
- } else {
- window?.$message?.error('保存失败')
- }
- }).catch(() => {
- saveFormLoading.value = false
- })
- } else {
- saveFormLoading.value = true
- station.addSave(formRowValue.value).then(({data}) => {
- saveFormLoading.value = false
- if (data.code === 200) {
- getTableData()
- showRowModal.value = false
- window?.$message?.success('新增成功')
- } else {
- window?.$message?.error('新增失败')
- }
- }).catch(() => {
- saveFormLoading.value = false
- })
- }
- }
- //导入弹窗
- const showImportModal = ref(false)
- const fileListLength = ref(0);
- const uploadRef = ref(null);
- const importLoading = ref(false)
- const action = '/api/blade-business/dap/import';
- const accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel';
- const upData = ref({
- projectId: projectId.value,
- contractId: contractId.value,
- type: tabsTypeKey.value
- })
- const importModalClick = () => {
- upData.value = {
- projectId: projectId.value,
- contractId: contractId.value,
- type: tabsTypeKey.value
- }
- showImportModal.value = true
- }
- const handleUploadChange = (options) => {
- fileListLength.value = options.fileList.length;
- }
- const handleImportClick = () => {
- importLoading.value = true
- uploadRef.value?.submit();
- }
- //上传完成
- const uploadFinish = ({event}) => {
- importLoading.value = false
- let res = JSON.parse(event?.target?.response);
- if (res.code === 200) {
- window?.$message?.success('导入成功')
- showImportModal.value = false
- getTableData()
- } else {
- window?.$message?.error(res.msg||'导入失败')
- }
- }
- //卡片弹窗标题
- const getModalTitle = () => {
- let tabType = '异常了';
- if (tabsTypeKey.value === '1') {
- tabType = '导线点'
- } else if (tabsTypeKey.value === '0') {
- tabType = '水准点'
- }
- return tabType
- }
- //导出弹窗
- const exportModalClick = () => {
- window?.$dialog?.warning({
- title: "导出数据",
- content: "将导出当前所有数据",
- positiveText: "确定导出",
- negativeText: "取消",
- onPositiveClick: () => {
- station.getExportExcel({
- projectId: projectId.value,
- contractId: contractId.value,
- type: tabsTypeKey.value,
- search: searchForm.value['name'] || ''
- }).then(res => {
- download(res)
- })
- }
- });
- }
- //重新搜索数据
- const searchChange = () => {
- searchForm.value.current = 1
- getTableData()
- }
- //分页被点击
- const pageChange = (res) => {
- searchForm.value.current = res.current;
- searchForm.value.size = res.size;
- getTableData()
- }
- //获取数据
- const getTableData = () => {
- station.queryListData(searchForm.value).then(({data}) => {
- let res = data['data'] || {}
- if (tabsTypeKey.value === '0') {
- levelTable.value = res['records'] || []
- } else if (tabsTypeKey.value === '1') {
- traverseTable.value = res['records'] || []
- }
- searchForm.value.total = res.total || 0
- })
- }
- </script>
- <style lang="scss" scoped>
- @import '../../styles/gauge/station.scss';
- </style>
|