From 6cbfbeb8acc904842388da392b2f718b3177dbcc Mon Sep 17 00:00:00 2001 From: liwen Date: Tue, 23 Jan 2024 13:46:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E6=BC=94=E7=BB=83?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=87=BA=E6=96=87=E4=BB=B6=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E4=B8=8D=E5=B1=95=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hzims/safeproduct/dto/RehearsalExportDTO.java | 10 +- .../safeproduct/entity/RehearsalPlanEntity.java | 5 +- .../safeproduct/vo/RehearsalRecordDetailVO.java | 11 ++ .../service/impl/RehearsalPlanServiceImpl.java | 10 +- .../service/impl/RehearsalRecordServiceImpl.java | 21 +++- .../com/hnac/hzims/safeproduct/utils/BaseUtil.java | 120 ++++++++++++--------- .../main/resources/template/演练记录表.docx | Bin 11999 -> 12208 bytes 7 files changed, 121 insertions(+), 56 deletions(-) diff --git a/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/dto/RehearsalExportDTO.java b/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/dto/RehearsalExportDTO.java index df269e3..f79db79 100644 --- a/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/dto/RehearsalExportDTO.java +++ b/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/dto/RehearsalExportDTO.java @@ -26,11 +26,9 @@ public class RehearsalExportDTO { private String subject; @ApiModelProperty("演练计划开始时间") - @ExcelProperty(value = "计划开始时间", index = 2) private Date scheduledStartTime; @ApiModelProperty("演练计划结束时间") - @ExcelProperty(value = "计划结束时间", index = 3) private Date scheduledEndTime; @ApiModelProperty("演练地点") @@ -40,4 +38,12 @@ public class RehearsalExportDTO { @ApiModelProperty("演练状态") @ExcelProperty(value = "演练状态", index = 5) private String rehearsalStatus; + + @ApiModelProperty("计划开始时间") + @ExcelProperty(value = "计划开始时间", index = 2) + private String startTime; + + @ApiModelProperty("计划结束时间") + @ExcelProperty(value = "计划结束时间", index = 3) + private String endTime; } diff --git a/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/entity/RehearsalPlanEntity.java b/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/entity/RehearsalPlanEntity.java index 4cd4306..45acd49 100644 --- a/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/entity/RehearsalPlanEntity.java +++ b/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/entity/RehearsalPlanEntity.java @@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; +import org.springblade.core.tool.utils.DateUtil; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @@ -33,12 +34,12 @@ public class RehearsalPlanEntity extends BaseEntity { private String subject; @NotNull - @JsonFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = DateUtil.PATTERN_DATE) @ApiModelProperty("演练计划开始时间") private Date scheduledStartTime; @NotNull - @JsonFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = DateUtil.PATTERN_DATE) @ApiModelProperty("演练计划结束时间") private Date scheduledEndTime; diff --git a/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/RehearsalRecordDetailVO.java b/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/RehearsalRecordDetailVO.java index 86afcbe..9b57e9c 100644 --- a/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/RehearsalRecordDetailVO.java +++ b/hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/RehearsalRecordDetailVO.java @@ -1,10 +1,12 @@ package com.hnac.hzims.safeproduct.vo; +import cn.afterturn.easypoi.entity.ImageEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; +import java.util.List; /** * @author liwen @@ -52,4 +54,13 @@ public class RehearsalRecordDetailVO { @ApiModelProperty("演练科目") private String subject; + + @ApiModelProperty("图片列表") + private List images; + + @ApiModelProperty("年份") + private String year; + + @ApiModelProperty("月份") + private String month; } diff --git a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/RehearsalPlanServiceImpl.java b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/RehearsalPlanServiceImpl.java index 040e07a..a296345 100644 --- a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/RehearsalPlanServiceImpl.java +++ b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/RehearsalPlanServiceImpl.java @@ -21,6 +21,7 @@ import com.hnac.hzims.safeproduct.vo.RehearsalMonthVO; import com.hnac.hzims.safeproduct.vo.RehearsalYearVO; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.utils.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -45,8 +46,7 @@ import java.util.stream.Collectors; * @date 2023-12-27 */ @Service -public class RehearsalPlanServiceImpl extends ServiceImpl - implements IRehearsalPlanService { +public class RehearsalPlanServiceImpl extends ServiceImpl implements IRehearsalPlanService { @Autowired IRehearsalRecordService rehearsalRecordService; @@ -190,8 +190,9 @@ public class RehearsalPlanServiceImpl extends ServiceImpl rehearsalList = getRehearsalByUnitAndDate(unit, startTime, endTime); - // 处理演练状态信息 + // 数据处理 rehearsalList.forEach(record -> { + // 演练状态 String status; if (record.getRehearsalStatus().equals(RehearsalStatusEnum.WAITING.getValue())) { status = RehearsalStatusEnum.WAITING.getDesc(); @@ -201,6 +202,9 @@ public class RehearsalPlanServiceImpl extends ServiceImpl list = new ArrayList<>(); + for (String img : imgArr) { + ImageEntity imageEntity = new ImageEntity(BaseUtil.imgToByte(savePath + + BaseUtil.downloadFileByUrl(img, savePath)), 180, 150); + list.add(imageEntity); + } + rehearsalRecordDetailVO.setImages(list); + } + // 表头年月 + String code = rehearsalRecordDetailVO.getCode(); + rehearsalRecordDetailVO.setYear(code.substring(4, 8)); + rehearsalRecordDetailVO.setMonth(code.substring(8, 10)); + // 演练方式 String rehearsalMethod = rehearsalRecordDetailVO.getRehearsalMethod(); if (rehearsalMethod.equals(RehearsalMethodEnum.MIXED.getValue())) { rehearsalRecordDetailVO.setRehearsalMethod(RehearsalMethodEnum.MIXED.getDesc()); diff --git a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/utils/BaseUtil.java b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/utils/BaseUtil.java index 1cc74f1..3118280 100644 --- a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/utils/BaseUtil.java +++ b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/utils/BaseUtil.java @@ -2,7 +2,7 @@ package com.hnac.hzims.safeproduct.utils; import cn.afterturn.easypoi.word.WordExportUtil; import com.hnac.hzims.common.logs.utils.StringUtils; -import com.hnac.hzims.ticket.annotation.DateTimeToMap; +import com.hnac.hzims.safeproduct.constants.SafeProductConstant; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -13,10 +13,12 @@ import org.springblade.core.tool.utils.ObjectUtil; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.lang.reflect.Field; +import java.net.HttpURLConnection; +import java.net.URL; import java.net.URLEncoder; +import java.nio.file.Files; import java.time.LocalDateTime; import java.util.*; -import java.util.stream.Collectors; /** * 公用工具类 @@ -156,8 +158,8 @@ public class BaseUtil { * @return map参数 */ public static Map obj2Map(Object obj) { + Map result = new HashMap<>(); if (ObjectUtil.isNotEmpty(obj) && null != obj.getClass()) { - Map result = new HashMap<>(); List fieldList = new ArrayList<>(); Class clazz = obj.getClass(); while (clazz != null) { @@ -172,59 +174,81 @@ public class BaseUtil { } catch (IllegalAccessException e) { throw new ServiceException("获取属性性出错"); } - if (value instanceof List) { - List> list = ((List) value).stream().map(BaseUtil::obj2Map).collect(Collectors.toList()); - result.put(field.getName(),list); - } - else if (value instanceof LocalDateTime) { - DateTimeToMap dateTimeToMap = field.getAnnotation(DateTimeToMap.class); - LocalDateTime time = (LocalDateTime) value; - if(ObjectUtil.isEmpty(dateTimeToMap)) { - result.put(field.getName(),time.format(DateUtil.TIME_FORMATTER)); - } - else { - result.putAll(LocalDateConvertMap(time,dateTimeToMap.prefix(),dateTimeToMap.split())); - } + if (value instanceof LocalDateTime) { + value = DateUtil.format((LocalDateTime) value, SafeProductConstant.SAFEPRODUCT_EXPORT_DATE); } else if (value instanceof Date) { - DateTimeToMap dateTimeToMap = field.getAnnotation(DateTimeToMap.class); - Date time = (Date) value; - if (ObjectUtil.isEmpty(dateTimeToMap)) { - result.put(field.getName(),DateUtil.format(time,DateUtil.PATTERN_DATETIME)); - } - else { - result.put(dateTimeToMap.prefix()+dateTimeToMap.split()+"year", time.getYear()); - result.put(dateTimeToMap.prefix()+dateTimeToMap.split()+"month", time.getMonth()); - result.put(dateTimeToMap.prefix()+dateTimeToMap.split()+"day", time.getDay()); - result.put(dateTimeToMap.prefix()+dateTimeToMap.split()+"hour", time.getHours()); - result.put(dateTimeToMap.prefix()+dateTimeToMap.split()+"minuter", time.getMinutes()); - result.put(dateTimeToMap.prefix()+dateTimeToMap.split()+"second", time.getSeconds()); - } - } - else { - result.put(field.getName(),value); + value = DateUtil.format((Date) value, SafeProductConstant.SAFEPRODUCT_EXPORT_DATE); } + result.put(field.getName(),value); }); - return result; } - return null; + return result; + } + + /** + * 图片转字节 + * @param tempImgPath 图片路径 + * @return 图片字节 + */ + public static byte[] imgToByte(String tempImgPath) { + File file = new File(tempImgPath); + byte[] buffer = null; + try { + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); + byte[] b = new byte[1000]; + int n; + while ((n = fis.read(b)) != -1) { + bos.write(b, 0, n); + } + fis.close(); + bos.close(); + buffer = bos.toByteArray(); + } catch (IOException e) { + log.error(e.getMessage()); + } + //删除临时文件 + file.delete(); + return buffer; } /** - * 将时间按格式转化为map对象 - * @param dateTime 待转换时间 - * @param prefix 转换格式Key前缀 - * @param split 转换格式Key分隔符 - * @return map对象 + * 下载文件 + * @param fileUrl 文件路径 + * @param downloadFileDir 下载路径 + * @return 下载文件路径 */ - public static Map LocalDateConvertMap(LocalDateTime dateTime,String prefix,String split) { - return new HashMap() {{ - put(prefix + split + "year", dateTime.getYear()); - put(prefix + split + "month", dateTime.getMonthValue()); - put(prefix + split + "day", dateTime.getDayOfMonth()); - put(prefix + split + "hour", dateTime.getHour()); - put(prefix + split + "minuter", dateTime.getMinute()); - put(prefix + split + "second", dateTime.getSecond()); - }}; + public static String downloadFileByUrl(String fileUrl, String downloadFileDir){ + URL url; + String fileName = null; + try { + url = new URL(fileUrl); + HttpURLConnection connection = (HttpURLConnection)url.openConnection(); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.connect(); + int responseCode = connection.getResponseCode(); + if (responseCode == 200) { + InputStream inputStream = connection.getInputStream(); + int lastSlashIndex = fileUrl.lastIndexOf("/"); + if (lastSlashIndex > 0) { + fileName = fileUrl.substring(lastSlashIndex+1); + String filePath = downloadFileDir + fileName; + File file = new File(filePath); + if (file.exists()){ + file.delete(); + } + OutputStream outputStream = Files.newOutputStream(file.toPath()); + // 将文件流拷贝到本地处理 + IOUtils.copy(inputStream, outputStream); + } else { + throw new ServiceException("下载文件路径异常:" + downloadFileDir); + } + } + } catch (Exception e) { + throw new ServiceException("文件图片下载失败!"); + } + return fileName; } } diff --git a/hzims-service/safeproduct/src/main/resources/template/演练记录表.docx b/hzims-service/safeproduct/src/main/resources/template/演练记录表.docx index ce1bbf9b172eef5b5c87bb6a2f750d339aaab482..f3c34385275a290ed86fdeeafec27340f572a61e 100644 GIT binary patch delta 5354 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 delta 5140 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