Commit bd08d501 by 焦子成

1

parent a2c01127
...@@ -28,6 +28,7 @@ const config = { ...@@ -28,6 +28,7 @@ const config = {
uploadDetailDelete: `${domain}/uploadDetail/delete`, uploadDetailDelete: `${domain}/uploadDetail/delete`,
downLoadStatus: `${domain}/uploadDetail/downLoadStatus`, downLoadStatus: `${domain}/uploadDetail/downLoadStatus`,
fileUploadDetail: `${domain}/uploadBatch/fileUploadDetail`, fileUploadDetail: `${domain}/uploadBatch/fileUploadDetail`,
queryFileAll: `${domain}/uploadBatch/queryFileAll`,
}; };
export default config; export default config;
...@@ -2,6 +2,8 @@ import { defineStore } from 'pinia' ...@@ -2,6 +2,8 @@ import { defineStore } from 'pinia'
import { ref, computed } from 'vue' import { ref, computed } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useAuthStore } from './auth' import { useAuthStore } from './auth'
import http from '@/utils/request.js';
import config from '@/api/api.js';
export const useDownloadStore = defineStore('download', () => { export const useDownloadStore = defineStore('download', () => {
const authStore = useAuthStore() const authStore = useAuthStore()
...@@ -148,13 +150,32 @@ export const useDownloadStore = defineStore('download', () => { ...@@ -148,13 +150,32 @@ export const useDownloadStore = defineStore('download', () => {
// 创建 AbortController 用于取消下载 // 创建 AbortController 用于取消下载
download.controller = new AbortController() download.controller = new AbortController()
console.log('download config.url-->',config.downLoadStatus)
console.log('download id-->',download.id)
try { try {
await performDownload(download) await performDownload(download)
http.post(config.downLoadStatus,{
detailId: download.id,
fileStatus: 3, //下载状态 0:等待中 1:下载中 2:已暂停 3:已完成 4:失败
}).then(res=>{
if (res.code === 200) {
} else {
ElMessage.error(res.message)
}
})
} catch (error) { } catch (error) {
if (error.name === 'AbortError') { if (error.name === 'AbortError') {
download.status = 'paused' download.status = 'paused'
saveToStorage() saveToStorage()
http.post(config.downLoadStatus,{
detailId: download.id,
fileStatus: 2, //下载状态 0:等待中 1:下载中 2:已暂停 3:已完成 4:失败
}).then(res=>{
if (res.code === 200) {
} else {
ElMessage.error(res.message)
}
})
} else { } else {
// 处理重试逻辑 // 处理重试逻辑
if (download.retryCount < download.maxRetries) { if (download.retryCount < download.maxRetries) {
...@@ -169,6 +190,15 @@ export const useDownloadStore = defineStore('download', () => { ...@@ -169,6 +190,15 @@ export const useDownloadStore = defineStore('download', () => {
download.status = 'error' download.status = 'error'
download.error = error.message download.error = error.message
saveToStorage() saveToStorage()
http.post(config.downLoadStatus,{
detailId: download.id,
fileStatus: 4, //下载状态 0:等待中 1:下载中 2:已暂停 3:已完成 4:失败
}).then(res=>{
if (res.code === 200) {
} else {
ElMessage.error(res.message)
}
})
} }
} }
} finally { } finally {
......
...@@ -60,9 +60,8 @@ ...@@ -60,9 +60,8 @@
</el-table> </el-table>
<div class="pagination-container"> <div class="pagination-container">
<el-pagination v-model:current-page="upQuery.current" v-model:page-size="upQuery.pageSize" <el-pagination v-model:current-page="upQuery.current" v-model:page-size="upQuery.pageSize"
:page-sizes="[10, 20, 50, 100]" :total="upTotal" :page-sizes="[10, 20, 50, 100]" :total="upTotal" layout="total, sizes, prev, pager, next, jumper"
layout="total, sizes, prev, pager, next, jumper" @size-change="handleUpSizeChange" @size-change="handleUpSizeChange" @current-change="handleUpCurrentChange" />
@current-change="handleUpCurrentChange" />
</div> </div>
</div> </div>
<el-divider /> <el-divider />
...@@ -244,8 +243,8 @@ ...@@ -244,8 +243,8 @@
<el-option label="已完成" value="completed" /> <el-option label="已完成" value="completed" />
<el-option label="失败" value="error" /> <el-option label="失败" value="error" />
</el-select> --> </el-select> -->
<el-select v-model="deQuery.fileStatus" placeholder="按状态筛选" clearable style="width: 150px; margin-right: 10px;" <el-select v-model="fileStatus" placeholder="按状态筛选" clearable
@change="handleStatusFilterChange"> style="width: 150px; margin-right: 10px;" @change="handleStatusFilterChange">
<el-option label="全部" value="" /> <el-option label="全部" value="" />
<el-option label="等待中" :value="0" /> <el-option label="等待中" :value="0" />
<el-option label="下载中" :value="1" /> <el-option label="下载中" :value="1" />
...@@ -289,7 +288,7 @@ ...@@ -289,7 +288,7 @@
<div v-else class="download-table-container"> <div v-else class="download-table-container">
<!-- 分页表格 --> <!-- 分页表格 -->
<!-- :data="paginatedDownloads" --> <!-- :data="paginatedDownloads" -->
<el-table :data="deTableData" style="width: 100%" border stripe highlight-current-row> <el-table :data="paginatedDownloads" style="width: 100%" border stripe highlight-current-row>
<el-table-column label="Excel文件" width="180"> <el-table-column label="Excel文件" width="180">
<template #default="{ row }"> <template #default="{ row }">
...@@ -297,7 +296,7 @@ ...@@ -297,7 +296,7 @@
<el-icon> <el-icon>
<Document /> <Document />
</el-icon> </el-icon>
<span class="excel-file-name">{{ row.uploadName || '-' }}</span> <span class="excel-file-name">{{ row.excelFileName || '-' }}</span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -315,10 +314,7 @@ ...@@ -315,10 +314,7 @@
<!-- <span v-if="downloadStore.customSubFolder" class="file-prefix"> <!-- <span v-if="downloadStore.customSubFolder" class="file-prefix">
{{ downloadStore.customSubFolder }}_ {{ downloadStore.customSubFolder }}_
</span> --> </span> -->
<span v-if="row.fileName" class="file-prefix"> {{ row.fileName }}
{{ row.fileName }}_
</span>
{{ row.fileUrl }}
</div> </div>
<div class="file-url">{{ row.url }}</div> <div class="file-url">{{ row.url }}</div>
</div> </div>
...@@ -329,7 +325,7 @@ ...@@ -329,7 +325,7 @@
<el-table-column label="状态" width="100" align="center"> <el-table-column label="状态" width="100" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-tag :class="`status-badge status-${row.status}`" size="small"> <el-tag :class="`status-badge status-${row.status}`" size="small">
{{ getStatusText(row.fileStatus) }} {{ getStatusText(row.status) }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
...@@ -397,10 +393,9 @@ ...@@ -397,10 +393,9 @@
<!-- 分页器 --> <!-- 分页器 -->
<div class="pagination-container"> <div class="pagination-container">
<el-pagination v-model:current-page="deQuery.current" v-model:page-size="deQuery.pageSize" <el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize"
:page-sizes="[10, 20, 50, 100]" :total="deTotal" :page-sizes="[10, 20, 50, 100]" :total="deTotal" layout="total, sizes, prev, pager, next, jumper"
layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
@current-change="handleCurrentChange" />
</div> </div>
</div> </div>
</div> </div>
...@@ -439,6 +434,7 @@ const activeCollapse = ref(['upload']) // 默认展开配置区域 ...@@ -439,6 +434,7 @@ const activeCollapse = ref(['upload']) // 默认展开配置区域
// 分页相关 // 分页相关
const currentPage = ref(1) const currentPage = ref(1)
const pageSize = ref(10) const pageSize = ref(10)
const fileStatus = ref('')
// 已上传文件列表 // 已上传文件列表
let upQuery = ref({ let upQuery = ref({
current: 1, current: 1,
...@@ -447,11 +443,11 @@ let upQuery = ref({ ...@@ -447,11 +443,11 @@ let upQuery = ref({
let upTableData = reactive([]) let upTableData = reactive([])
let upTotal = ref(0) let upTotal = ref(0)
// 下载任务管理列表 // 下载任务管理列表
let deQuery = ref({ // let deQuery = ref({
current: 1, // current: 1,
pageSize: 10, // pageSize: 10,
fileStatus:'' // fileStatus: ''
}) // })
let deTableData = reactive([]) let deTableData = reactive([])
let deTotal = ref(0) let deTotal = ref(0)
...@@ -476,7 +472,7 @@ const loadUpTableData = () => { ...@@ -476,7 +472,7 @@ const loadUpTableData = () => {
http.post(config.uploadBatchList, upQuery.value).then(res => { http.post(config.uploadBatchList, upQuery.value).then(res => {
if (res.code === 200) { if (res.code === 200) {
for (let element of res.data.rows) { for (let element of res.data.rows) {
element.createTime = element.createTime ? element.createTime.substring(0,10) : '' element.createTime = element.createTime ? element.createTime.substring(0, 10) : ''
} }
upTableData = res.data.rows upTableData = res.data.rows
upTotal.value = res.data.total upTotal.value = res.data.total
...@@ -534,22 +530,22 @@ const selectExcelFile = async (fileId) => { ...@@ -534,22 +530,22 @@ const selectExcelFile = async (fileId) => {
// console.error('选择Excel文件失败:', error) // console.error('选择Excel文件失败:', error)
// ElMessage.error('选择Excel文件失败: ' + error.message) // ElMessage.error('选择Excel文件失败: ' + error.message)
// } // }
http.post(config.uploadBatchQueryUpload, {batchId:fileId}).then(res => { http.post(config.uploadBatchQueryUpload, { batchId: fileId }).then(res => {
if (res.code === 200) { if (res.code === 200) {
if (!res.data || res.data.details.length === 0) { if (!res.data || res.data.details.length === 0) {
ElMessage.error('文件信息不存在') ElMessage.error('文件信息不存在')
return return
} }
selectedFile.value = { selectedFile.value = {
name:res.data.uploadName, name: res.data.uploadName,
} }
excelColumns.value = res.data.fileColumnNameAll || [] excelColumns.value = res.data.fileColumnNameAll || []
columnMapping.value.fileNameColumns = res.data.fileColumnName || [] columnMapping.value.fileNameColumns = res.data.fileColumnName || []
columnMapping.value.url = res.data.urlColumnName columnMapping.value.url = res.data.urlColumnName
rawExcelData.value = res.data.details || [] rawExcelData.value = res.data.details || []
if (res.data.details.length>5){ if (res.data.details.length > 5) {
previewData.value = res.data.details.slice(0,5) previewData.value = res.data.details.slice(0, 5)
}else { } else {
previewData.value = res.data.details || [] previewData.value = res.data.details || []
} }
customSubFolder.value = res.data.filePrefix || '' customSubFolder.value = res.data.filePrefix || ''
...@@ -825,19 +821,53 @@ onMounted(() => { ...@@ -825,19 +821,53 @@ onMounted(() => {
loadUpTableData() loadUpTableData()
loadDetailTableData() loadDetailTableData()
}) })
function loadDetailTableData(){ const statusMap = {
http.post(config.uploadDetailList,deQuery.value).then(res=>{ 0: 'pending',
if (res.code === 200){ 1: 'downloading',
deTableData = res.data.rows 2: 'paused',
3: 'completed',
4: 'error'
}
function loadDetailTableData() {
http.post(config.uploadDetailList, {
current: currentPage.value,
size: pageSize.value,
fileStatus: fileStatus.value
}).then(res => {
if (res.code === 200) {
var list = []
for (const element of res.data.rows) {
list.push({
"id": element.detailId,
"fileName": element.fileName,
"url": element.fileUrl,
"excelFileName": element.uploadName,
"excelFileId": "",
"status": statusMap[element.fileStatus],
"progress": 0,
"downloadedBytes": 0,
"fileSize": element.fileLength,
"speed": 0,
"startTime": element.createTime,
"endTime": null,
"error": null,
"retryCount": 0,
"maxRetries": 3,
"controller": null
})
}
// console.log('--lsit:',list)
// deTableData = res.data.rows
downloadStore.downloads = list
deTotal.value = res.data.total deTotal.value = res.data.total
loadUploadDetailTotalNum() loadUploadDetailTotalNum()
}else { } else {
ElMessage.error(res.message) ElMessage.error(res.message)
} }
}) })
} }
let totalNumObj = ref({ let totalNumObj = ref({
countNum:0, countNum: 0,
fileLength: '', fileLength: '',
status0: 0, status0: 0,
status1: 0, status1: 0,
...@@ -845,14 +875,14 @@ let totalNumObj = ref({ ...@@ -845,14 +875,14 @@ let totalNumObj = ref({
status3: 0, status3: 0,
status4: 0, status4: 0,
}) })
function loadUploadDetailTotalNum(){ function loadUploadDetailTotalNum() {
http.post(config.uploadDetailTotalNum).then(res=>{ http.post(config.uploadDetailTotalNum).then(res => {
if (res.code === 200){ if (res.code === 200) {
totalNumObj.value.countNum = res.data.countNum totalNumObj.value.countNum = res.data.countNum
totalNumObj.value.status3 = res.data.status3 totalNumObj.value.status3 = res.data.status3
totalNumObj.value.status4 = res.data.status4 totalNumObj.value.status4 = res.data.status4
totalNumObj.value.fileLength = res.data.fileLength totalNumObj.value.fileLength = res.data.fileLength
}else { } else {
ElMessage.error(res.message) ElMessage.error(res.message)
} }
}) })
...@@ -860,45 +890,47 @@ function loadUploadDetailTotalNum(){ ...@@ -860,45 +890,47 @@ function loadUploadDetailTotalNum(){
// 清除已完成 // 清除已完成
function clearCompleted() { function clearCompleted() {
http.post(config.uploadDetailDeleteAll,{ http.post(config.uploadDetailDeleteAll, {
type:0 type: 0
}).then(res=>{ }).then(res => {
if (res.code === 200){ if (res.code === 200) {
ElMessage.success(res.message) ElMessage.success(res.message)
deQuery.value.current = 1 // deQuery.value.current = 1
currentPage.value = 1
// loadUploadDetailList() // loadUploadDetailList()
loadDetailTableData() loadDetailTableData()
}else { } else {
ElMessage.error(res.message) ElMessage.error(res.message)
} }
}) })
} }
// 清除所有 // 清除所有
function clearAll() { function clearAll() {
http.post(config.uploadDetailDeleteAll,{ http.post(config.uploadDetailDeleteAll, {
type:1 type: 1
}).then(res=>{ }).then(res => {
if (res.code === 200){ if (res.code === 200) {
ElMessage.success(res.message) ElMessage.success(res.message)
deQuery.value.current = 1 deQuery.value.current = 1
// loadUploadDetailList() // loadUploadDetailList()
loadDetailTableData() loadDetailTableData()
}else { } else {
ElMessage.error(res.message) ElMessage.error(res.message)
} }
}) })
} }
// 删除单行 // 删除单行
function deleteRow(row) { function deleteRow(row) {
http.post(config.uploadDetailDelete,{ http.post(config.uploadDetailDelete, {
detailId:row.detailId detailId: row.detailId
}).then(res=>{ }).then(res => {
if (res.code === 200){ if (res.code === 200) {
ElMessage.success(res.message) ElMessage.success(res.message)
deQuery.value.current = 1 // deQuery.value.current = 1
currentPage.value = 1
// loadUploadDetailList() // loadUploadDetailList()
loadDetailTableData() loadDetailTableData()
}else { } else {
ElMessage.error(res.message) ElMessage.error(res.message)
} }
}) })
...@@ -906,7 +938,7 @@ function deleteRow(row) { ...@@ -906,7 +938,7 @@ function deleteRow(row) {
// 解析Excel文件 // 解析Excel文件
const parseExcelFile = async () => { const parseExcelFile = async () => {
if (rawExcelData.value.length > 3000){ if (rawExcelData.value.length > 3000) {
ElMessage.error('文件数据量太大,请拆分处理,每次不超过3000条') ElMessage.error('文件数据量太大,请拆分处理,每次不超过3000条')
return return
} }
...@@ -1086,10 +1118,10 @@ function getDetailList() { ...@@ -1086,10 +1118,10 @@ function getDetailList() {
} }
var upDetailId = '' var upDetailId = ''
let detailList = reactive([]) let detailList = reactive([])
function uploadDetails(){ function uploadDetails() {
detailList = getDetailList() detailList = getDetailList()
http.post(config.uploadBatchFileUpload,{ http.post(config.uploadBatchFileUpload, {
uploadName:selectedFile.value.name, uploadName: selectedFile.value.name,
uploadUrl: '', uploadUrl: '',
totalRows: rawExcelData.value.length, totalRows: rawExcelData.value.length,
fileColumnNameAll: excelColumns.value, fileColumnNameAll: excelColumns.value,
...@@ -1109,24 +1141,24 @@ function uploadDetails(){ ...@@ -1109,24 +1141,24 @@ function uploadDetails(){
} }
}) })
} }
function uploadDetailsFile(){ function uploadDetailsFile() {
var uplist = [] var uplist = []
if (detailList.length > 500) { if (detailList.length > 500) {
uplist = detailList.slice(0,500) uplist = detailList.slice(0, 500)
detailList = detailList.slice(500) detailList = detailList.slice(500)
}else { } else {
uplist = detailList uplist = detailList
detailList = [] detailList = []
} }
console.log('list-->',detailList.length) console.log('list-->', detailList.length)
http.post(config.fileUploadDetail,{ http.post(config.fileUploadDetail, {
batchId: upDetailId, batchId: upDetailId,
details: uplist details: uplist
}).then(res => { }).then(res => {
if (res.code === 200) { if (res.code === 200) {
if (detailList.length > 0) { if (detailList.length > 0) {
uploadDetailsFile() uploadDetailsFile()
}else { } else {
ElMessage.success('上传任务完成') ElMessage.success('上传任务完成')
loadDetailTableData() loadDetailTableData()
} }
...@@ -1137,6 +1169,7 @@ function uploadDetailsFile(){ ...@@ -1137,6 +1169,7 @@ function uploadDetailsFile(){
// 下载当前页所有任务 // 下载当前页所有任务
const downloadCurrentPage = async () => { const downloadCurrentPage = async () => {
const currentPageItems = paginatedDownloads.value const currentPageItems = paginatedDownloads.value
// const currentPageItems = deTableData
if (currentPageItems.length === 0) { if (currentPageItems.length === 0) {
ElMessage.warning('当前页没有下载任务') ElMessage.warning('当前页没有下载任务')
return return
...@@ -1146,12 +1179,16 @@ const downloadCurrentPage = async () => { ...@@ -1146,12 +1179,16 @@ const downloadCurrentPage = async () => {
const startableItems = currentPageItems.filter(item => const startableItems = currentPageItems.filter(item =>
['pending', 'paused', 'error'].includes(item.status) ['pending', 'paused', 'error'].includes(item.status)
) )
// const startableItems = currentPageItems.filter(item =>
// [0, 2, 4].includes(item.fileStatus)
// )
if (startableItems.length === 0) { if (startableItems.length === 0) {
ElMessage.warning('当前页没有可以开始下载的任务') ElMessage.warning('当前页没有可以开始下载的任务')
return return
} }
// console.log('currentPageItems-->',currentPageItems)
// console.log('startableItems-->',startableItems)
try { try {
await ElMessageBox.confirm(`确定要下载当前页的 ${startableItems.length} 个任务吗?`, '下载当前页', { await ElMessageBox.confirm(`确定要下载当前页的 ${startableItems.length} 个任务吗?`, '下载当前页', {
confirmButtonText: '确定', confirmButtonText: '确定',
...@@ -1166,37 +1203,25 @@ const downloadCurrentPage = async () => { ...@@ -1166,37 +1203,25 @@ const downloadCurrentPage = async () => {
await downloadStore.batchStartDownloads(currentPageIds) await downloadStore.batchStartDownloads(currentPageIds)
ElMessage.success(`已开始下载当前页的 ${startableItems.length} 个任务`) ElMessage.success(`已开始下载当前页的 ${startableItems.length} 个任务`)
for (const item of startableItems) {
const size = await getFileSize(item.url);
http.post(config.downLoadStatus,{
detailId: item.id,
fileStatus: 3, //下载状态 0:等待中 1:下载中 2:已暂停 3:已完成 4:失败
fileStatus: size || 0
}).then(res=>{
if (res.code === 200) {
} else {
ElMessage.error(res.message)
}
})
}
} catch { } catch {
// 用户取消 // 用户取消
} }
} }
async function getFileSize(url) { // async function getFileSize(url) {
try { // try {
const response = await axios.head(url); // const response = await axios.head(url);
const size = response.headers["content-length"]; // const size = response.headers["content-length"];
return size ? parseInt(size, 10) : null; // return size ? parseInt(size, 10) : null;
} catch (err) { // } catch (err) {
console.error("获取文件大小失败:", err); // console.error("获取文件大小失败:", err);
return null; // return null;
} // }
} // }
// 暂停当前页所有任务 // 暂停当前页所有任务
const pauseCurrentPage = async () => { const pauseCurrentPage = async () => {
const currentPageItems = paginatedDownloads.value const currentPageItems = paginatedDownloads.value
// const currentPageItems = deTableData
if (currentPageItems.length === 0) { if (currentPageItems.length === 0) {
ElMessage.warning('当前页没有下载任务') ElMessage.warning('当前页没有下载任务')
return return
...@@ -1235,13 +1260,16 @@ const pauseCurrentPage = async () => { ...@@ -1235,13 +1260,16 @@ const pauseCurrentPage = async () => {
// 处理分页大小变化 // 处理分页大小变化
const handleSizeChange = (size) => { const handleSizeChange = (size) => {
deQuery.value.pageSize = size // deQuery.value.pageSize = size
deQuery.value.current = 1 // deQuery.value.current = 1
pageSize.value = size
currentPage.value = 1
loadDetailTableData() loadDetailTableData()
} }
// 处理当前页变化 // 处理当前页变化
const handleCurrentChange = (page) => { const handleCurrentChange = (page) => {
deQuery.value.current = page // deQuery.value.current = page
currentPage.value = page
loadDetailTableData() loadDetailTableData()
} }
...@@ -1259,7 +1287,9 @@ const handleUpCurrentChange = (page) => { ...@@ -1259,7 +1287,9 @@ const handleUpCurrentChange = (page) => {
// 处理状态筛选变化 // 处理状态筛选变化
const handleStatusFilterChange = () => { const handleStatusFilterChange = () => {
// currentPage.value = 1 // 重置当前页为1,以便重新加载数据 // currentPage.value = 1 // 重置当前页为1,以便重新加载数据
deQuery.value.current = 1 // deQuery.value.current = 1
currentPage.value = 1
loadDetailTableData()
} }
// 单个文件下载 // 单个文件下载
...@@ -1425,16 +1455,16 @@ const readExcelFile = (file) => { ...@@ -1425,16 +1455,16 @@ const readExcelFile = (file) => {
// 获取状态文本 // 获取状态文本
const getStatusText = (status) => { const getStatusText = (status) => {
const statusMap = { const statusMap = {
// pending: '等待中', pending: '等待中',
// downloading: '下载中', downloading: '下载中',
// completed: '已完成', completed: '已完成',
// error: '失败', error: '失败',
// paused: '已暂停' paused: '已暂停',
0:'等待中', 0: '等待中',
1:'下载中' , 1: '下载中',
2:'已暂停' , 2: '已暂停',
3:'已完成', 3: '已完成',
4:'失败' 4: '失败'
} }
return statusMap[status] || status return statusMap[status] || status
} }
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
<div class="card-header"> <div class="card-header">
<span>历史记录</span> <span>历史记录</span>
<div class="header-actions"> <div class="header-actions">
<el-select v-model="deQuery.fileStatus" placeholder="状态筛选" size="small" style="width: 120px;"> <el-select v-model="statusFilter" placeholder="状态筛选" size="small" style="width: 120px;">
<el-option label="全部" value="" /> <el-option label="全部" value="" />
<el-option label="已完成" :value="3" /> <el-option label="已完成" :value="3" />
<el-option label="失败" :value="4" /> <el-option label="失败" :value="4" />
...@@ -57,10 +57,10 @@ ...@@ -57,10 +57,10 @@
<el-select v-model="excelFileFilter" placeholder="Excel文件筛选" size="small" <el-select v-model="excelFileFilter" placeholder="Excel文件筛选" size="small"
style="width: 150px; margin-left: 10px;"> style="width: 150px; margin-left: 10px;">
<el-option label="全部Excel文件" value="" /> <el-option label="全部Excel文件" value="" />
<el-option v-for="excelFile in uniqueExcelFiles" :key="excelFile" :label="excelFile" <el-option v-for="excelFile in excelFileFilterList" :key="excelFile" :label="excelFile"
:value="excelFile" /> :value="excelFile" />
</el-select> </el-select>
<el-input v-model="deQuery.fileName" placeholder="搜索文件名或Excel文件" size="small" <el-input v-model="searchKeyword" placeholder="搜索文件名或Excel文件" size="small"
style="width: 200px; margin-left: 10px;" clearable> style="width: 200px; margin-left: 10px;" clearable>
<template #prefix> <template #prefix>
<el-icon> <el-icon>
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
</template> </template>
<!-- 历史记录表格 --> <!-- 历史记录表格 -->
<el-table :data="deTableData" style="width: 100%" :default-sort="{ prop: 'timestamp', order: 'descending' }" <el-table :data="filteredHistory" style="width: 100%" :default-sort="{ prop: 'timestamp', order: 'descending' }"
stripe> stripe>
<el-table-column prop="timestamp" label="时间" width="180" sortable> <el-table-column prop="timestamp" label="时间" width="180" sortable>
<template #default="scope"> <template #default="scope">
...@@ -142,10 +142,10 @@ ...@@ -142,10 +142,10 @@
<el-table-column label="操作" width="120" fixed="right"> <el-table-column label="操作" width="120" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button v-if="scope.row.status === 'error'" @click="retryDownload(scope.row)" type="primary" <!-- <el-button v-if="scope.row.status === 'error'" @click="retryDownload(scope.row)" type="primary"
size="small"> size="small">
重试 重试
</el-button> </el-button> -->
<el-button @click="viewDetails(scope.row)" type="info" size="small"> <el-button @click="viewDetails(scope.row)" type="info" size="small">
详情 详情
</el-button> </el-button>
...@@ -155,7 +155,7 @@ ...@@ -155,7 +155,7 @@
<!-- 分页 --> <!-- 分页 -->
<div class="pagination-container"> <div class="pagination-container">
<el-pagination v-model:current-page="deQuery.current" v-model:page-size="deQuery.pageSize" :page-sizes="[10, 20, 50, 100]" <el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :page-sizes="[10, 20, 50, 100]"
:total="deTotal" layout="total, sizes, prev, pager, next, jumper" :total="deTotal" layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange" @current-change="handleCurrentChange" /> @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div> </div>
...@@ -196,7 +196,7 @@ ...@@ -196,7 +196,7 @@
<script setup> <script setup>
import { ref, computed, onMounted, reactive } from 'vue' import { ref, computed, onMounted, reactive } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox, valueEquals } from 'element-plus'
import { Clock, Search } from '@element-plus/icons-vue' import { Clock, Search } from '@element-plus/icons-vue'
import { useAuthStore } from '../stores/auth' import { useAuthStore } from '../stores/auth'
import http from '@/utils/request.js'; import http from '@/utils/request.js';
...@@ -214,21 +214,71 @@ const currentPage = ref(1) ...@@ -214,21 +214,71 @@ const currentPage = ref(1)
const pageSize = ref(20) const pageSize = ref(20)
const detailsVisible = ref(false) const detailsVisible = ref(false)
const selectedRecord = ref(null) const selectedRecord = ref(null)
const excelFileFilterList = ref([])
const deQuery = ref({
current: 1, // const deQuery = ref({
pageSize: 10, // current: 1,
fileStatus: 3, // pageSize: 10,
fileName: '' // fileStatus: 3,
}) // fileName: ''
let deTableData = reactive([]) // })
// let deTableData =
// reactive([])
let deTotal = ref(0) let deTotal = ref(0)
const statusMap = {
0: 'pending',
1: 'downloading',
2: 'paused',
3: 'completed',
4: 'error'
}
function laodFileAll(){
http.post(config.queryFileAll).then(res=>{
if (res.code === 200){
excelFileFilterList.value = res.data
}else {
ElMessage.error(res.message)
}
})
}
// 加载历史数据 // 加载历史数据
const loadHistory = () => { const loadHistory = () => {
// historyData.value = authStore.getDownloadHistory() // historyData.value = authStore.getDownloadHistory()
http.post(config.uploadDetailList, deQuery.value).then(res => { http.post(config.uploadDetailList, {
current: currentPage.value,
pageSize: pageSize.value,
fileStatus: statusFilter.value,
uploadName: excelFileFilter.value,
fileName: searchKeyword.value
}).then(res => {
if (res.code === 200) { if (res.code === 200) {
deTableData = res.data.rows var list = []
var updateTime = ''
for (const element of res.data.rows) {
updateTime = element.updateTime
list.push({
"id": element.detailId,
"fileName": element.fileName,
"fileNamePrefix": "",
"excelFileName": element.uploadName,
"url": element.fileUrl,
"status": statusMap[element.fileStatus],
"progress": 100,
"fileSize": element.fileLength,
"downloadedBytes": 0,
"startTime": element.createTime,
"endTime": '',
"error": null
})
}
historyData.value = [
{
downloads: list,
timestamp: updateTime,
userId: ''
}
]
// deTableData = res.data.rows
deTotal.value = res.data.total deTotal.value = res.data.total
} else { } else {
ElMessage.error(res.message) ElMessage.error(res.message)
...@@ -400,9 +450,19 @@ const clearAllHistory = async () => { ...@@ -400,9 +450,19 @@ const clearAllHistory = async () => {
} }
) )
authStore.clearDownloadHistory() // authStore.clearDownloadHistory()
// loadHistory()
// ElMessage.success('历史记录已清空')
http.post(config.uploadDetailDeleteAll, {
type: 1
}).then(res => {
if (res.code === 200) {
loadHistory() loadHistory()
ElMessage.success('历史记录已清空') ElMessage.success('历史记录已清空')
} else {
ElMessage.error(res.message)
}
})
} catch { } catch {
// 用户取消 // 用户取消
} }
...@@ -410,16 +470,16 @@ const clearAllHistory = async () => { ...@@ -410,16 +470,16 @@ const clearAllHistory = async () => {
// 分页处理 // 分页处理
const handleSizeChange = (size) => { const handleSizeChange = (size) => {
// pageSize.value = size pageSize.value = size
// currentPage.value = 1 currentPage.value = 1
deQuery.value.pageSize = size // deQuery.value.pageSize = size
deQuery.value.current = 1 // deQuery.value.current = 1
loadHistory() loadHistory()
} }
const handleCurrentChange = (page) => { const handleCurrentChange = (page) => {
// currentPage.value = page currentPage.value = page
deQuery.value.current = page // deQuery.value.current = page
loadHistory() loadHistory()
} }
...@@ -432,6 +492,7 @@ const goBack = () => { ...@@ -432,6 +492,7 @@ const goBack = () => {
onMounted(() => { onMounted(() => {
loadHistory() loadHistory()
loadUploadDetailTotalNum() loadUploadDetailTotalNum()
laodFileAll()
}) })
</script> </script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment