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.dto.CompanyDto; import com.chinagas.modules.schsf.domain.vo.McBasicCmtyVo; import com.chinagas.modules.schsf.service.ICommonService; import com.chinagas.modules.schsf.service.IMcBasicCmtyService; import com.chinagas.modules.schsf.utils.listener.McBasicCmtySheetWriteHandler; import com.chinagas.modules.schsf.utils.listener.McBasicCmtyImportInspection; import lombok.extern.slf4j.Slf4j; 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.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 基础数据-户数Controller * * @author cw * @date 2024-05-22 */ @Slf4j @RestController @RequestMapping("/mcBasicCmty") public class McBasicCmtyController extends BaseController { @Autowired private IMcBasicCmtyService mcBasicCmtyService; @Autowired private ICommonService commonService; /** * 查询基础数据-户数 项目公司组织级联 */ // @RequirePermission("schsf:mcBasicCmty:companyCascader") @RequirePermission(value = {"schsf:mcVisit:list", "schsf:mcIgnition:list", "schsf:mcConstruction:list"}, logical = Logical.OR) @GetMapping("/companyCascader") public AjaxResult companyCascader(Long fiscalYear) { McBasicCmtyVo mcBasicCmtyVo = new McBasicCmtyVo(); mcBasicCmtyVo.setDefFlag("0"); mcBasicCmtyVo.setFiscalYear(fiscalYear); List data = mcBasicCmtyService.selectCompanyCascader(mcBasicCmtyVo); return AjaxResult.success(data); } /** * 查询小区 * * @param fiscalYear * @param regionName * @param groupName * @param companyName * @param companyCode * @return */ // @RequirePermission("schsf:mcBasicCmty:vlgOrCmty") @RequirePermission(value = {"schsf:mcVisit:list", "schsf:mcIgnition:list", "schsf:mcConstruction:list"}, logical = Logical.OR) @GetMapping("/vlgOrCmty") public AjaxResult vlgOrCmty( @RequestParam(value = "fiscalYear", required = true) Long fiscalYear, @RequestParam(value = "regionName", required = true) String regionName, @RequestParam(value = "groupName", required = true) String groupName, @RequestParam(value = "companyName", required = true) String companyName, @RequestParam(value = "companyCode", required = true) String companyCode) { McBasicCmtyVo mcBasicCmtyVo = new McBasicCmtyVo(); mcBasicCmtyVo.setDefFlag("0"); mcBasicCmtyVo.setFiscalYear(fiscalYear); mcBasicCmtyVo.setRegionName(regionName); mcBasicCmtyVo.setGroupName(groupName); mcBasicCmtyVo.setCompanyName(companyName); mcBasicCmtyVo.setCompanyCode(companyCode); List data = mcBasicCmtyService.selectVlgOrCmtyList(mcBasicCmtyVo); return AjaxResult.success(data); } /** * 查询基础数据-户数列表 */ @RequirePermission("schsf:mcBasicCmty:list") @GetMapping("/list") public TableDataInfo list(McBasicCmtyVo mcBasicCmtyVo) { startPage(); mcBasicCmtyVo.setDefFlag("0"); List list = mcBasicCmtyService.selectMcBasicCmtyList(mcBasicCmtyVo); return getDataTable(list); } /** * 导入数据 * * @param file * @return */ @RequirePermission("schsf:mcBasicCmty: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 McBasicCmtyImportInspection()) // 注册自定义监听器,字段校验可以在监听器内实现 .head(McBasicCmty.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(userSysDeptAll) && CollectionUtils.isNotEmpty(list)) { // 使用 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 (McBasicCmty mcBasicCmty : list) { String companyCode = mcBasicCmty.getCompanyCode(); if (!deptMap.containsKey(companyCode)) { throw new ServiceException("导入项目公司错误,请检查!"); } } // 插入数据库 for (McBasicCmty mcBasicCmty : list) { mcBasicCmtyService.insertMcBasicCmty(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("数据导入成功"); } /** * 模板 * * @param response * @throws IOException */ @RequirePermission(value = {"schsf:mcBasicCmty:exportTemplate", "schsf:mcBasicCmty:importData"}, logical = Logical.OR) @Log(title = "基础数据-户数", businessType = BusinessType.EXPORT) @PostMapping("/exportTemplate") public void exportTemplate(HttpServletResponse response) throws IOException { McBasicCmtyVo mcBasicCmtyVo = new McBasicCmtyVo(); startPage(); mcBasicCmtyVo.setDefFlag("0"); List list = mcBasicCmtyService.selectMcBasicCmtyList(mcBasicCmtyVo); 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"); //测试数据,实际开发中一般查询查询库,调用Service查询获得 List xllist = new ArrayList<>(); xllist.add("乡燃"); xllist.add("城燃"); // 这里需要设置不关闭流 EasyExcel.write(response.getOutputStream(), McBasicCmty.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:mcBasicCmty:summaryList") @GetMapping("/summaryList") public TableDataInfo summaryList(McBasicCmtyVo mcBasicCmtyVo) { startPage(); mcBasicCmtyVo.setDefFlag("0"); List list = mcBasicCmtyService.selectMcBasicCmtySummaryList(mcBasicCmtyVo); return getDataTable(list); } @RequirePermission("schsf:mcBasicCmty:summaryExport") @PostMapping("/summaryExport") public void summaryExport(@RequestBody McBasicCmtyVo mcBasicCmtyVo, HttpServletResponse response) throws IOException { List list = mcBasicCmtyService.selectMcBasicCmtySummaryList(mcBasicCmtyVo); 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(), McBasicCmty.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)); } } }