diff --git a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java index 0e80b64..029958b 100644 --- a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java +++ b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springblade.common.constant.CommonConstant; @@ -27,6 +28,7 @@ import org.springblade.modules.business.sms.SmsService; import org.springblade.modules.system.pojo.entity.User; import org.springblade.modules.system.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -472,7 +474,7 @@ public class MaintenanceController extends BladeController { @PostMapping("/maintenance-plan-report") @Operation(summary = "导出巡检计划报告", description = "导出巡检计划报告") - private void maintenancePlanReport(@RequestBody MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { + public void maintenancePlanReport(@RequestBody MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { planDetailService.maintenancePlanReport(maintenancePlan, response); } } diff --git a/src/main/java/org/springblade/modules/business/excel/CustomCellWriteHeightConfig.java b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteHeightConfig.java new file mode 100644 index 0000000..2b09ca6 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteHeightConfig.java @@ -0,0 +1,65 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; +import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import java.util.Iterator; + +public class CustomCellWriteHeightConfig extends AbstractRowHeightStyleStrategy { + + /** + * 默认高度 + */ + private static final Integer DEFAULT_HEIGHT = 300; + + @Override + protected void setHeadColumnHeight(Row row, int relativeRowIndex) { + + } + + @Override + protected void setContentColumnHeight(Row row, int relativeRowIndex) { + Iterator cellIterator = row.cellIterator(); + if (!cellIterator.hasNext()) { + return; + } + // 默认为 1 行高度 + int maxHeight = 1; + while (cellIterator.hasNext()) { + Cell cell = cellIterator.next(); + if (cell.getCellType() == CellType.STRING) { + String value = cell.getStringCellValue(); + for (int i = 0; i < value.length(); i += 10) { + if (i + 10 < value.length()) { + value = value.substring(0, i) + "\n" + value.substring(i, i + 10) + value.substring(i + 10); + } else { + value = value.substring(0, i) + "\n" + value.substring(i); + } + } + if (value.contains("\n")) { + int length = value.split("\n").length; + maxHeight = Math.max(maxHeight, length); + } + } + } + row.setHeight((short) (maxHeight * DEFAULT_HEIGHT)); + } + + @Override + public void afterRowDispose(RowWriteHandlerContext context) { + if (context.getHead() != null) { + if (ObjectUtils.isEmpty(context.getRelativeRowIndex())) { + return; + } + if (Boolean.TRUE.equals(context.getHead())) { + this.setHeadColumnHeight(context.getRow(), context.getRelativeRowIndex()); + } else { + this.setContentColumnHeight(context.getRow(), context.getRelativeRowIndex()); + } + + } + } +} diff --git a/src/main/java/org/springblade/modules/business/excel/CustomCellWriteWidthConfig.java b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteWidthConfig.java new file mode 100644 index 0000000..989b0b9 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteWidthConfig.java @@ -0,0 +1,77 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.CellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CustomCellWriteWidthConfig extends AbstractColumnWidthStyleStrategy { + + private final Map> CACHE = new HashMap<>(); + + @Override + protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) { + boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList); + if (needSetWidth) { + Map maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>()); + Integer columnWidth = this.dataLength(cellDataList, cell, isHead); + if (columnWidth > 0) { + if (columnWidth > 10) { + columnWidth = 20; + }else{ + columnWidth = 10; + } + Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex()); + if (maxColumnWidth == null || columnWidth > maxColumnWidth) { + maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth); + Sheet sheet = writeSheetHolder.getSheet(); + sheet.setColumnWidth(cell.getColumnIndex(), 256 * columnWidth + 184); + } + } + } + } + + /** + * 计算长度 + * + * @param cellDataList + * @param cell + * @param isHead + * @return + */ + private Integer dataLength(List> cellDataList, Cell cell, Boolean isHead) { + if (isHead) { + return cell.getStringCellValue().getBytes().length; + } else { + CellData cellData = cellDataList.get(0); + CellDataTypeEnum type = cellData.getType(); + if (type == null) { + return -1; + } else { + switch (type) { + case STRING: + // 换行符(数据需要提前解析好) + int index = cellData.getStringValue().indexOf("\n"); + return index != -1 ? + cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1; + case BOOLEAN: + return cellData.getBooleanValue().toString().getBytes().length; + case NUMBER: + return cellData.getNumberValue().toString().getBytes().length; + default: + return -1; + } + } + } + } + +} diff --git a/src/main/java/org/springblade/modules/business/excel/MergeColumnStrategy.java b/src/main/java/org/springblade/modules/business/excel/MergeColumnStrategy.java new file mode 100644 index 0000000..58e5927 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/MergeColumnStrategy.java @@ -0,0 +1,37 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; + +@Data +public class MergeColumnStrategy implements CellWriteHandler { + + private Integer firstColumnIndex; + + private Integer lastColumnIndex; + + + public MergeColumnStrategy(Integer firstColumnIndex, Integer lastColumnIndex) { + this.firstColumnIndex = firstColumnIndex; + this.lastColumnIndex = lastColumnIndex; + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + Sheet sheet = writeSheetHolder.getSheet(); + int lastRowNum = sheet.getLastRowNum(); + CellRangeAddress cellAddresses = new CellRangeAddress(lastRowNum, lastRowNum, firstColumnIndex, lastColumnIndex); + sheet.addMergedRegion(cellAddresses); + } +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/BigTitle.java b/src/main/java/org/springblade/modules/business/pojo/entity/BigTitle.java new file mode 100644 index 0000000..f23cd56 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/BigTitle.java @@ -0,0 +1,21 @@ +package org.springblade.modules.business.pojo.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ContentFontStyle; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class BigTitle { + + @ContentFontStyle(fontHeightInPoints = 15, fontName = "微软雅黑") + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, borderTop = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN) + private String title; + + +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/DeviceVO.java b/src/main/java/org/springblade/modules/business/pojo/entity/DeviceVO.java new file mode 100644 index 0000000..ad94ad1 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/DeviceVO.java @@ -0,0 +1,45 @@ +package org.springblade.modules.business.pojo.entity; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ContentFontStyle; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@ContentFontStyle(fontHeightInPoints = 10, fontName = "微软雅黑") +@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, borderTop = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN) +public class DeviceVO { + + @ExcelProperty("楼层") + private String floor; + + @ExcelProperty("房间") + private String dept; + + @ExcelProperty("设备名称") + private String deviceName; + + @ExcelProperty("单位") + private String unit; + + @ExcelProperty("数量") + private Integer num; + + @ExcelProperty("维保内容及频次") + private String checkContent; + + @ExcelProperty("巡检工艺") + private String craft; + + @ExcelProperty("巡检频次") + private String period; + + @ExcelIgnore + private String type; +} diff --git a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java index d049dd3..3b068d4 100644 --- a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java +++ b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java @@ -14,6 +14,5 @@ import java.io.IOException; * @since 2024-10-14 */ public interface IMaintenancePlanDetailService extends BaseService { - void maintenancePlanReport(MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException; } diff --git a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java index 02c4449..17075d1 100644 --- a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java +++ b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java @@ -1,8 +1,10 @@ package org.springblade.modules.business.service; +import jakarta.servlet.http.HttpServletResponse; import org.springblade.core.mp.base.BaseService; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; +import java.io.IOException; import java.time.LocalDate; import java.util.Date; import java.util.List; @@ -26,4 +28,6 @@ public interface IMaintenancePlanService extends BaseService { boolean planRemove(List ids); MaintenancePlan planDetail(MaintenancePlan plan); + + } diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java index 7da7001..e266f59 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java @@ -4,23 +4,32 @@ package org.springblade.modules.business.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.modules.business.excel.CustomCellWriteHeightConfig; +import org.springblade.modules.business.excel.CustomCellWriteWidthConfig; +import org.springblade.modules.business.excel.MergeColumnStrategy; +import org.springblade.modules.business.pojo.entity.BigTitle; +import org.springblade.modules.business.pojo.entity.Device; +import org.springblade.modules.business.pojo.entity.DeviceVO; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanOutputData; +import org.springblade.modules.business.service.IDeviceService; import org.springblade.modules.business.service.IMaintenancePlanDetailService; import org.springblade.modules.business.mapper.MaintenancePlanDetailMapper; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanDetail; +import org.springblade.modules.system.pojo.entity.Dept; +import org.springblade.modules.system.service.IDeptService; import org.springframework.stereotype.Service; import java.io.IOException; -import java.io.OutputStream; import java.util.*; -import java.util.zip.ZipOutputStream; +import java.util.stream.Collectors; /** * 巡检计划详情 服务实现类 @@ -31,6 +40,8 @@ import java.util.zip.ZipOutputStream; @Service @AllArgsConstructor public class MaintenancePlanDetailServiceImpl extends BaseServiceImpl implements IMaintenancePlanDetailService { + private final IDeviceService deviceService; + private final IDeptService deptService; @Override public void maintenancePlanReport(MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { @@ -38,11 +49,22 @@ public class MaintenancePlanDetailServiceImpl extends BaseServiceImpl maintenancePlanDetailsList = baseMapper.selectList(Wrappers.lambdaQuery(MaintenancePlanDetail.class).eq(MaintenancePlanDetail::getPlanId, maintenancePlan.getId())); + List deviceVOList = new ArrayList<>(); List maintenancePlanOutputDataList = new ArrayList<>(); for (MaintenancePlanDetail maintenancePlanDetail : maintenancePlanDetailsList) { + //sheet1数据获取 MaintenancePlanOutputData maintenancePlanOutputData = new MaintenancePlanOutputData(); - maintenancePlanOutputData.setMajorName(maintenancePlanDetail.getMajorName()); - maintenancePlanOutputData.setAddress(maintenancePlan.getAddress()); + Device device = deviceService.getById(maintenancePlanDetail.getDeviceId()); + maintenancePlanOutputData.setMajorName(device.getName()); + Long limsId = device.getLimsId(); + String deptAddress = ""; + Dept lims = deptService.getById(limsId); + deptAddress = deptAddress + lims.getDeptName(); + Dept floor = deptService.getById(device.getFloorId()); + deptAddress = deptAddress + "/" + floor.getDeptName(); + Dept dept = deptService.getById(device.getRoomId()); + deptAddress = deptAddress + "/" + dept.getDeptName(); + maintenancePlanOutputData.setAddress(deptAddress); maintenancePlanOutputData.setCraft(maintenancePlanDetail.getCraft()); maintenancePlanOutputData.setCheckContent(maintenancePlanDetail.getCheckContent()); Optional period = Optional.ofNullable(maintenancePlanDetail.getPeriod()); @@ -58,12 +80,61 @@ public class MaintenancePlanDetailServiceImpl extends BaseServiceImpl> deviceVOGroups = deviceVOList.stream().collect(Collectors.groupingBy(DeviceVO::getType)); + int tableNo = 0; //导出到Excel中 ServletOutputStream outputStream = response.getOutputStream(); try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateFile).build()) { - WriteSheet writeSheet = EasyExcel.writerSheet().build(); - excelWriter.fill(maintenancePlanOutputDataList, fillConfig, writeSheet); + WriteSheet firstSheet = EasyExcel.writerSheet(0).build(); + WriteSheet secondSheet = EasyExcel + .writerSheet(1) + .registerWriteHandler(new CustomCellWriteHeightConfig()) + .registerWriteHandler(new CustomCellWriteWidthConfig()) + .build(); + excelWriter.fill(maintenancePlanOutputDataList, fillConfig, firstSheet); + for (Map.Entry> entry : deviceVOGroups.entrySet()) { + List bigTitleList = new ArrayList<>(); + BigTitle bigTitle = new BigTitle(); + bigTitle.setTitle(entry.getValue().get(0).getType() + "维保清单"); + bigTitleList.add(bigTitle); + WriteTable writeTable1 = EasyExcel.writerTable() + .tableNo(tableNo++) + .registerWriteHandler(new MergeColumnStrategy(0, 7)) + .needHead(false) + .head(BigTitle.class) + .build(); + excelWriter.write(bigTitleList, secondSheet, writeTable1); + WriteTable writeTable = EasyExcel.writerTable() + .tableNo(tableNo++) + .needHead(true) + .head(DeviceVO.class) + .build(); + excelWriter.write(entry.getValue(), secondSheet, writeTable); + } excelWriter.finish(); outputStream.flush(); outputStream.close(); diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java index 9e52ae2..099ee03 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java @@ -1,7 +1,13 @@ package org.springblade.modules.business.service.impl; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.springblade.common.cache.UserCache; @@ -11,10 +17,7 @@ import org.springblade.core.tool.utils.DateUtil; import org.springblade.modules.business.enums.MaintenanceStatusEnum; import org.springblade.modules.business.mapper.MaintenancePlanMapper; import org.springblade.modules.business.pojo.entity.DeviceAttach; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanDetail; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTask; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTaskDetail; +import org.springblade.modules.business.pojo.entity.maintenance.*; import org.springblade.modules.business.service.*; import org.springblade.modules.business.sms.SmsService; import org.springblade.modules.resource.pojo.entity.Sms; @@ -23,6 +26,7 @@ import org.springblade.modules.system.service.IUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.ZoneId; diff --git a/src/main/resources/excel/MaintenancePlanReport.xlsx b/src/main/resources/excel/MaintenancePlanReport.xlsx index a218551..bb4f3b4 100644 Binary files a/src/main/resources/excel/MaintenancePlanReport.xlsx and b/src/main/resources/excel/MaintenancePlanReport.xlsx differ