diff --git a/start/src/main/resources/bootstrap.yml b/start/src/main/resources/bootstrap.yml index fda3619..ec451cc 100644 --- a/start/src/main/resources/bootstrap.yml +++ b/start/src/main/resources/bootstrap.yml @@ -4,6 +4,6 @@ spring: # - classpath:nacos.yml # - classpath:sdk.yml - classpath:nacos-prod.yml - - classpath:sdk-prod.yml -# - classpath:sdk-prod-gwj.yml +# - classpath:sdk-prod.yml + - classpath:sdk-prod-gwj.yml - classpath:swagger.yml diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgInformAddExe.java b/web-app/src/main/java/com/zcloud/safety/command/SgInformAddExe.java index ff2f328..483e249 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgInformAddExe.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgInformAddExe.java @@ -64,7 +64,6 @@ public class SgInformAddExe { SgInformE sgInformE = new SgInformE(); BeanUtils.copyProperties(inform, sgInformE); - // 通知接收接口未传业务主键,按当前约定每次生成新的 informId 并绑定图片外键。 sgInformE.setInformId(Tools.get32UUID()); handleCreateFields(sgInformE, inform); @@ -98,20 +97,40 @@ public class SgInformAddExe { List imgFilesDOList = new ArrayList<>(); byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key); for (MultipartFile multipartFile : files) { + if (multipartFile == null || multipartFile.isEmpty()) { + continue; + } SM4 sm4 = SmUtil.sm4(decryptKey); byte[] decrypt = sm4.decrypt(multipartFile.getInputStream()); - String fileName = Tools.get32UUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")); + String originalFilename = normalizeEncryptedFileName(multipartFile.getOriginalFilename()); + if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) { + throw new BizException("通知附件名称不合法"); + } + String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "inform"); ImgFilesDO imgFilesDO = new ImgFilesDO(); imgFilesDO.setImgFilesId(Tools.get32UUID()); imgFilesDO.setFilePath(filePath); imgFilesDO.setForeignKey(informId); - imgFilesDO.setFileName(multipartFile.getOriginalFilename()); + imgFilesDO.setFileName(originalFilename); imgFilesDO.setType(3); imgFilesDOList.add(imgFilesDO); + log.info("通知附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename); + } + if (!imgFilesDOList.isEmpty()) { + imgFilesRepository.saveBatch(imgFilesDOList); } - imgFilesRepository.saveBatch(imgFilesDOList); log.info("数港通知附件保存完成,通知业务主键:{},附件数量:{}", informId, imgFilesDOList.size()); } + + private String normalizeEncryptedFileName(String encryptedFileName) { + if (StringUtils.isBlank(encryptedFileName)) { + return encryptedFileName; + } + if (encryptedFileName.endsWith(".encrypted")) { + return encryptedFileName.substring(0, encryptedFileName.length() - 10); + } + return encryptedFileName; + } } diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgNoticeAddExe.java b/web-app/src/main/java/com/zcloud/safety/command/SgNoticeAddExe.java index f02fb41..e28a831 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgNoticeAddExe.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgNoticeAddExe.java @@ -1,6 +1,5 @@ package com.zcloud.safety.command; -import cn.hutool.core.date.DateUtil; import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.symmetric.SM4; import com.alibaba.cola.exception.BizException; @@ -50,7 +49,7 @@ public class SgNoticeAddExe { public boolean execute(SgNoticeAddCmd cmd) { SgNoticeE sgNoticeE = new SgNoticeE(); BeanUtils.copyProperties(cmd, sgNoticeE); - boolean res = false; + boolean res; try { res = sgNoticeGateway.add(sgNoticeE); } catch (Exception e) { @@ -69,7 +68,7 @@ public class SgNoticeAddExe { try { log.info("开始处理数港公告入库,公告业务主键:{},附件数量:{}", notice.getNoticeId(), files == null ? 0 : files.length); - String noticeId = notice.getNoticeId(); + String noticeId = notice.getNoticeId(); SgNoticeDO byNoticeId = null; if (StringUtils.isNotBlank(noticeId)) { @@ -88,22 +87,33 @@ public class SgNoticeAddExe { if (files != null && files.length > 0) { List imgFilesDOList = new ArrayList<>(); + byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key); + SM4 sm4 = SmUtil.sm4(decryptKey); for (MultipartFile multipartFile : files) { - SM4 sm4 = SmUtil.sm4(EncryptAndDecryptUtil.decryptSm2(key)); + if (multipartFile == null || multipartFile.isEmpty()) { + continue; + } byte[] decrypt = sm4.decrypt(multipartFile.getInputStream()); - // 生成文件名 - String fileName = Tools.get32UUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")); + String originalFilename = normalizeEncryptedFileName(multipartFile.getOriginalFilename()); + if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) { + throw new BizException("公告附件名称不合法"); + } + + String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "notice"); ImgFilesDO imgFilesDO = new ImgFilesDO(); imgFilesDO.setImgFilesId(Tools.get32UUID()); imgFilesDO.setFilePath(filePath); imgFilesDO.setForeignKey(sgNoticeE.getNoticeId()); - imgFilesDO.setFileName(multipartFile.getOriginalFilename()); + imgFilesDO.setFileName(originalFilename); imgFilesDO.setType(2); imgFilesDOList.add(imgFilesDO); + log.info("公告附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename); + } + if (!imgFilesDOList.isEmpty()) { + imgFilesRepository.saveBatch(imgFilesDOList); } - imgFilesRepository.saveBatch(imgFilesDOList); log.info("数港公告附件保存完成,公告业务主键:{},图片数量:{}", notice.getNoticeId(), imgFilesDOList.size()); } @@ -120,8 +130,9 @@ public class SgNoticeAddExe { throw new RuntimeException(e); } } - /** - * 处理创建人和创建时间字段的转换 + + /** + * 处理创建人和创建时间字段的转换。 */ private void handleCreateFields(SgNoticeE sgNoticeE, SgNoticeAddDTO notice) { if (StringUtils.isNotBlank(notice.getCreateBy())) { @@ -130,7 +141,7 @@ public class SgNoticeAddExe { if (StringUtils.isNotBlank(notice.getCreateTime())) { try { - LocalDateTime createTime = LocalDateTime.parse(notice.getCreateTime().trim(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + LocalDateTime createTime = LocalDateTime.parse(notice.getCreateTime().trim(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); sgNoticeE.setCreateTime(createTime); } catch (Exception e) { log.warn("解析创建时间失败,使用当前时间,原始值:{},错误:{}", notice.getCreateTime(), e.getMessage()); @@ -141,7 +152,6 @@ public class SgNoticeAddExe { } } - /** * 公告带新附件重传时,先逻辑删除旧图片,避免明细重复。 */ @@ -150,4 +160,17 @@ public class SgNoticeAddExe { imgFilesRepository.deletedImgFilesByForeignId(noticeId); } } + + /** + * 数港传入附件名称带 .encrypted 后缀时,保存前统一还原真实文件名。 + */ + private String normalizeEncryptedFileName(String encryptedFileName) { + if (StringUtils.isBlank(encryptedFileName)) { + return encryptedFileName; + } + if (encryptedFileName.endsWith(".encrypted")) { + return encryptedFileName.substring(0, encryptedFileName.length() - 10); + } + return encryptedFileName; + } } diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgReferenceAddExe.java b/web-app/src/main/java/com/zcloud/safety/command/SgReferenceAddExe.java index 8943910..8a99d9d 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgReferenceAddExe.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgReferenceAddExe.java @@ -68,7 +68,6 @@ public class SgReferenceAddExe { throw new BizException("新增互学互鉴后未查询到数据"); } - // 新增时直接使用本次请求附件推送,避免依赖先落库再按外键反查附件。 sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.ADD, cmd.getFiles()); log.info("互学互鉴新增完成,本地主键:{},附件数量:{}", sgReferenceE.getId(), cmd.getFiles() == null ? 0 : cmd.getFiles().length); return true; @@ -159,7 +158,6 @@ public class SgReferenceAddExe { } } - private void fillCreateFields(SgReferenceE sgReferenceE, SgReferenceReceiveDTO reference) { if (StringUtils.isNotBlank(reference.getCreateBy())) { sgReferenceE.setCreateName(reference.getCreateBy().trim()); @@ -179,10 +177,14 @@ public class SgReferenceAddExe { if (file == null || file.isEmpty()) { continue; } - String fileName = Tools.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); - + String originalFilename = normalizeEncryptedFileName(file.getOriginalFilename()); + if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) { + throw new BizException("互学互鉴附件名称不合法"); + } + String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(file.getBytes(), fileName, "reference"); - imgFilesDOList.add(buildImgFile(referenceId, file.getOriginalFilename(), filePath)); + imgFilesDOList.add(buildImgFile(referenceId, originalFilename, filePath)); + log.info("互学互鉴本地附件名称标准化完成,原始名称:{},保存名称:{}", file.getOriginalFilename(), originalFilename); } saveImgFiles(referenceId, imgFilesDOList); } @@ -200,9 +202,14 @@ public class SgReferenceAddExe { } SM4 sm4 = SmUtil.sm4(decryptKey); byte[] decrypt = sm4.decrypt(file.getInputStream()); - String fileName = Tools.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); + String originalFilename = normalizeEncryptedFileName(file.getOriginalFilename()); + if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) { + throw new BizException("互学互鉴附件名称不合法"); + } + String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "reference"); - imgFilesDOList.add(buildImgFile(referenceId, file.getOriginalFilename(), filePath)); + imgFilesDOList.add(buildImgFile(referenceId, originalFilename, filePath)); + log.info("互学互鉴接收附件名称标准化完成,原始名称:{},保存名称:{}", file.getOriginalFilename(), originalFilename); } saveImgFiles(referenceId, imgFilesDOList); } @@ -224,4 +231,14 @@ public class SgReferenceAddExe { imgFilesRepository.saveBatch(imgFilesDOList); log.info("互学互鉴附件保存完成,本地主键:{},附件数量:{}", referenceId, imgFilesDOList.size()); } + + private String normalizeEncryptedFileName(String encryptedFileName) { + if (StringUtils.isBlank(encryptedFileName)) { + return encryptedFileName; + } + if (encryptedFileName.endsWith(".encrypted")) { + return encryptedFileName.substring(0, encryptedFileName.length() - 10); + } + return encryptedFileName; + } } diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgSuperviseAddExe.java b/web-app/src/main/java/com/zcloud/safety/command/SgSuperviseAddExe.java index 4a3a390..466d06d 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgSuperviseAddExe.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgSuperviseAddExe.java @@ -15,6 +15,7 @@ import com.zcloud.safety.persistence.dataobject.SgSuperviseDO; import com.zcloud.safety.persistence.repository.ImgFilesRepository; import com.zcloud.safety.persistence.repository.SgSuperviseRepository; import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; import org.apache.dubbo.config.annotation.DubboReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,7 +62,6 @@ public class SgSuperviseAddExe { public void addReceive(SgSuperviseAddDTO supervise, String key, MultipartFile[] files) { SgSuperviseE sgSuperviseE = new SgSuperviseE(); BeanUtils.copyProperties(supervise, sgSuperviseE); - // 数港督办id按现有约定直接映射到本地主键id。 sgSuperviseE.setId(supervise.getSuperviseId()); try { @@ -78,10 +78,18 @@ public class SgSuperviseAddExe { if (files != null && files.length > 0) { List imgFilesDOList = new ArrayList<>(); + byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key); for (MultipartFile multipartFile : files) { - SM4 sm4 = SmUtil.sm4(EncryptAndDecryptUtil.decryptSm2(key)); + if (multipartFile == null || multipartFile.isEmpty()) { + continue; + } + SM4 sm4 = SmUtil.sm4(decryptKey); byte[] decrypt = sm4.decrypt(multipartFile.getInputStream()); - String fileName = Tools.get32UUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")); + String originalFilename = normalizeEncryptedFileName(multipartFile.getOriginalFilename()); + if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) { + throw new BizException("督办附件名称不合法"); + } + String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "supervise"); @@ -89,11 +97,14 @@ public class SgSuperviseAddExe { imgFilesDO.setImgFilesId(Tools.get32UUID()); imgFilesDO.setFilePath(filePath); imgFilesDO.setForeignKey(sgSuperviseE.getSuperviseId()); - imgFilesDO.setFileName(multipartFile.getOriginalFilename()); + imgFilesDO.setFileName(originalFilename); imgFilesDO.setType(1); imgFilesDOList.add(imgFilesDO); + log.info("督办附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename); + } + if (!imgFilesDOList.isEmpty()) { + imgFilesRepository.saveBatch(imgFilesDOList); } - imgFilesRepository.saveBatch(imgFilesDOList); log.info("数港督办附件保存完成,督办id:{},图片数量:{}", supervise.getSuperviseId(), imgFilesDOList.size()); } @@ -109,4 +120,14 @@ public class SgSuperviseAddExe { throw new RuntimeException(e); } } + + private String normalizeEncryptedFileName(String encryptedFileName) { + if (StringUtils.isBlank(encryptedFileName)) { + return encryptedFileName; + } + if (encryptedFileName.endsWith(".encrypted")) { + return encryptedFileName.substring(0, encryptedFileName.length() - 10); + } + return encryptedFileName; + } }