@HasPermission("sys_post_export")
	public R export(SysPost post, Long[] ids) {
		try {
			// 1 创建任务
			Long taskId = sysTaskService.createTaskInfo(post);
			// 2 异步导出
			ScpUser user = SecurityUtils.getUser();
			sysPostService.asyncExportPost(taskId,user,post, ids);
			return R.ok(taskId);
		} catch (Exception e) {
			e.printStackTrace();
			return R.failed("创建导出任务失败: " + e.getMessage());
		}
	}
@Transactional(rollbackFor = Exception.class)
	public Long createTaskInfo(SysPost post) {
		String fileName = post.getFileName();
		if(StringUtils.isBlank(fileName)){
			fileName=System.currentTimeMillis()+".xlsx";
			post.setFileName(fileName);
		}
		SysTaskDTO taskVo = SysTaskUtils.getSysTask();
		taskVo.setTitle(fileName.substring(0, fileName.lastIndexOf(".")));
		taskVo.setDownloadLink(fileName);
		SysTask sysTask = new SysTask();
		BeanUtils.copyProperties(taskVo, sysTask);
		sysTask.setStatus(TaskStatusEnum.PENDING.getCode());
		sysTask.setCreateTime(LocalDateTime.now());
		sysTaskMapper.insert(sysTask);
		Long taskId = sysTask.getId(); // System.currentTimeMillis();
		taskMap.put(taskId, sysTask);
		return taskId;
	}
@Async("taskExecutor")
	public void asyncExportPost(Long taskId,ScpUser user,SysPost post, Long[] ids) {
		try{
			//1 查询数据
			//List<PostExcelVO> postList = this.listPost(post, ids);
			//2 更新任务状态为处理中
			sysTaskService.updateTaskStatus(taskId, TaskStatusEnum.PROCESSING.getCode(), null);
			// 模拟大数据量处理时间
			Thread.sleep(20000);
			List<PostExcelVO> postList=new ArrayList<>();
			for (int i = 0; i < 200000; i++) {
				PostExcelVO postExcelVO = new PostExcelVO();
				postExcelVO.setPostId(Long.valueOf(i));
				postExcelVO.setPostName("岗位名称" + i);
				postExcelVO.setPostCode("岗位标识" + i);
				postExcelVO.setPostSort(i);
				postExcelVO.setRemark("岗位描述" + i);
				postExcelVO.setCreateTime(LocalDateTime.now());
				postList.add(postExcelVO);
			}
			Integer total = postList.size();
			String fileName = post.getFileName();
			//3 数据写入excel
			//创建进度监听器
			//String filePath = "C:\\Users\\scp\\Downloads\\files\\local\\excel\\"+fileName;
			String fileFullPath = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + "post"+ FileUtil.FILE_SEPARATOR+fileName;
			EasyExcel.write(fileFullPath, PostExcelVO.class).registerWriteHandler(new EasyExcelExportListener(taskId,total)).sheet("数据").doWrite(postList);
			//4 文件上传
			File file=new File(fileFullPath);
			sysFileService.uploadFileByLocal(file, fileName, "", null, "30");
			//5 更新任务状态为完成
			sysTaskService.updateTaskStatus(taskId, TaskStatusEnum.COMPLETED.getCode(), null);
			//6 发送消息
			sysMessageService.sendTaskMsg(user,"【导出成功】");
		} catch (Exception e) {
			sysTaskService.updateTaskStatus(taskId, TaskStatusEnum.FAILED.getCode(), e.getMessage());
			sysMessageService.sendTaskMsg(user,"【导出失败】");
			log.error("导出岗位数据失败"+e.getMessage());
		}
	}
package com.shpl.scp.admin.config;


import cn.hutool.extra.spring.SpringUtil;
import cn.idev.excel.write.handler.AbstractRowWriteHandler;
import cn.idev.excel.write.handler.WriteHandler;
import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
import cn.idev.excel.write.metadata.holder.WriteTableHolder;
import com.shpl.scp.admin.api.entity.SysTask;
import com.shpl.scp.admin.service.SysTaskService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Row;

@Slf4j
public class EasyExcelExportListener extends AbstractRowWriteHandler implements WriteHandler {

    private Long taskId;
    private Integer total;

    public EasyExcelExportListener(Long taskId,Integer total){
        this.taskId = taskId;
        this.total = total;
    }
    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
        //log.info("写入行数据后 relativeRowIndex = {}",relativeRowIndex);
        if(relativeRowIndex%999==0 || total == (relativeRowIndex+1)){
            // 在每一行数据写入后调用
            SysTaskService sysTaskService = SpringUtil.getBean(SysTaskService.class);
            SysTask sysTask = new SysTask();
            sysTask.setId(taskId);
            sysTask.setExecNum(relativeRowIndex+1);
            sysTask.setTotalNum(total);
            sysTaskService.updateById(sysTask);
        }
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐