fix(sg-accident): 修复安全事故时间格式及优化推送附件逻辑

main
zhaokai 2026-06-26 16:29:12 +08:00
parent 8f3715cb2c
commit 9efed45e3b
6 changed files with 89 additions and 22 deletions

View File

@ -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 {

View File

@ -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) {

View File

@ -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<ImgFilesDO> imgFilesDOList = imgFilesRepository.listByForeignKey(String.valueOf(sgReferenceDO.getId()));
Map<String, Object> requestData = buildRequestData(sgReferenceDO, operationType, imgFilesDOList);
List<ImgFilesDO> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> buildRequestData(SgReferenceDO sgReferenceDO, PushOperationTypeEnum operationType, List<ImgFilesDO> imgFilesDOList) {
private Map<String, Object> buildRequestData(SgReferenceDO sgReferenceDO, PushOperationTypeEnum operationType, String fileNames) {
Map<String, Object> 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<MultipartFile> 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<String> 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();

View File

@ -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;

View File

@ -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);

View File

@ -138,6 +138,7 @@ public class TokenUtils {
// 使用RestTemplate发送请求
RestTemplate restTemplate = new RestTemplate();
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(body, headers);
log.info("发送到第三方接口的url: " + url + path);
ResponseEntity<String> response = restTemplate.postForEntity(url + path, request, String.class);
log.info("发送到第三方接口的响应结果: {}", response.getBody());