You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
402 lines
11 KiB
402 lines
11 KiB
<template> |
|
<div class="app-container"> |
|
<el-form :inline="true" class="demo-form-inline"> |
|
<el-form-item label="起始日期"> |
|
<el-date-picker |
|
v-model="searchModel.startTime" |
|
type="datetime" |
|
placeholder="选择日期"> |
|
</el-date-picker> |
|
</el-form-item> |
|
<el-form-item label="截止日期"> |
|
<el-date-picker |
|
v-model="searchModel.endTime" |
|
type="datetime" |
|
placeholder="选择日期"> |
|
</el-date-picker> |
|
</el-form-item> |
|
<el-form-item label="站点"> |
|
<SelectStaion |
|
v-if="isComponentReady" |
|
ref="selectStaionRef" |
|
:startTime="this.formatDate(this.searchModel.startTime)" |
|
:endTime="this.formatDate(this.searchModel.endTime)" |
|
:type="this.type"> |
|
</SelectStaion> |
|
</el-form-item> |
|
<el-form-item> |
|
<el-button type="primary" @click="getList">查询</el-button> |
|
</el-form-item> |
|
<el-form-item> |
|
<el-button type="primary" @click="exportDate">导出</el-button> |
|
</el-form-item> |
|
<el-form-item> |
|
<el-button |
|
type="primary" |
|
@click="importSoft" |
|
>导出南方片格式文件 |
|
</el-button> |
|
</el-form-item> |
|
<el-form-item> |
|
<el-button |
|
type="primary" |
|
@click="openSoft" |
|
>导入南方片格式文件 |
|
</el-button> |
|
</el-form-item> |
|
</el-form> |
|
|
|
<div class="main-content"> |
|
<div class="main-title"> |
|
<div class="table-title">日降雨量表</div> |
|
<div class="table-header"> |
|
<div class="table-time" style="float: right">(单位降水量: mm)</div> |
|
</div> |
|
</div> |
|
<el-table |
|
:data="tableData" |
|
height="500" |
|
border |
|
style="width: 100%"> |
|
<el-table-column label="序号" align="center"> |
|
<template slot-scope="scope"> |
|
{{ scope.$index + 1 }} |
|
</template> |
|
</el-table-column> |
|
<el-table-column |
|
align="center" |
|
prop="stcd" |
|
label="站码" |
|
> |
|
</el-table-column> |
|
<el-table-column |
|
align="center" |
|
prop="stnm" |
|
label="站名" |
|
> |
|
</el-table-column> |
|
<el-table-column |
|
align="center" |
|
prop="dt" |
|
label="日期"> |
|
</el-table-column> |
|
|
|
<el-table-column |
|
align="center" |
|
prop="p" |
|
label="降水量"> |
|
</el-table-column> |
|
|
|
<el-table-column |
|
align="center" |
|
prop="prcd" |
|
label="降水量注解码"> |
|
</el-table-column> |
|
|
|
</el-table> |
|
<el-pagination |
|
@size-change="handleSizeChange" |
|
@current-change="handleCurrentChange" |
|
:current-page="searchModel.pageNum" |
|
:page-sizes="[15, 30, 50,100]" |
|
:page-size="searchModel.pageSize" |
|
layout="total, sizes, prev, pager, next, jumper" |
|
style="padding: 30px 0; text-align: center;" |
|
:total="total" |
|
> |
|
</el-pagination> |
|
</div> |
|
<el-dialog :title="title" :visible.sync="softOpen" width="400px" append-to-body> |
|
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> |
|
<el-form-item label="起年"> |
|
<el-date-picker |
|
v-model="form.startTime" |
|
type="datetime" |
|
placeholder="选择日期" |
|
> |
|
</el-date-picker> |
|
</el-form-item> |
|
<el-form-item label="截止年"> |
|
<el-date-picker |
|
v-model="form.endTime" |
|
type="datetime" |
|
placeholder="选择日期" |
|
> |
|
</el-date-picker> |
|
</el-form-item> |
|
</el-form> |
|
<div slot="footer" class="dialog-footer"> |
|
<el-button type="primary" @click="submitForm">确 定</el-button> |
|
<el-button @click="cancel">取 消</el-button> |
|
</div> |
|
</el-dialog> |
|
<!-- 用户导入对话框 --> |
|
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body> |
|
<el-upload |
|
class="upload-demo" |
|
drag |
|
ref="uploadRef" |
|
:action="uploadUrl" |
|
:data="uploadData" |
|
:headers="uploadHeaders" |
|
:before-upload="beforeUpload" |
|
:on-success="handleSuccess" |
|
:on-error="handleError" |
|
accept=".zip" |
|
:limit="1" |
|
> |
|
<i class="el-icon-upload"></i> |
|
<div class="el-upload__text">将 ZIP 文件拖到此处,或<em>点击上传</em></div> |
|
<div slot="tip" class="el-upload__tip"> |
|
支持单个 ZIP 文件(最大 50MB) |
|
</div> |
|
</el-upload> |
|
</el-dialog> |
|
</div> |
|
</template> |
|
|
|
|
|
<script> |
|
import {getToken} from '@/utils/auth' |
|
import request from '@/utils/request'; |
|
import dayRainApi from "@/api/day/dayRain"; |
|
import monthRainApi from "@/api/month/monthRain"; |
|
import SelectStaion from "@/components/SelectStaion/index.vue"; |
|
|
|
export default { |
|
components: {SelectStaion}, |
|
data() { |
|
return { |
|
tableData: [], |
|
uploadData: {}, |
|
total: 0, |
|
searchModel: { |
|
startTime: '1950-01-01 00:00:00', |
|
endTime: '1951-01-01 00:00:00', |
|
stcd: '', |
|
stnm: '', |
|
pageNum: 1, |
|
pageSize: 15 |
|
}, |
|
upload: { |
|
title: '导入数据', |
|
open: false |
|
}, |
|
uploadUrl: '/manages-api/basic/uploadSoftFile', |
|
uploadHeaders: { |
|
Authorization: 'Bearer ' + getToken() // 格式必须为 Bearer + Token |
|
}, |
|
softOpen: false, |
|
title: '', |
|
form: { |
|
startTime: '', |
|
endTime: '' |
|
}, |
|
// 表单校验 |
|
rules: { |
|
startTime: [ |
|
{required: true, message: '开始时间不能为空', trigger: 'blur'} |
|
], |
|
endTime: [ |
|
{required: true, message: '结束时间不能为空', trigger: 'blur'} |
|
] |
|
}, |
|
isComponentReady: false, |
|
type: "DayRain", |
|
} |
|
}, |
|
created() { |
|
this.getList() |
|
}, |
|
mounted() { |
|
this.$nextTick(() => { |
|
this.isComponentReady = true; |
|
}); |
|
this.$nextTick(() => { |
|
if (this.$refs.selectStaionRef) { |
|
this.searchModel.stcd = this.$refs.selectStaionRef.stcds; |
|
} |
|
}); |
|
}, |
|
methods: { |
|
beforeUpload(file) { |
|
// 1. 校验文件类型 |
|
const isZip = file.name.endsWith('.zip'); |
|
if (!isZip) { |
|
this.$message.error('仅支持上传 ZIP 格式文件!'); |
|
return false; // 阻止上传 |
|
} |
|
|
|
// 2. 校验文件大小(示例限制为 50MB) |
|
const isSizeValid = file.size <= 50 * 1024 * 1024; |
|
if (!isSizeValid) { |
|
this.$message.error('文件大小不能超过 50MB!'); |
|
return false; |
|
} |
|
return true; // 放行上传 |
|
}, |
|
handleSuccess(response) { |
|
if (response.code === 0) { // 根据后端返回结构判断 |
|
this.$message.success('文件上传成功!'); |
|
this.upload.open = false; // 关闭弹窗 |
|
this.$refs.uploadRef?.clearFiles(); |
|
// 可选:触发父组件刷新文件列表 |
|
this.$emit('upload-success'); |
|
} else { |
|
this.$message.error(response.msg || '上传失败'); |
|
} |
|
}, |
|
handleError(err) { |
|
this.$message.error(`上传失败: ${err.message}`); |
|
}, |
|
openSoft() { |
|
this.upload.open = true |
|
}, |
|
formatDate(date) { |
|
if (date == null) { |
|
return ''; |
|
} |
|
const d = new Date(date); |
|
if (isNaN(d.getTime())) { |
|
return ''; |
|
} else { |
|
return date |
|
} |
|
}, |
|
|
|
async getList() { |
|
this.searchModel.stcd = this.$refs.selectStaionRef?.stcds || ''; |
|
const startYear = this.$common.formatDate(this.searchModel.startTime) |
|
const endYear = this.$common.formatDate(this.searchModel.endTime) |
|
const param = { |
|
pageNum: this.searchModel.pageNum, |
|
pageSize: this.searchModel.pageSize, |
|
startTime: startYear, |
|
endTime: endYear, |
|
stcd: this.searchModel.stcd, |
|
stnm: this.searchModel.stnm |
|
} |
|
const res = await dayRainApi.getRainTableList(param) |
|
this.tableData = res.data; |
|
this.total = res.count; |
|
}, |
|
handleSizeChange(pageSize) { |
|
this.searchModel.pageSize = pageSize |
|
this.getList() |
|
}, |
|
handleCurrentChange(pageNum) { |
|
this.searchModel.pageNum = pageNum |
|
this.getList() |
|
}, |
|
async exportDate() { |
|
const startYear = this.$common.formatDate(this.searchModel.startTime) |
|
const endYear = this.$common.formatDate(this.searchModel.endTime) |
|
const stcd = this.searchModel.stcd || ''; // 处理undefined |
|
const stnm = this.searchModel.stnm || ''; |
|
const res = await this.$axiosPost('/report/dayRain?startTime=' + |
|
this.formatDate(startYear) + '&endTime=' + this.formatDate(endYear) + |
|
'&stcd=' + stcd + '&stnm=' + stnm); |
|
if (res.code === 0) { |
|
this.$modal.msgSuccess(res.msg) |
|
} |
|
// |
|
// this.download('/report/dayRain?startTime='+ |
|
// startYear+'&endTime='+endYear+ |
|
// '&stcd='+this.searchModel.stcd+'&stnm='+this.searchModel.stnm, {}, '日降水表.xls') |
|
}, |
|
importSoft() { |
|
this.reset(); |
|
this.softOpen = true; |
|
this.title = "导入数据到南方片"; |
|
}, |
|
reset() { |
|
this.form = { |
|
startTime: '', |
|
endTime: '' |
|
} |
|
this.resetForm("form"); |
|
}, |
|
/** 提交按钮 */ |
|
submitForm() { |
|
const startYear = this.$common.formatDate(this.form.startTime) |
|
const endYear = this.$common.formatDate(this.form.endTime) |
|
const param = { |
|
startTime: this.formatDate(startYear), |
|
endTime: this.formatDate(endYear), |
|
} |
|
this.$refs["form"].validate(valid => { |
|
if (valid) { |
|
dayRainApi.importDateToSoft(param).then(res => { |
|
if (res.code === 0) { |
|
this.$modal.msgSuccess(res.msg) |
|
this.softOpen = false; |
|
} |
|
}) |
|
} |
|
}); |
|
}, |
|
cancel() { |
|
this.softOpen = false; |
|
this.reset(); |
|
}, |
|
}, |
|
} |
|
</script> |
|
<style scoped lang="scss"> |
|
.app-container { |
|
padding: 20px; |
|
background: #F2F2F2; |
|
height: calc(100vh - 100px); |
|
|
|
.el-form { |
|
background: #fff; |
|
padding: 10px; |
|
height: 6vh; |
|
border-radius: 4px; |
|
box-shadow: 0 0 10px 1px rgba(123, 123, 123, 0.4); |
|
} |
|
|
|
.main-content { |
|
height: calc(100vh - 150px); |
|
background: #fff; |
|
margin-top: 20px; |
|
padding: 5px; |
|
border-radius: 4px; |
|
box-shadow: 0 0 10px 1px rgba(123, 123, 123, 0.4); |
|
|
|
.main-title { |
|
height: 90px; |
|
|
|
.table-title { |
|
font-size: 25px; |
|
font-weight: bold; |
|
width: 100%; |
|
height: 60px; |
|
text-align: center; |
|
} |
|
|
|
.table-header { |
|
width: 100%; |
|
height: 30px; |
|
line-height: 30px; |
|
display: inline; |
|
padding: 0 20px; |
|
font-size: 14px; |
|
|
|
.table-time { |
|
display: inline; |
|
float: left; |
|
margin-left: 20px; |
|
font-size: 14px; |
|
color: #606266; |
|
font-weight: 700; |
|
} |
|
} |
|
} |
|
} |
|
|
|
:hover::-webkit-scrollbar { |
|
width: 0; /* 鼠标 hover 时显示滚动条 */ |
|
} |
|
} |
|
</style>
|
|
|