From d45b4cf1b7c6c7046ee5efa11aba77e899693357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=9B=E5=AE=8F=E7=A5=A5?= <14281818+xue-hongxiang@user.noreply.gitee.com> Date: Thu, 26 Dec 2024 16:11:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=90=E7=BB=B4=E6=8A=A5=E5=91=8A=E5=8D=95?= =?UTF-8?q?=E5=AF=BC=E5=87=BA+=E5=B7=A1=E6=A3=80=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E5=8D=95=E5=AF=BC=E5=87=BA+=E5=B7=A1?= =?UTF-8?q?=E6=A3=80=E8=AE=A1=E5=88=92=E6=8A=A5=E5=91=8A=E5=8D=95=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contraller/MaintenanceController.java | 15 +++ .../contraller/WorkOrderController.java | 12 ++ .../business/excel/ImageExcelData.java | 47 +++++++ .../business/excel/TemplateExcelUtils.java | 68 ++++++++++ .../maintenance/MaintenanceOutputData.java | 38 ++++++ .../MaintenancePlanOutputData.java | 24 ++++ .../entity/workorder/WorkOrderFillData.java | 21 +++ .../IMaintenancePlanDetailService.java | 7 +- .../IMaintenanceTaskDetailService.java | 6 + .../business/service/IWorkOrderService.java | 13 +- .../MaintenancePlanDetailServiceImpl.java | 49 +++++++ .../MaintenanceTaskDetailServiceImpl.java | 97 +++++++++++++ .../service/impl/WorkOrderServiceImpl.java | 127 ++++++++++++++++-- .../excel/MaintenancePlanReport.xlsx | Bin 0 -> 19328 bytes .../excel/MaintenanceTaskReport.xlsx | Bin 0 -> 10946 bytes .../excel/WorkOrderServiceSheet.xlsx | Bin 0 -> 11800 bytes 16 files changed, 510 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/springblade/modules/business/excel/ImageExcelData.java create mode 100644 src/main/java/org/springblade/modules/business/excel/TemplateExcelUtils.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceOutputData.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenancePlanOutputData.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java create mode 100644 src/main/resources/excel/MaintenancePlanReport.xlsx create mode 100644 src/main/resources/excel/MaintenanceTaskReport.xlsx create mode 100644 src/main/resources/excel/WorkOrderServiceSheet.xlsx 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 4253941..bede1eb 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.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springblade.common.constant.CommonConstant; import org.springblade.core.boot.ctrl.BladeController; @@ -28,6 +29,7 @@ import org.springblade.modules.system.service.IUserService; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import java.io.IOException; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -45,6 +47,7 @@ import java.util.Optional; public class MaintenanceController extends BladeController { private final IMaintenancePlanService planService; + private final IMaintenancePlanDetailService planDetailService; private final IMaintenanceTaskService taskService; private final IMaintenanceTaskDetailService taskDetailService; @@ -440,4 +443,16 @@ public class MaintenanceController extends BladeController { List list = taskDetailService.findListByDeviceId(deviceId); return R.data(list); } + + @PostMapping("/maintenance-output-service") + @Operation(summary = "导出巡检任务报告", description = "导出巡检任务报告") + public void maintenanceOutputService(@RequestBody MaintenanceTask task, HttpServletResponse response) throws IOException { + taskDetailService.maintenanceOutputService(task, response); + } + + @PostMapping("/maintenance-plan-report") + @Operation(summary = "导出巡检计划报告", description = "导出巡检计划报告") + private void maintenancePlanReport(@RequestBody MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { + planDetailService.maintenancePlanReport(maintenancePlan, response); + } } diff --git a/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java b/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java index 5ffe623..30b72d8 100644 --- a/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java +++ b/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.mysql.cj.log.Log; +import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONObject; @@ -36,6 +37,7 @@ import org.springblade.modules.system.service.IUserService; import org.springframework.web.bind.annotation.*; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; @@ -623,4 +625,14 @@ public class WorkOrderController extends BladeController { return R.success(""); } + + /** + * 维修单报告导出 + */ + @ApiLog("导出运维服务单") + @PostMapping("/report-service") + public void reportService(@RequestBody WorkOrder workOrder, HttpServletResponse response) throws IOException { + workOrderService.reportService(workOrder, response); + } + } diff --git a/src/main/java/org/springblade/modules/business/excel/ImageExcelData.java b/src/main/java/org/springblade/modules/business/excel/ImageExcelData.java new file mode 100644 index 0000000..e24cedf --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/ImageExcelData.java @@ -0,0 +1,47 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.converters.bytearray.ByteArrayImageConverter; +import com.alibaba.excel.converters.string.StringImageConverter; +import com.alibaba.excel.converters.url.UrlImageConverter; +import com.alibaba.excel.metadata.data.WriteCellData; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.File; +import java.io.InputStream; +import java.net.URL; + +@Data +@EqualsAndHashCode(callSuper = false) +@ContentRowHeight(10) +@ColumnWidth(10) +public class ImageExcelData { + + private File file; + private InputStream inputStream; + /** + * 如果string类型 必须指定转换器,string默认转换成string + */ + @ExcelProperty(converter = StringImageConverter.class) + private String string; + + @ExcelProperty(converter = ByteArrayImageConverter.class) + private byte[] byteArray; + /** + * 根据url导出 + * + * @since 2.1.1 + */ + @ExcelProperty(converter = UrlImageConverter.class) + private URL url; + + /** + * 根据文件导出 并设置导出的位置。 + * + * @since 3.0.0-beta1 + */ + private WriteCellData writeCellDataFile; +} diff --git a/src/main/java/org/springblade/modules/business/excel/TemplateExcelUtils.java b/src/main/java/org/springblade/modules/business/excel/TemplateExcelUtils.java new file mode 100644 index 0000000..fff8800 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/TemplateExcelUtils.java @@ -0,0 +1,68 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.metadata.data.ImageData; +import com.alibaba.excel.metadata.data.WriteCellData; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class TemplateExcelUtils { + /** + * Excel所有图片设置 + * + * @param bytes + * @return + */ + //参数依次为图片字节,图片宽度(像素),图片高度,行高(厘米),列宽 + public static WriteCellData imageCells(byte[] bytes, Double imageWidth, Double imageHight, Double rowLength, Double columLength) throws IOException { + + //等比例缩小图片,直到图片能放在单元格下,每次缩小20% + Integer top = 0; + Integer left = 0; + //厘米转换成像素 + rowLength = rowLength * 28; + columLength = columLength * 28; + while (true) { + if (imageHight < rowLength && imageWidth < columLength) { + //计算边框值 + top = Math.toIntExact(Math.round((rowLength - imageHight) / 2)); + left = Math.toIntExact(Math.round((columLength - imageWidth) / 2)); + break; + } else { + imageHight = imageHight * 0.8; + imageWidth = imageWidth * 0.8; + } + } + WriteCellData writeCellData = new WriteCellData<>(); + // 这里可以设置为 EMPTY 则代表不需要其他数据了 + //writeCellData.setType(CellDataTypeEnum.EMPTY); + + // 可以放入多个图片 + List imageDataList = new ArrayList<>(); + writeCellData.setImageDataList(imageDataList); + + + ImageData imageData = new ImageData(); + imageDataList.add(imageData); + // 设置图片 + imageData.setImage(bytes); + // 图片类型 + //imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG); + // 上 右 下 左 需要留空,这个类似于 css 的 margin;这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。 + imageData.setTop(top); + imageData.setRight(left); + imageData.setBottom(top); + imageData.setLeft(left); + + // * 设置图片的位置。Relative表示相对于当前的单元格index。first是左上点,last是对角线的右下点,这样确定一个图片的位置和大小。 + // 目前填充模板的图片变量是images,index:row=7,column=0。所有图片都基于此位置来设置相对位置 + // 第1张图片相对位置 + imageData.setRelativeFirstRowIndex(0); + imageData.setRelativeFirstColumnIndex(0); + imageData.setRelativeLastRowIndex(0); + imageData.setRelativeLastColumnIndex(0); + + return writeCellData; + } +} \ No newline at end of file diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceOutputData.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceOutputData.java new file mode 100644 index 0000000..efc8d9a --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceOutputData.java @@ -0,0 +1,38 @@ +package org.springblade.modules.business.pojo.entity.maintenance; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.converters.bytearray.ByteArrayImageConverter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class MaintenanceOutputData { + //序号 + private Long no; + + //楼层 + private String floor; + + //房间 + private String deptName; + + //专业名称 + private String majorName; + + //巡检内容 + private String checkContent; + + //状态 + private Integer status; + + //现场照片 + @ExcelProperty(converter = ByteArrayImageConverter.class) + private byte[] image1; + + //签字照片 + @ExcelProperty(converter = ByteArrayImageConverter.class) + private byte[] image2; + + private String remark; +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenancePlanOutputData.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenancePlanOutputData.java new file mode 100644 index 0000000..f036f29 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenancePlanOutputData.java @@ -0,0 +1,24 @@ +package org.springblade.modules.business.pojo.entity.maintenance; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class MaintenancePlanOutputData { + //专业 + private String majorName; + + //点位 + private String address; + + //巡检内容 + private String checkContent; + + //巡检工艺 + private String craft; + + //巡检频次 + private String period; + +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java new file mode 100644 index 0000000..6f1cc33 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrderFillData.java @@ -0,0 +1,21 @@ +package org.springblade.modules.business.pojo.entity.workorder; + + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import org.springblade.modules.business.excel.ImageExcelData; + +import java.awt.image.BufferedImage; +import java.util.List; + +@Data +public class WorkOrderFillData { + + private String materialName; + + private Integer materialCount; + + private Double materialPrice; + + private Double price; +} 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 dda404d..9789c03 100644 --- a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java +++ b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java @@ -1,7 +1,12 @@ 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 org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanDetail; +import org.springframework.web.bind.annotation.RequestBody; + +import java.io.IOException; /** * 维保计划详情 服务类 @@ -10,5 +15,5 @@ import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanD * @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/IMaintenanceTaskDetailService.java b/src/main/java/org/springblade/modules/business/service/IMaintenanceTaskDetailService.java index 4bee8b8..63878f5 100644 --- a/src/main/java/org/springblade/modules/business/service/IMaintenanceTaskDetailService.java +++ b/src/main/java/org/springblade/modules/business/service/IMaintenanceTaskDetailService.java @@ -1,8 +1,12 @@ 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.MaintenanceTask; import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTaskDetail; +import org.springframework.web.bind.annotation.RequestBody; +import java.io.IOException; import java.util.List; /** @@ -13,4 +17,6 @@ import java.util.List; */ public interface IMaintenanceTaskDetailService extends BaseService { List findListByDeviceId(Long deviceId); + + void maintenanceOutputService(MaintenanceTask task, HttpServletResponse response) throws IOException; } diff --git a/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java b/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java index ef4d1c0..a7988e0 100644 --- a/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java +++ b/src/main/java/org/springblade/modules/business/service/IWorkOrderService.java @@ -1,11 +1,13 @@ 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.MaintenancePersonnel; import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; import org.springblade.modules.business.pojo.vo.PieStatVO; import org.springblade.modules.business.pojo.vo.workorder.WorkOrderVO; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -84,14 +86,17 @@ public interface IWorkOrderService extends BaseService { public void repairPlanSubmit(WorkOrder workOrder); - public List> selectFaultEquipTop5(); + public List> selectFaultEquipTop5(); - public List> selectEquipOverview(); + public List> selectEquipOverview(); - public List> selectEquipRepairCount(); + public List> selectEquipRepairCount(); + + public List> selectEquipRepairCountByMonth(String deviceId); - public List> selectEquipRepairCountByMonth(String deviceId); public Integer selectAverageFaultResponseTime(String month); public Integer selectAverageFaultRepairTime(String month); + + public void reportService(WorkOrder workOrder, HttpServletResponse response) throws IOException; } 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 67c5f23..8e31385 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 @@ -1,12 +1,24 @@ 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 org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; +import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanOutputData; 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.springframework.stereotype.Service; +import java.io.IOException; +import java.util.*; + /** * 巡检计划详情 服务实现类 * @@ -16,5 +28,42 @@ import org.springframework.stereotype.Service; @Service public class MaintenancePlanDetailServiceImpl extends BaseServiceImpl implements IMaintenancePlanDetailService { + @Override + public void maintenancePlanReport(MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { + //数据获取 + String templateFile = "./src/main/resources/excel/MaintenancePlanReport.xlsx"; + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + List maintenancePlanDetailsList = baseMapper.selectList(Wrappers.lambdaQuery(MaintenancePlanDetail.class).eq(MaintenancePlanDetail::getPlanId, maintenancePlan.getId())); + List maintenancePlanOutputDataList = new ArrayList<>(); + for (MaintenancePlanDetail maintenancePlanDetail : maintenancePlanDetailsList) { + MaintenancePlanOutputData maintenancePlanOutputData = new MaintenancePlanOutputData(); + maintenancePlanOutputData.setMajorName(maintenancePlanDetail.getMajorName()); + maintenancePlanOutputData.setAddress(maintenancePlan.getAddress()); + maintenancePlanOutputData.setCraft(maintenancePlanDetail.getCraft()); + maintenancePlanOutputData.setCheckContent(maintenancePlanDetail.getCheckContent()); + Optional period = Optional.ofNullable(maintenancePlanDetail.getPeriod()); + if (period.isPresent()) { + if (period.get() == 1) { + maintenancePlanOutputData.setPeriod("每月"); + } else if (period.get() == 2) { + maintenancePlanOutputData.setPeriod("每季"); + } else if (period.get() == 3) { + maintenancePlanOutputData.setPeriod("每半年"); + } + } else { + maintenancePlanOutputData.setPeriod(null); + } + maintenancePlanOutputDataList.add(maintenancePlanOutputData); + } + //导出到Excel中 + ServletOutputStream outputStream = response.getOutputStream(); + try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateFile).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + excelWriter.fill(maintenancePlanOutputDataList, fillConfig, writeSheet); + excelWriter.finish(); + outputStream.flush(); + outputStream.close(); + } + } } diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java index b661d61..bd750c1 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenanceTaskDetailServiceImpl.java @@ -1,13 +1,35 @@ 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.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.modules.business.mapper.MaintenanceTaskDetailMapper; +import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceOutputData; +import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTask; import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTaskDetail; import org.springblade.modules.business.service.IMaintenanceTaskDetailService; import org.springframework.stereotype.Service; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 巡检任务详情 服务实现类 @@ -23,4 +45,79 @@ public class MaintenanceTaskDetailServiceImpl extends BaseServiceImpl findListByDeviceId(Long deviceId) { return baseMapper.findListByDeviceId(deviceId); } + + @Override + public void maintenanceOutputService(MaintenanceTask task, HttpServletResponse response) throws IOException { + //数据获取 + String templateFile = "./src/main/resources/excel/MaintenanceTaskReport.xlsx"; + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + Map map = new HashMap<>(); + map.put("taskName", task.getTaskName()); + map.put("address", task.getAddress()); + map.put("taskContent", task.getTaskContent()); + map.put("serviceManName", task.getServicemanName()); + List maintenanceTaskDetailList = baseMapper.selectList(Wrappers.lambdaQuery(MaintenanceTaskDetail.class).eq(MaintenanceTaskDetail::getTaskId, task.getId())); + List maintenanceOutputDataList = new ArrayList<>(); + long no = 0; + for (MaintenanceTaskDetail maintenanceTaskDetail : maintenanceTaskDetailList) { + no++; + MaintenanceOutputData maintenanceOutputData = new MaintenanceOutputData(); + maintenanceOutputData.setNo(no); + maintenanceOutputData.setFloor(maintenanceTaskDetail.getFloorName()); + maintenanceOutputData.setDeptName(maintenanceTaskDetail.getDeptName()); + maintenanceOutputData.setMajorName(maintenanceTaskDetail.getMajorName()); + maintenanceOutputData.setCheckContent(maintenanceTaskDetail.getCheckContent()); + maintenanceOutputData.setStatus(maintenanceTaskDetail.getStatus()); + maintenanceOutputData.setRemark(maintenanceTaskDetail.getRemark()); + if (StringUtils.isNotBlank(maintenanceTaskDetail.getPicUrl())) { + try { + URL url = new URL(maintenanceTaskDetail.getPicUrl()); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setDoInput(true); + InputStream inputStream = httpURLConnection.getInputStream(); + BufferedImage image = ImageIO.read(inputStream); + ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(image, "jpg", arrayOutputStream); + byte[] bytes = arrayOutputStream.toByteArray(); + maintenanceOutputData.setImage1(bytes); + } catch (Exception e) { + throw new RuntimeException(e); + } + } else { + maintenanceOutputData.setImage1(null); + } + if (StringUtils.isNotBlank(maintenanceTaskDetail.getSignUrl())) { + try { + URL url = new URL(maintenanceTaskDetail.getSignUrl()); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setDoInput(true); + InputStream inputStream = httpURLConnection.getInputStream(); + BufferedImage image = ImageIO.read(inputStream); + ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(image, "jpg", arrayOutputStream); + byte[] bytes = arrayOutputStream.toByteArray(); + maintenanceOutputData.setImage2(bytes); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + maintenanceOutputDataList.add(maintenanceOutputData); + } + + //将数据导出到Excel + ServletOutputStream outputStream = response.getOutputStream(); + try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateFile).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + excelWriter.fill(maintenanceOutputDataList, fillConfig, writeSheet); + excelWriter.fill(map, writeSheet); + excelWriter.finish(); + outputStream.flush(); + outputStream.close(); + } + + + } } diff --git a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java index d71e72f..fd3e68a 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java @@ -1,9 +1,16 @@ package org.springblade.modules.business.service.impl; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.metadata.data.ImageData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import io.undertow.util.FileUtils; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.Synchronized; import org.apache.commons.collections.CollectionUtils; @@ -14,21 +21,18 @@ import org.springblade.common.constant.CommonConstant; import org.springblade.common.utils.LogUtil; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.support.Condition; -import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; -import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.StringPool; import org.springblade.modules.business.enums.WorkOrderStatusEnum; +import org.springblade.modules.business.excel.ImageExcelData; +import org.springblade.modules.business.excel.TemplateExcelUtils; import org.springblade.modules.business.mapper.WorkOrderMapper; +import org.springblade.modules.business.pojo.entity.Device; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePersonnel; -import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; -import org.springblade.modules.business.pojo.entity.workorder.WorkOrderApproval; -import org.springblade.modules.business.pojo.entity.workorder.WorkOrderAttach; -import org.springblade.modules.business.pojo.entity.workorder.WorkOrderRepairMaterial; +import org.springblade.modules.business.pojo.entity.workorder.*; import org.springblade.modules.business.pojo.vo.PieStatVO; -import org.springblade.modules.business.pojo.vo.SearchMaintenancePersonnelVO; import org.springblade.modules.business.pojo.vo.workorder.WorkOrderVO; import org.springblade.modules.business.service.*; import org.springblade.modules.system.pojo.entity.Dept; @@ -38,6 +42,14 @@ import org.springblade.modules.system.service.IUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -489,4 +501,101 @@ public class WorkOrderServiceImpl extends BaseServiceImpl workOrderRepairMaterialList = workOrderRepairMaterialService.list(Wrappers.lambdaQuery(WorkOrderRepairMaterial.class).eq(WorkOrderRepairMaterial::getOrderId, workOrder.getId())); + List workOrderFillDataList = new ArrayList<>(); + WorkOrderFillData workOrderFillData = new WorkOrderFillData(); + for (WorkOrderRepairMaterial workOrderRepairMaterial : workOrderRepairMaterialList) { + workOrderFillData.setMaterialName(workOrderRepairMaterial.getMaterialName()); + workOrderFillData.setMaterialCount(workOrderRepairMaterial.getMaterialCount()); + workOrderFillData.setMaterialPrice(workOrderRepairMaterial.getMaterialPrice()); + double price = workOrderRepairMaterial.getMaterialPrice() / workOrderRepairMaterial.getMaterialCount(); + workOrderFillData.setPrice(price); + workOrderFillDataList.add(workOrderFillData); + total += price; + } + ImageExcelData imageExcelData = new ImageExcelData(); + imageExcelData.setUrl(new URL(workOrder.getSignatureUrl())); + //获取签字图片 + URL url = new URL(workOrder.getSignatureUrl()); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setDoInput(true); + InputStream inputStream = httpURLConnection.getInputStream(); + BufferedImage image = ImageIO.read(inputStream); + if (image != null) { + System.out.println("图片加载成功"); + } else { + System.out.println("图片加载失败"); + throw new IOException(); + } + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(image, "png", byteArrayOutputStream); // 将图片写入输出流 + byte[] imageBytes = byteArrayOutputStream.toByteArray(); + Double width = Double.valueOf(image.getWidth()); + Double height = Double.valueOf(image.getHeight()); + WriteCellData voidWriteCellData = TemplateExcelUtils.imageCells(imageBytes, width, height, 0.6, 1.9); + User repairPerson = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getId, workOrder.getRepairPerson())); + Map map = new HashMap<>(); + User customer = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getId, workOrder.getInformant())); + map.put("customerName", customer.getRealName()); + map.put("informant", customer.getRealName()); + map.put("informantPhone", customer.getPhone()); + map.put("address", customer.getAddress()); + map.put("faultDescribe", workOrder.getFaultDescribe()); + map.put("faultCause", workOrder.getFaultCause()); + map.put("total", total); + map.put("processMethod", workOrder.getProcessMethod()); + map.put("repairPerson", repairPerson.getRealName()); + map.put("repairPersonPhone", repairPerson.getPhone()); + //转换日期格式 + Date finishTime = workOrder.getFinishTime(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日"); + map.put("finishTime", simpleDateFormat.format(finishTime)); + map.put("image", voidWriteCellData); + Device device = deviceService.getOne(Wrappers.lambdaQuery(Device.class).eq(Device::getId, workOrder.getDeviceId())); + Optional isWarran = Optional.ofNullable(device.getIsWarran()); + if (isWarran.isPresent()) { + if (isWarran.get() == 1) { + map.put("int", "--"); + map.put("out", total); + map.put("sel2", "√"); + } else { + map.put("int", total); + map.put("out", "--"); + map.put("sel1", "√"); + } + } else { + map.put("int", "--"); + map.put("out", "--"); + map.put("sel2", null); + map.put("sel1", null); + } + Optional status = Optional.ofNullable(workOrder.getStatus()); + if (status.isPresent()) { + if (status.get() == 202) { + map.put("sel4", "√"); + } else { + map.put("sel3", "√"); + } + } else { + map.put("sel4", null); + map.put("sel3", null); + } + //写入Excel并导出 + ServletOutputStream out = response.getOutputStream(); + try (ExcelWriter excelWriter = EasyExcel.write(out).withTemplate(templateFileName).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + excelWriter.fill(workOrderFillDataList, fillConfig, writeSheet); + excelWriter.fill(map, writeSheet); + excelWriter.finish(); + out.flush(); + out.close(); + } + } } diff --git a/src/main/resources/excel/MaintenancePlanReport.xlsx b/src/main/resources/excel/MaintenancePlanReport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a218551469ff8327875153cf8c266202005ddee6 GIT binary patch literal 19328 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 M_yTQ{bqDDK01kohkN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/excel/MaintenanceTaskReport.xlsx b/src/main/resources/excel/MaintenanceTaskReport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..20ba664d6161630b463a9d10bd44f9a304f35e49 GIT binary patch literal 10946 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 G-v0w3GZUcz literal 0 HcmV?d00001 diff --git a/src/main/resources/excel/WorkOrderServiceSheet.xlsx b/src/main/resources/excel/WorkOrderServiceSheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..14aaf338156fda7b3d38fce2880f3e6db125dd6a GIT binary patch literal 11800 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 z