diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgAccidentAddExe.java b/web-app/src/main/java/com/zcloud/safety/command/SgAccidentAddExe.java index dadefab..1d00a6f 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgAccidentAddExe.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgAccidentAddExe.java @@ -43,6 +43,10 @@ public class SgAccidentAddExe { @Transactional(rollbackFor = Exception.class) public boolean execute(SgAccidentAddCmd cmd) { SgAccidentE sgAccidentE = new SgAccidentE(); + //如果cmd.getaccidentTime 是年月日的话,需要加上时分秒 + if (cmd.getAccidentTime().length() == 10) { + cmd.setAccidentTime(cmd.getAccidentTime() + " 00:00:00"); + } BeanUtils.copyProperties(cmd, sgAccidentE); try { 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 eae9372..8943910 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,8 @@ public class SgReferenceAddExe { throw new BizException("新增互学互鉴后未查询到数据"); } - sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.ADD); + // 新增时直接使用本次请求附件推送,避免依赖先落库再按外键反查附件。 + sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.ADD, cmd.getFiles()); log.info("互学互鉴新增完成,本地主键:{},附件数量:{}", sgReferenceE.getId(), cmd.getFiles() == null ? 0 : cmd.getFiles().length); return true; } catch (BizException e) { diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgReferencePushSupport.java b/web-app/src/main/java/com/zcloud/safety/command/SgReferencePushSupport.java index 0aa056d..8bc4693 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgReferencePushSupport.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgReferencePushSupport.java @@ -47,7 +47,7 @@ public class SgReferencePushSupport { private final ImgFilesRepository imgFilesRepository; /** - * 互学互鉴推送统一从附件表读取文件信息,避免业务表继续维护冗余附件字段。 + * 默认从附件表回读附件后推送,适用于需要基于已落库附件推送的场景。 */ public void pushReference(SgReferenceDO sgReferenceDO, PushOperationTypeEnum operationType) { if (sgReferenceDO == null || sgReferenceDO.getId() == null) { @@ -58,22 +58,10 @@ public class SgReferencePushSupport { } try { - String token = resolveToken(); - List imgFilesDOList = imgFilesRepository.listByForeignKey(String.valueOf(sgReferenceDO.getId())); - Map requestData = buildRequestData(sgReferenceDO, operationType, imgFilesDOList); + List imgFilesDOList = imgFilesRepository.listByForeignKey(sgReferenceDO.getReferenceId()); MultipartFile[] pushFiles = buildPushFiles(imgFilesDOList); - log.info("开始推送互学互鉴到数港,操作类型:{}-{},来源:{}-{},本地主键:{},附件数量:{},请求数据:{}", - operationType.getCode(), operationType.getValue(), DEFAULT_SOURCE.getCode(), DEFAULT_SOURCE.getValue(), - sgReferenceDO.getId(), pushFiles.length, requestData); - if (sgProperties.getEnabled() == null || !sgProperties.getEnabled()) { - log.info("模拟真实推送互学互鉴到数港,操作类型:{}-{},本地主键:{},url:{},附件数量:{}", - operationType.getCode(), operationType.getValue(), sgReferenceDO.getId(), sgProperties.getReferenceUrl(), pushFiles.length); - } else { - TokenUtils.sendDataToThirdParty(sgProperties.getReferenceUrl(), requestData, token, pushFiles); - } -// TokenUtils.sendDataToThirdPartyTwo(sgProperties.getReferenceUrl(), requestData, token, pushFiles); - log.info("推送互学互鉴到数港成功,操作类型:{}-{},本地主键:{}", - operationType.getCode(), operationType.getValue(), sgReferenceDO.getId()); + Map requestData = buildRequestData(sgReferenceDO, operationType, resolveFileNames(imgFilesDOList)); + doPush(sgReferenceDO, operationType, requestData, pushFiles); } catch (BizException e) { throw e; } catch (Exception e) { @@ -83,6 +71,48 @@ public class SgReferencePushSupport { } } + /** + * 直接使用本次请求收到的附件进行推送。 + * 适用于新增,或修改时前端明确上传了新附件的场景。 + * 当 files 为空时,只推送主数据,不给三方传附件。 + */ + public void pushReference(SgReferenceDO sgReferenceDO, PushOperationTypeEnum operationType, MultipartFile[] files) { + if (sgReferenceDO == null || sgReferenceDO.getId() == null) { + throw new BizException("互学互鉴数据不存在,无法推送数港"); + } + if (operationType == null) { + throw new BizException("互学互鉴推送操作类型不能为空"); + } + + try { + MultipartFile[] pushFiles = sanitizeFiles(files); + Map requestData = buildRequestData(sgReferenceDO, operationType, resolveFileNames(pushFiles)); + doPush(sgReferenceDO, operationType, requestData, pushFiles); + } catch (BizException e) { + throw e; + } catch (Exception e) { + log.error("推送互学互鉴到数港失败,操作类型:{}-{},本地主键:{}", + operationType.getCode(), operationType.getValue(), sgReferenceDO.getId(), e); + throw new BizException("推送数港失败"); + } + } + + private void doPush(SgReferenceDO sgReferenceDO, PushOperationTypeEnum operationType, + Map requestData, MultipartFile[] pushFiles) throws Exception { + String token = resolveToken(); + log.info("开始推送互学互鉴到数港,操作类型:{}-{},来源:{}-{},本地主键:{},附件数量:{},请求数据:{}", + operationType.getCode(), operationType.getValue(), DEFAULT_SOURCE.getCode(), DEFAULT_SOURCE.getValue(), + sgReferenceDO.getId(), pushFiles.length, requestData); + if (sgProperties.getEnabled() == null || !sgProperties.getEnabled()) { + log.info("模拟真实推送互学互鉴到数港,操作类型:{}-{},本地主键:{},url:{},附件数量:{}", + operationType.getCode(), operationType.getValue(), sgReferenceDO.getId(), sgProperties.getReferenceUrl(), pushFiles.length); + } else { + TokenUtils.sendDataToThirdParty(sgProperties.getReferenceUrl(), requestData, token, pushFiles); + } + log.info("推送互学互鉴到数港成功,操作类型:{}-{},本地主键:{}", + operationType.getCode(), operationType.getValue(), sgReferenceDO.getId()); + } + private String resolveToken() throws Exception { String token; if (sgProperties.getEnabled() == null || !sgProperties.getEnabled()) { @@ -96,13 +126,13 @@ public class SgReferencePushSupport { return token; } - private Map buildRequestData(SgReferenceDO sgReferenceDO, PushOperationTypeEnum operationType, List imgFilesDOList) { + private Map buildRequestData(SgReferenceDO sgReferenceDO, PushOperationTypeEnum operationType, String fileNames) { Map requestData = new HashMap<>(); requestData.put("operationType", operationType.getCode()); requestData.put("accidentId", sgReferenceDO.getId()); requestData.put("title", defaultString(sgReferenceDO.getTitle())); requestData.put("source", DEFAULT_SOURCE.getCode()); - requestData.put("fileName", resolveFileNames(imgFilesDOList)); + requestData.put("fileName", fileNames); requestData.put("createBy", resolveCreateBy(sgReferenceDO)); requestData.put("createTime", formatDateTime(sgReferenceDO.getCreateTime())); return requestData; @@ -124,6 +154,19 @@ public class SgReferencePushSupport { return multipartFileList.toArray(new MultipartFile[0]); } + private MultipartFile[] sanitizeFiles(MultipartFile[] files) { + if (files == null || files.length == 0) { + return new MultipartFile[0]; + } + List result = new ArrayList<>(); + for (MultipartFile file : files) { + if (file != null && !file.isEmpty()) { + result.add(file); + } + } + return result.toArray(new MultipartFile[0]); + } + private byte[] readFileBytes(String filePath) throws IOException { try { Path localPath = Paths.get(filePath); @@ -152,6 +195,19 @@ public class SgReferencePushSupport { .collect(Collectors.joining(",")); } + private String resolveFileNames(MultipartFile[] files) { + if (files == null || files.length == 0) { + return ""; + } + List fileNames = new ArrayList<>(); + for (MultipartFile file : files) { + if (file != null && !file.isEmpty() && StringUtils.hasText(file.getOriginalFilename())) { + fileNames.add(file.getOriginalFilename()); + } + } + return String.join(",", fileNames); + } + private String resolveCreateBy(SgReferenceDO sgReferenceDO) { if (StringUtils.hasText(sgReferenceDO.getCreateName())) { return sgReferenceDO.getCreateName(); diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgReferenceRemoveExe.java b/web-app/src/main/java/com/zcloud/safety/command/SgReferenceRemoveExe.java index f32f203..754702a 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgReferenceRemoveExe.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgReferenceRemoveExe.java @@ -36,8 +36,8 @@ public class SgReferenceRemoveExe { throw new BizException("删除失败"); } - // 删除推送也要带上当前附件,因此先推送,再删除附件表数据。 - sgReferencePushSupport.pushReference(sgReferenceDO, PushOperationTypeEnum.DELETE); + // 删除只推送业务数据,不再给三方传附件。 + sgReferencePushSupport.pushReference(sgReferenceDO, PushOperationTypeEnum.DELETE, null); imgFilesRepository.deletedImgFilesByForeignId(String.valueOf(id)); log.info("互学互鉴删除完成,本地主键:{}", id); return true; diff --git a/web-app/src/main/java/com/zcloud/safety/command/SgReferenceUpdateExe.java b/web-app/src/main/java/com/zcloud/safety/command/SgReferenceUpdateExe.java index 300824a..a93f83c 100644 --- a/web-app/src/main/java/com/zcloud/safety/command/SgReferenceUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/safety/command/SgReferenceUpdateExe.java @@ -62,7 +62,12 @@ public class SgReferenceUpdateExe { throw new BizException("修改后未查询到互学互鉴数据"); } - sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.UPDATE); + // 修改时如果前端没传新附件,则不改附件,也不给三方传附件;有新附件时直接用本次附件推送。 + if (cmd.getFiles() != null && cmd.getFiles().length > 0) { + sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.UPDATE, cmd.getFiles()); + } else { + sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.UPDATE, null); + } log.info("互学互鉴修改完成,本地主键:{},附件数量:{}", cmd.getId(), cmd.getFiles() == null ? 0 : cmd.getFiles().length); } catch (BizException e) { log.error("修改互学互鉴失败,主键:{},原因:{}", cmd.getId(), e.getMessage(), e); diff --git a/web-domain/src/main/java/com/zcloud/safety/domain/utils/TokenUtils.java b/web-domain/src/main/java/com/zcloud/safety/domain/utils/TokenUtils.java index f895b40..6898599 100644 --- a/web-domain/src/main/java/com/zcloud/safety/domain/utils/TokenUtils.java +++ b/web-domain/src/main/java/com/zcloud/safety/domain/utils/TokenUtils.java @@ -138,6 +138,7 @@ public class TokenUtils { // 使用RestTemplate发送请求 RestTemplate restTemplate = new RestTemplate(); HttpEntity> request = new HttpEntity<>(body, headers); + log.info("发送到第三方接口的url: " + url + path); ResponseEntity response = restTemplate.postForEntity(url + path, request, String.class); log.info("发送到第三方接口的响应结果: {}", response.getBody());