package com.chinagas.modules.schsf.controller; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.util.MapUtils; import com.alibaba.fastjson2.JSON; import com.alibaba.nacos.common.utils.CollectionUtils; import com.chinagas.common.core.domain.AjaxResult; import com.chinagas.common.core.exceptions.ServiceException; import com.chinagas.common.core.web.controller.BaseController; import com.chinagas.common.core.web.domain.BaseEntity; import com.chinagas.common.core.web.page.TableDataInfo; import com.chinagas.common.log.annotation.Log; import com.chinagas.common.log.enums.BusinessType; import com.chinagas.common.security.annotation.RequirePermission; import com.chinagas.common.security.enums.Logical; import com.chinagas.modules.schsf.domain.McBasicCmty; import com.chinagas.modules.schsf.domain.McBasicMoney; import com.chinagas.modules.schsf.domain.vo.McBasicCmtyVo; import com.chinagas.modules.schsf.domain.vo.McBasicMoneyVo; import com.chinagas.modules.schsf.service.ICommonService; import com.chinagas.modules.schsf.service.IMcBasicMoneyService; import com.chinagas.modules.schsf.utils.listener.McBasicCmtySheetWriteHandler; import com.chinagas.modules.schsf.utils.listener.McBasicMoneyImportInspection; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.sql.SQLIntegrityConstraintViolationException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 基础数据-金额Controller * * @author cw * @date 2024-05-23 */ @Slf4j @RestController @RequestMapping("/mcBasicMoney") public class McBasicMoneyController extends BaseController { @Autowired private IMcBasicMoneyService mcBasicMoneyService; @Autowired private ICommonService commonService; /** * 查询基础数据-金额列表 */ @RequirePermission("schsf:mcBasicMoney:list") @GetMapping("/list") public TableDataInfo list(McBasicMoneyVo mcBasicMoneyVo) { startPage(); mcBasicMoneyVo.setDefFlag("0"); List list = mcBasicMoneyService.selectMcBasicMoneyList(mcBasicMoneyVo); return getDataTable(list); } /** * 导入基础数据-金额数据 * * @param file * @return */ @RequirePermission("schsf:mcBasicMoney:importData") @PostMapping("/importData") public AjaxResult importData(MultipartFile file) { if (file.isEmpty()) { throw new RuntimeException("文件不能为空"); } if (!"xls,xlsx".contains(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1, file.getOriginalFilename().length()))) { throw new RuntimeException("只支持excel文件上传"); } //限制文件5M if (file.getSize() > 5000 * 1024) { throw new RuntimeException("文件大小不得超过5M"); } try { // 获取文件的输入流 InputStream inputStream = file.getInputStream(); List list = EasyExcel.read(inputStream) //调用read方法 .registerReadListener(new McBasicMoneyImportInspection()) // 注册自定义监听器,字段校验可以在监听器内实现 .head(McBasicMoney.class) // 对应导入的实体类 .sheet(0) // 导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据 .headRowNumber(4) // 列表头行数,1代表列表头有1行,第二行开始为数据行 .doReadSync(); // 开始读Excel,返回一个List集合,继续后续入库操作 log.info("导入基础数据-金额总条数:{}", list == null ? 0 : list.size()); List> userSysDeptAll = commonService.selectUserSysDeptAll(new BaseEntity()); long startTime = System.currentTimeMillis(); // 记录任务开始时间 // 插入数据库 if (CollectionUtils.isNotEmpty(list) && CollectionUtils.isNotEmpty(userSysDeptAll)) { // 使用 Map 来存储 companyCode 及其对应的部门信息 Map> deptMap = new HashMap<>(); for (HashMap dept : userSysDeptAll) { String companyCode = String.valueOf(dept.get("deptId")); if (companyCode != null) { deptMap.put(companyCode, dept); } } for (McBasicMoney mcBasicCmty : list) { String companyCode = mcBasicCmty.getCompanyCode(); if (!deptMap.containsKey(companyCode)) { throw new ServiceException("导入项目公司错误,请检查!"); } } // 插入数据库 for (McBasicMoney mcBasicCmty : list) { mcBasicMoneyService.insertMcBasicMoney(mcBasicCmty); } } long endTime = System.currentTimeMillis(); // 记录任务结束时间 long duration = endTime - startTime; // 计算任务运行时长 log.info("导入基础数据-金额,数据库插入任务运行时长:{}毫秒", duration); } catch (Exception e) { e.printStackTrace(); return AjaxResult.error(e.getMessage()); } return AjaxResult.success("数据导入成功"); } /** * 导出基础数据-金额列表模板 */ @RequirePermission(value = {"schsf:mcBasicMoney:exportTemplate", "schsf:mcBasicMoney:importData"}, logical = Logical.OR) @Log(title = "基础数据-金额", businessType = BusinessType.EXPORT) @PostMapping("/exportTemplate") public void exportTemplate(HttpServletResponse response) throws IOException { startPage(); McBasicMoneyVo mcBasicMoneyVo = new McBasicMoneyVo(); mcBasicMoneyVo.setDefFlag("0"); List list = mcBasicMoneyService.selectMcBasicMoneyList(mcBasicMoneyVo); try { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("基础数据-金额", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); List xllist = new ArrayList<>(); xllist.add("乡燃"); xllist.add("城燃"); // 这里需要设置不关闭流 EasyExcel.write(response.getOutputStream(), McBasicMoney.class) .registerWriteHandler(new McBasicCmtySheetWriteHandler(xllist, 11)) .autoCloseStream(Boolean.FALSE) .sheet("客户信息列表") .doWrite(list); } catch (Exception e) { // 重置response e.printStackTrace(); response.reset(); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); Map map = MapUtils.newHashMap(); map.put("status", "failure"); map.put("message", "下载文件失败" + e.getMessage()); response.getWriter().println(JSON.toJSONString(map)); } } @RequirePermission("schsf:mcBasicMoney:summaryList") @GetMapping("/summaryList") public TableDataInfo summaryList(McBasicMoneyVo mcBasicMoneyVo) { startPage(); mcBasicMoneyVo.setDefFlag("0"); List list = mcBasicMoneyService.selectMcBasicMoneySummaryList(mcBasicMoneyVo); return getDataTable(list); } @RequirePermission("schsf:mcBasicMoney:summaryExport") @PostMapping("/summaryExport") public void summaryExport(@RequestBody McBasicMoneyVo mcBasicMoneyVo, HttpServletResponse response) throws IOException { mcBasicMoneyVo.setDefFlag("0"); List list = mcBasicMoneyService.selectMcBasicMoneySummaryList(mcBasicMoneyVo); try { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("累加金额项目公司", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 这里需要设置不关闭流 EasyExcel.write(response.getOutputStream(), McBasicMoney.class).autoCloseStream(Boolean.FALSE).sheet("累加金额项目公司") .doWrite(list); } catch (Exception e) { // 重置response e.printStackTrace(); response.reset(); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); Map map = MapUtils.newHashMap(); map.put("status", "failure"); map.put("message", "下载文件失败" + e.getMessage()); response.getWriter().println(JSON.toJSONString(map)); } } }