/* * Copyright (c) 2018-2025, lengleng All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the yifu4cloud.com developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: lengleng (wangiegie@gmail.com) */ package ${package}.${moduleName}.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import ${package}.${moduleName}.entity.${className}; import ${package}.${moduleName}.vo.${className}Vo; import ${package}.${moduleName}.mapper.${className}Mapper; import ${package}.${moduleName}.service.${className}Service; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; import com.yifu.cloud.plus.v1.yifu.common.core.util.ErrorMessage; import com.yifu.cloud.plus.v1.yifu.common.core.util.R; import ${package}.${moduleName}.vo.${className}SearchVo; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.util.List; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ArrayUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.read.metadata.holder.ReadRowHolder; import com.alibaba.excel.util.ListUtils; import com.alibaba.excel.write.metadata.WriteSheet; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants; import com.yifu.cloud.plus.v1.yifu.common.core.util.*; import com.yifu.cloud.plus.v1.yifu.common.mybatis.base.BaseEntity; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; /** * ${comments} * * @author ${author} * @date ${datetime} */ @Log4j2 @Service public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}> implements ${className}Service { /** * ${comments}简单分页查询 * @param ${classname} ${comments} * @return */ @Override public IPage<${className}> get${className}Page(Page<${className}> page, ${className}SearchVo ${classname}){ return baseMapper.get${className}Page(page,${classname}); } /** * ${comments}批量导出 * @param ${classname} ${comments} * @return */ @Override public void listExport(HttpServletResponse response, ${className}SearchVo searchVo){ String fileName = "${comments}批量导出" + DateUtil.getThisTime() + ".xlsx"; //获取要导出的列表 List<${className}> list = new ArrayList<>(); long count = noPageCountDiy(searchVo); ServletOutputStream out = null; try { out = response.getOutputStream(); response.setContentType(CommonConstants.MULTIPART_FORM_DATA); response.setCharacterEncoding("utf-8"); response.setHeader(CommonConstants.CONTENT_DISPOSITION, CommonConstants.ATTACHMENT_FILENAME + URLEncoder.encode(fileName , CommonConstants.UTF8)); // 这里 需要指定写用哪个class去写,然后写到第一个sheet,然后文件流会自动关闭 //EasyExcel.write(out, TEmpBadRecord.class).sheet("不良记录").doWrite(list); ExcelWriter excelWriter = EasyExcel.write(out, ${className}.class).build(); int index = 0; if (count > CommonConstants.ZERO_INT){ for (int i = 0; i <= count; ) { // 获取实际记录 searchVo.setLimitStart(i); searchVo.setLimitEnd(CommonConstants.EXCEL_EXPORT_LIMIT); list = noPageDiy(searchVo); if (Common.isNotNull(list)){ ExcelUtil<${className}> util = new ExcelUtil<>(${className}.class); for (${className} vo:list){ util.convertEntity(vo,null,null,null); } } if (Common.isNotNull(list)){ WriteSheet writeSheet = EasyExcel.writerSheet("${comments}"+index).build(); excelWriter.write(list,writeSheet); index++; } i = i + CommonConstants.EXCEL_EXPORT_LIMIT; if (Common.isNotNull(list)){ list.clear(); } } }else { WriteSheet writeSheet = EasyExcel.writerSheet("${comments}"+index).build(); excelWriter.write(list,writeSheet); } if (Common.isNotNull(list)){ list.clear(); } out.flush(); excelWriter.finish(); }catch (Exception e){ log.error("执行异常" ,e); }finally { try { if (null != out) { out.close(); } } catch (IOException e) { log.error("执行异常", e); } } } @Override public List<${className}> noPageDiy(${className}SearchVo searchVo) { LambdaQueryWrapper<${className}> wrapper = buildQueryWrapper(searchVo); List<String> idList = Common.getList(searchVo.getIds()); if (Common.isNotNull(idList)){ wrapper.in(${className}::getId,idList); } if (searchVo.getLimitStart() >= 0 && searchVo.getLimitEnd() > 0){ wrapper.last(" limit "+ searchVo.getLimitStart() +","+ searchVo.getLimitEnd()); } wrapper.orderByDesc(BaseEntity::getCreateTime); return baseMapper.selectList(wrapper); } private Long noPageCountDiy(${className}SearchVo searchVo) { LambdaQueryWrapper<${className}> wrapper = buildQueryWrapper(searchVo); List<String> idList = Common.getList(searchVo.getIds()); if (Common.isNotNull(idList)){ wrapper.in(${className}::getId,idList); } return baseMapper.selectCount(wrapper); } private LambdaQueryWrapper buildQueryWrapper(${className}SearchVo entity){ LambdaQueryWrapper<${className}> wrapper = Wrappers.lambdaQuery(); if (ArrayUtil.isNotEmpty(entity.getCreateTimes())) { wrapper.ge(${className}::getCreateTime, entity.getCreateTimes()[0]) .le(${className}::getCreateTime, entity.getCreateTimes()[1]); } if (Common.isNotNull(entity.getCreateName())){ wrapper.eq(${className}::getCreateName,entity.getCreateName()); } return wrapper; } @Override public R<List<ErrorMessage>> importDiy(InputStream inputStream) { List<ErrorMessage> errorMessageList = new ArrayList<>(); ExcelUtil<${className}Vo> util1 = new ExcelUtil<>(${className}Vo.class);; // 写法2: // 匿名内部类 不用额外写一个DemoDataListener // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 try { EasyExcel.read(inputStream, ${className}Vo.class, new ReadListener<${className}Vo>() { /** * 单次缓存的数据量 */ public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT; /** *临时存储 */ private List<${className}Vo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); @Override public void invoke(${className}Vo data, AnalysisContext context) { ReadRowHolder readRowHolder = context.readRowHolder(); Integer rowIndex = readRowHolder.getRowIndex(); data.setRowIndex(rowIndex+1); ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex()); if (Common.isNotNull(errorMessage)){ errorMessageList.add(errorMessage); }else { cachedDataList.add(data); } if (cachedDataList.size() >= BATCH_COUNT) { saveData(); // 存储完成清理 list cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { saveData(); } /** * 加上存储数据库 */ private void saveData() { log.info("{}条数据,开始存储数据库!", cachedDataList.size()); import${className}(cachedDataList,errorMessageList); log.info("存储数据库成功!"); } }).sheet().doRead(); }catch (Exception e){ log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR,e); return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR); } return R.ok(errorMessageList); } private void import${className}(List<${className}Vo> excelVOList, List<ErrorMessage> errorMessageList) { // 个性化校验逻辑 ErrorMessage errorMsg; // 执行数据插入操作 组装 for (int i = 0; i < excelVOList.size(); i++) { ${className}Vo excel = excelVOList.get(i); // 数据合法情况 TODO // 插入 insertExcel(excel); errorMessageList.add(new ErrorMessage(excel.getRowIndex(),CommonConstants.SAVE_SUCCESS)); } } /** * 插入excel bad record */ private void insertExcel(${className}Vo excel) { ${className} insert = new ${className}(); BeanUtil.copyProperties(excel, insert); this.save(insert); } }