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 0000000..a218551 Binary files /dev/null and b/src/main/resources/excel/MaintenancePlanReport.xlsx differ diff --git a/src/main/resources/excel/MaintenanceTaskReport.xlsx b/src/main/resources/excel/MaintenanceTaskReport.xlsx new file mode 100644 index 0000000..20ba664 Binary files /dev/null and b/src/main/resources/excel/MaintenanceTaskReport.xlsx differ diff --git a/src/main/resources/excel/WorkOrderServiceSheet.xlsx b/src/main/resources/excel/WorkOrderServiceSheet.xlsx new file mode 100644 index 0000000..14aaf33 Binary files /dev/null and b/src/main/resources/excel/WorkOrderServiceSheet.xlsx differ