需求新增导出及批量导出接口

This commit is contained in:
pfl
2025-04-18 17:05:35 +08:00
parent 497ff672d1
commit f677776c31
3 changed files with 126 additions and 3 deletions

View File

@@ -5,11 +5,13 @@ import com.test.common.core.controller.BaseController;
import com.test.common.core.domain.AjaxResult;
import com.test.common.core.page.TableDataInfo;
import com.test.common.enums.BusinessType;
import com.test.common.utils.poi.ExcelUtil;
import com.test.test.domain.TestProject;
import com.test.test.domain.qo.IDQO;
import com.test.test.domain.qo.TestProjectListQO;
import com.test.test.service.ITestProjectService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
@@ -75,4 +77,27 @@ public class TestProjectController extends BaseController {
public AjaxResult editProject(@RequestBody TestProject testProject) {
return toAjax(testProjectService.updateTestProject(testProject));
}
/**
* 导出需求列表
*/
@Log(title = "需求", businessType = BusinessType.EXPORT)
@PostMapping("/exportProject")
public void exportProject(HttpServletResponse response,
@RequestBody TestProjectListQO qo) {
List<TestProject> list = testProjectService.selectTestProjectList(qo);
ExcelUtil<TestProject> util = new ExcelUtil<TestProject>(TestProject.class);
util.exportExcel(response, list, "需求数据");
}
/**
* 批量导出需求列表
*/
@Log(title = "需求", businessType = BusinessType.EXPORT)
@PostMapping("/batchExportProject")
public void batchExportProject(HttpServletResponse response,
@RequestBody List<TestProject> list) {
ExcelUtil<TestProject> util = new ExcelUtil<TestProject>(TestProject.class);
util.exportExcel(response, list, "需求数据");
}
}

View File

@@ -149,4 +149,61 @@ export function download(url, params, filename, config) {
})
}
function requestDownload0(options, filename, isSave = true) {
return service({
...options,
}).then(async (data) => {
downloadLoadingInstance?.close()
const isBlob = blobValidate(data);
if (isBlob) {
return data
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
Message.error(errMsg);
return null
}
}).then(data => {
if (data && isSave) {
const blob = new Blob([data])
saveAs(blob, filename)
}
return data
}).catch((r) => {
console.error(r)
Message.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance?.close()
})
}
/**
* 下载文件扩展原下载方法支持get请求(默认post)
*
* @param url 下载地址
* @param params 下载参数
* @param data 请求体
* @param filename 保存文件名称
* @param config 请求参数配置
* @param isSave 是否直接保存至本地
* @returns Promise<Blob> 若不保存至本地返回带下载结果的Promise
*/
export function requestDownload({ url, async, params, data, fileName, isSave = true, ...config }) {
if (!async) downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
const method = config.method || 'post'
const options = {
url,
params,
data,
method,
async,
responseType: 'blob',
...config,
}
if (!!params && !options.transformRequest) {
options.transformRequest = [(params) => { return params ? tansParams(params) : params }]
}
return requestDownload0(options, fileName, isSave)
}
export default service

View File

@@ -78,7 +78,7 @@
<el-tab-pane :label="'已完成(' + statusCounts.completed + ')'" name="2"></el-tab-pane>
<el-tab-pane :label="'已终止(' + statusCounts.terminated + ')'" name="3"></el-tab-pane>
<el-Table v-loading="loading" :data="list">
<el-Table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
<el-table-column type="selection"/>
<el-table-column prop="serialNumber" label="ID" align="center"/>
<el-table-column prop="version" label="版本" align="center"/>
@@ -108,8 +108,8 @@
<!-- 操作按钮 -->
<div style="margin-top: 10px; display: flex; justify-content: space-between; align-items: center;">
<div>
<el-button type="primary" size="small">全部导出</el-button>
<el-button size="small">批量导出</el-button>
<el-button type="primary" size="small" @click="handleExport">全部导出</el-button>
<el-button size="small" @click="handleSelectExport">批量导出</el-button>
</div>
<div>
<pagination
@@ -247,6 +247,7 @@
<script>
import {addProject, delProject, getProjectDetail, getProjectList, managerList, updateProject} from "@/api/test/project";
import SimpleOptions from "@/components/FormItem/option/SimpleOptions.vue";
import {requestDownload} from "@/utils/request";
export default {
name: 'project',
@@ -295,6 +296,8 @@ export default {
addOpen: false,
//编辑弹窗
editOpen: false,
selectedRows: [],
selectedData: [],
managerList: [],
queryParams: {
serialNumber: '',
@@ -333,6 +336,9 @@ export default {
},
},
methods: {
handleSelectionChange(selection) {
this.selectedRows = selection;
},
handleTabClick(tab) {
this.activeTab = tab.name;
this.getList();
@@ -466,6 +472,41 @@ export default {
this.$message.error('编辑失败')
this.editSubmitLoading = false
})
},
/** 全部导出按钮操作 */
handleExport() {
const [startCreateTime, endCreateTime] = this.queryParams.createTime || []
this.queryParams.startCreateTime = startCreateTime
this.queryParams.endCreateTime = endCreateTime
const {pageNum, pageSize, ...rest} = this.queryParams
requestDownload({
url: '/test/project/exportProject',
fileName: `需求列表信息_${new Date().getTime()}.xlsx`,
data: rest,
})
},
/** 批量导出按钮操作 */
handleSelectExport() {
this.selectedData = this.selectedRows.map(row => ({
serialNumber: row.serialNumber,
name: row.name,
outline: row.outline,
detail: row.detail,
manager: row.manager,
priority: row.priority,
estimatedTime: row.estimatedTime,
source: row.source,
type: row.type,
version: row.version,
createTime: row.createTime,
status: row.status
}));
console.log('selectedData', this.selectedData)
requestDownload({
url: '/test/project/batchExportProject',
fileName: `需求列表信息_${new Date().getTime()}.xlsx`,
data: this.selectedData,
});
}
}
};