package cn.besteam.modules.medical.controller; import cn.besteam.common.aspect.annotation.OpenApi; import cn.besteam.common.constant.DepartmentEnum; import cn.besteam.common.constant.ErrorCode; import cn.besteam.common.exception.BusinessException; import cn.besteam.modules.medical.entity.MwTransitConfig; import cn.besteam.modules.medical.service.IMwTransitConfigService; import cn.besteam.modules.system.biz.SysDictBiz; import cn.besteam.modules.system.entity.SysDepartment; import cn.besteam.modules.system.entity.SysDict; import cn.besteam.modules.system.service.IQrCodeService; import cn.besteam.modules.system.service.ISysDepartmentService; import cn.besteam.modules.system.service.ISysDictService; import cn.besteam.modules.system.service.ISysUserService; import cn.besteam.modules.system.vo.SysDictItemVO; import cn.besteam.modules.system.vo.SysUserExportVO; import cn.hutool.poi.excel.ExcelWriter; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.PaperSize; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Base64; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @RestController @RequestMapping(value = "/mwCode") @Slf4j @Api(description = "二维码管理") public class MwCodeController { @Autowired private IQrCodeService qrCodeService; @Autowired private ISysDepartmentService sysDepartmentService; @Autowired private ISysUserService sysUserService; @Autowired private IMwTransitConfigService transitConfigService; @Autowired private SysDictBiz sysDictBiz; @Autowired private ISysDictService sysDictService; @OpenApi @GetMapping("/export") @ApiOperation(value = "导出", notes = "type:1科室 2人员 3运输人员 4医废类型") public void export(HttpServletResponse response, @RequestParam(name = "type") Integer type, @RequestParam("departmentId") Integer departmentId) throws IOException { ExcelWriter excelWriter = new ExcelWriter(export(type, departmentId), "二维码"); // String fileName = "二维码信息导出"; response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); ServletOutputStream out = null; try { out = response.getOutputStream(); excelWriter.flush(out, true); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } excelWriter.close(); } } private XSSFWorkbook export(Integer type, Integer departmentId) throws IOException { switch (type) { case 1: return exportDepartment(departmentId); case 2: return exportUser(departmentId); case 3: return exportTransitConfig(departmentId); case 4: return exportMedicalWasteType(); default: break; } throw new BusinessException(ErrorCode.ERR_500, "导出类型不存在"); } /** * 导出组织架构 * * @param departmentId * @return * @throws IOException */ private XSSFWorkbook exportDepartment(Integer departmentId) throws IOException { List list; SysDepartment sysDepartment = sysDepartmentService.getById(departmentId); if (sysDepartment == null) { list = sysDepartmentService.list(new QueryWrapper().lambda().orderByAsc(SysDepartment::getTreeCode).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.OFFICE.getType())); } else { list = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).orderByAsc(SysDepartment::getTreeCode).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.OFFICE.getType())); } Map sysDepartmentMap = sysDepartmentService.list(new QueryWrapper().lambda().orderByAsc(SysDepartment::getTreeCode)).stream().collect(Collectors.toMap(SysDepartment::getId, e -> e)); // XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("二维码"); // XSSFDrawing patriarch = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor; // createDefaultSheet(sheet, list.size(), true); XSSFCellStyle cellStyle = createDefaultCellStyle(workbook); // int rowsCount = 0; for (int i = 0; i <= list.size() / 2; i++) { if (list.size() <= i * 2) { break; } XSSFRow row1 = sheet.getRow(rowsCount); XSSFRow row2 = sheet.getRow(rowsCount + 1); // 左边 SysDepartment sysDepartmentTemp = list.get(i * 2); SysDepartment hospital = getHospital(sysDepartmentMap, sysDepartmentTemp.getId()); // XSSFCell cell = row1.createCell(1); cell.setCellStyle(cellStyle); cell.setCellValue(hospital != null ? hospital.getDepartName() : ""); XSSFCell cell1 = row2.createCell(1); cell1.setCellValue(sysDepartmentTemp.getDepartName()); cell1.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 0, 0, 2, rowsCount + 1, 3, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); String content = "{\"id\":" + sysDepartmentTemp.getId() + ",\"type\":\"1\"}"; File file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); XSSFPicture picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // if (list.size() <= i * 2 + 1) { break; } // 右边 sysDepartmentTemp = list.get(i * 2 + 1); hospital = getHospital(sysDepartmentMap, sysDepartmentTemp.getId()); // XSSFCell rightCell = row1.createCell(4); rightCell.setCellValue(hospital != null ? hospital.getDepartName() : ""); rightCell.setCellStyle(cellStyle); XSSFCell rightCell1 = row2.createCell(4); rightCell1.setCellValue(sysDepartmentTemp.getDepartName()); rightCell1.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 0, 0, 5, rowsCount + 1, 6, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); content = "{\"id\":" + sysDepartmentTemp.getId() + ",\"type\":\"1\"}"; file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // rowsCount = rowsCount + 3; } return workbook; } /** * 导出用户 * * @param departmentId * @return * @throws IOException */ private XSSFWorkbook exportUser(Integer departmentId) throws IOException { List departmentList; SysDepartment sysDepartment = sysDepartmentService.getById(departmentId); if (sysDepartment == null) { departmentList = sysDepartmentService.list(new QueryWrapper().lambda().orderByAsc(SysDepartment::getTreeCode)); } else { departmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).orderByAsc(SysDepartment::getTreeCode)); } Map sysDepartmentMap = departmentList.stream().collect(Collectors.toMap(SysDepartment::getId, e -> e)); List list = sysUserService.getDepartmentUserList(departmentList.stream().map(SysDepartment::getId).collect(Collectors.toList())); // XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("二维码"); // XSSFDrawing patriarch = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor = null; //初始化行数 createDefaultSheet(sheet, list.size(), false); XSSFCellStyle cellStyle = createDefaultCellStyle(workbook); // int rowsCount = 0; for (int i = 0; i <= list.size() / 2; i++) { if (list.size() <= i * 2) { break; } XSSFRow row1 = sheet.getRow(rowsCount); XSSFRow row2 = sheet.getRow(rowsCount + 1); XSSFRow row3 = sheet.getRow(rowsCount + 2); // 左边 SysUserExportVO sysUserTemp = list.get(i * 2); SysDepartment hospital = getHospital(sysDepartmentMap, sysUserTemp.getDepartmentId()); // XSSFCell cell = row1.createCell(1); cell.setCellValue(hospital != null ? hospital.getDepartName() : ""); cell.setCellStyle(cellStyle); XSSFCell cell1 = row2.createCell(1); cell1.setCellValue(sysUserTemp.getDepartmentName()); cell1.setCellStyle(cellStyle); XSSFCell cell2 = row3.createCell(1); cell2.setCellValue(sysUserTemp.getName()); cell2.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 255, 255, 2, rowsCount + 1, 3, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); String content = "{\"id\":" + sysUserTemp.getId() + ",\"type\":\"2\",\"code\":\"" + sysUserTemp.getCode() + "\"}"; File file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); XSSFPicture picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // if (list.size() <= i * 2 + 1) { break; } // 右边 sysUserTemp = list.get(i * 2 + 1); hospital = getHospital(sysDepartmentMap, sysUserTemp.getDepartmentId()); XSSFCell rightCell = row1.createCell(4); rightCell.setCellValue(hospital != null ? hospital.getDepartName() : ""); rightCell.setCellStyle(cellStyle); XSSFCell rightCell1 = row2.createCell(4); rightCell1.setCellValue(sysUserTemp.getDepartmentName()); rightCell1.setCellStyle(cellStyle); XSSFCell rightCell2 = row3.createCell(4); rightCell2.setCellValue(sysUserTemp.getName()); rightCell2.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 255, 255, 5, rowsCount + 1, 6, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); content = "{\"id\":" + sysUserTemp.getId() + ",\"type\":\"2\",\"code\":\"" + sysUserTemp.getCode() + "\"}"; file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // rowsCount = rowsCount + 3; } return workbook; } private SysDepartment getHospital(Map sysDepartmentMap, Integer departmentId) { SysDepartment sysDepartment = sysDepartmentService.getSysDepartmentById(departmentId); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { return sysDepartment; } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { return getHospital(sysDepartmentMap, sysDepartment.getParentId()); } } return null; } /** * 导出出库配置 * * @param departmentId * @return * @throws IOException */ private XSSFWorkbook exportTransitConfig(Integer departmentId) throws IOException { List departmentList; SysDepartment sysDepartment = sysDepartmentService.getById(departmentId); if (sysDepartment == null) { departmentList = sysDepartmentService.list(new QueryWrapper().lambda().orderByAsc(SysDepartment::getTreeCode)); } else { departmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).orderByAsc(SysDepartment::getTreeCode)); } List list = transitConfigService.list(new QueryWrapper().lambda().in(MwTransitConfig::getHospitalId, departmentList.stream().map(SysDepartment::getId).collect(Collectors.toList()))); // XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("二维码"); // XSSFDrawing patriarch = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor; // createDefaultSheet(sheet, list.size(), false); XSSFCellStyle cellStyle = createDefaultCellStyle(workbook); // int rowsCount = 0; for (int i = 0; i <= list.size() / 2; i++) { if (list.size() <= i * 2) { break; } XSSFRow row1 = sheet.getRow(rowsCount); XSSFRow row2 = sheet.getRow(rowsCount + 1); XSSFRow row3 = sheet.getRow(rowsCount + 2); // 左边 MwTransitConfig mwTransitConfigTemp = list.get(i * 2); // XSSFCell cell = row1.createCell(1); cell.setCellValue(mwTransitConfigTemp.getTransitCompany()); cell.setCellStyle(cellStyle); XSSFCell cell1 = row2.createCell(1); cell1.setCellValue(mwTransitConfigTemp.getLicensePlate()); cell1.setCellStyle(cellStyle); XSSFCell cell2 = row3.createCell(1); cell2.setCellValue(mwTransitConfigTemp.getEngineDriver()); cell2.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 255, 255, 2, rowsCount + 1, 3, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); String content = "{\"id\":" + mwTransitConfigTemp.getId() + ",\"type\":\"3\"}"; File file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); XSSFPicture picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // if (list.size() <= i * 2 + 1) { break; } // 右边 mwTransitConfigTemp = list.get(i * 2 + 1); XSSFCell rightCell = row1.createCell(4); rightCell.setCellValue(mwTransitConfigTemp.getTransitCompany()); rightCell.setCellStyle(cellStyle); XSSFCell rightCell1 = row2.createCell(4); rightCell1.setCellValue(mwTransitConfigTemp.getLicensePlate()); rightCell1.setCellStyle(cellStyle); XSSFCell rightCell2 = row3.createCell(4); rightCell2.setCellValue(mwTransitConfigTemp.getEngineDriver()); rightCell2.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 255, 255, 5, rowsCount + 1, 6, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); content = "{\"id\":" + mwTransitConfigTemp.getId() + ",\"type\":\"3\"}"; file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // rowsCount = rowsCount + 3; } return workbook; } /** * 导出医废类型 * * @return * @throws IOException */ private XSSFWorkbook exportMedicalWasteType() throws IOException { List list = new ArrayList<>(); SysDict sysDict = sysDictService.getOne(new QueryWrapper().lambda().eq(SysDict::getDictCode, "MEDICAL_WASTE_TYPE")); if (sysDict != null) { list = sysDictBiz.getSysDictListByDict(sysDict.getId()); } // XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("二维码"); // XSSFDrawing patriarch = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor; // createDefaultSheet(sheet, list.size(), true); XSSFCellStyle cellStyle = createDefaultCellStyle(workbook); // int rowsCount = 0; for (int i = 0; i <= list.size() / 2; i++) { if (list.size() <= i * 2) { break; } XSSFRow row1 = sheet.getRow(rowsCount); XSSFRow row2 = sheet.getRow(rowsCount + 1); // 左边 SysDictItemVO vo = list.get(i * 2); // XSSFCell cell = row1.createCell(1); cell.setCellValue("医院废弃物专用二维码"); cell.setCellStyle(cellStyle); XSSFCell cell1 = row2.createCell(1); cell1.setCellValue(vo.getItemText()); cell1.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 255, 255, 2, rowsCount + 1, 3, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); String content = "{\"id\":" + vo.getId() + ",\"type\":\"4\"}"; File file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); XSSFPicture picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // if (list.size() <= i * 2 + 1) { break; } // 右边 vo = list.get(i * 2 + 1); XSSFCell rightCell = row1.createCell(4); rightCell.setCellValue("医院废弃物专用二维码"); rightCell.setCellStyle(cellStyle); XSSFCell rightCell1 = row2.createCell(4); rightCell1.setCellValue(vo.getItemText()); rightCell1.setCellStyle(cellStyle); // anchor = new XSSFClientAnchor(0, 0, 255, 255, 5, rowsCount + 1, 6, rowsCount + 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); content = "{\"id\":" + vo.getId() + ",\"type\":\"4\"}"; file = qrCodeService.genQrCodeFile(Base64.getEncoder().encodeToString(content.getBytes())); picture = patriarch.createPicture(anchor, workbook.addPicture(new FileInputStream(file), XSSFWorkbook.PICTURE_TYPE_JPEG)); picture.resize(0.835d); // rowsCount = rowsCount + 3; } return workbook; } private void createDefaultSheet(XSSFSheet sheet, int dataCount, boolean needMergeColumn) { for (int i = 0; i < 3 * (dataCount / 2 + 1); i++) { XSSFRow row = sheet.createRow(i); row.setHeight((short) 1240); if (i % 3 == 0) { sheet.addMergedRegion(new CellRangeAddress(i, i, 1, 2)); sheet.addMergedRegion(new CellRangeAddress(i, i, 4, 5)); } if (needMergeColumn) { if (i % 3 == 2) { sheet.addMergedRegion(new CellRangeAddress(i - 1, i, 1, 1)); sheet.addMergedRegion(new CellRangeAddress(i - 1, i, 4, 4)); } } } sheet.setColumnWidth(0, (short) 420); sheet.setColumnWidth(1, (short) 6065); sheet.setColumnWidth(2, (short) 6065); sheet.setColumnWidth(3, (short) 420); sheet.setColumnWidth(4, (short) 6065); sheet.setColumnWidth(5, (short) 6065); // XSSFPrintSetup printSetup = sheet.getPrintSetup(); printSetup.setHeaderMargin(0); printSetup.setFooterMargin(0); printSetup.setTopMargin(0); printSetup.setBottomMargin(0); printSetup.setLeftMargin(0); printSetup.setRightMargin(0); printSetup.setPaperSize(PaperSize.A4_PAPER); } private XSSFCellStyle createDefaultCellStyle(XSSFWorkbook workbook) { XSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.CENTER); XSSFFont font = workbook.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short) 16); cellStyle.setFont(font); cellStyle.setWrapText(true); return cellStyle; } }