diff --git a/src/main/java/org/shop/crop/CropController.java b/src/main/java/org/shop/crop/CropController.java index 730a24e..1eb9039 100644 --- a/src/main/java/org/shop/crop/CropController.java +++ b/src/main/java/org/shop/crop/CropController.java @@ -56,7 +56,7 @@ public class CropController { @GetMapping("/crop/chatData") - public List chatData(Long startSeq,String corpId) throws IOException { + public List chatData(Long startSeq, String corpId) throws IOException { long limit = 1000; long slice = Finance.NewSlice(); Long sdk = sdkManager.initSdk(corpId, "mEizahrSF6axdfWtSK_f73a3j6-sV02hhyGG7ogmTpM"); @@ -69,7 +69,7 @@ public class CropController { } String contentResult = Finance.GetContentFromSlice(slice); log.info("内容字符串" + contentResult); - return decodeChatData(contentResult,startSeq,sdk,corpId); + return decodeChatData(contentResult, startSeq, sdk, corpId); } /** @@ -77,7 +77,7 @@ public class CropController { * * @param contentResult 拉取到的JSON原文 */ - public List decodeChatData(String contentResult,Long startSeq,Long sdk,String corpId) throws IOException { + public List decodeChatData(String contentResult, Long startSeq, Long sdk, String corpId) throws IOException { // 1.基础信息解析 List messageList = new ArrayList<>(); MessagePullResponse messagePullResponse = JSON.parseObject(contentResult, MessagePullResponse.class); @@ -92,7 +92,7 @@ public class CropController { } String privateKey = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8); // 3. 提取所有 seq - log.info("chatdataList={} 加密数据",chatdataList); + log.info("chatdataList={} 加密数据", chatdataList); // 4. 查询数据库中已存在的 seq // 直接在业务代码中(或封装到 service) List existingSeqs = cropMessageService.lambdaQuery() @@ -103,9 +103,9 @@ public class CropController { .map(CropMessage::getSeq) .collect(Collectors.toList()); Set existingSeqSet = new HashSet<>(existingSeqs); - log.info("existingSeqSet={} 加密数据",existingSeqSet); + log.info("existingSeqSet={} 加密数据", existingSeqSet); - CropConfig config=cropConfigMapper.selectById(1); + CropConfig config = cropConfigMapper.selectById(1); Long maxSeq = config.getLastSeq(); // 改为: List mediaFileInfos = new ArrayList<>(); @@ -117,7 +117,7 @@ public class CropController { } try { // 解密ChatData数据 - String plainTextJson = decrypt(chatData, privateKey,sdk); + String plainTextJson = decrypt(chatData, privateKey, sdk); BaseMessageDto messageDto = JSON.parseObject(plainTextJson, BaseMessageDto.class); // 转换dto数据到entity CropMessage message = messageDto.convertToMessage(); @@ -140,8 +140,9 @@ public class CropController { } - return saveData(messageList,maxSeq,config,mediaFileInfos,sdk,corpId); + return saveData(messageList, maxSeq, config, mediaFileInfos, sdk, corpId); } + /** * 异步下载待处理的媒体文件 * @@ -149,7 +150,7 @@ public class CropController { */ @Transactional public List saveData(List messageList, Long maxSeq, CropConfig config - , ListmediaFileInfos,Long sdk,String corpId) { + , List mediaFileInfos, Long sdk, String corpId) { // 4.保存消息和失败任务 cropMessageService.saveBatch(messageList); @@ -164,6 +165,7 @@ public class CropController { mf.setSeq(info.getSeq()); mf.setCropId(corpId); mf.setStatus(0); + mf.setExt(info.getExt()); return mf; }).collect(Collectors.toList()); @@ -172,18 +174,20 @@ public class CropController { // ✅ 异步触发下载任务(可以轮询数据库) CompletableFuture.runAsync(() -> { - downloadPendingFiles(mediaFiles,sdk); // 也可以不传参,改为查数据库 + downloadPendingFiles(mediaFiles, sdk); // 也可以不传参,改为查数据库 }); } return messageList; } + /** * 异步下载待处理的媒体文件 */ - private void downloadPendingFiles(List mediaFiles,Long sdk) { + private void downloadPendingFiles(List mediaFiles, Long sdk) { for (CropFile mf : mediaFiles) { try { - String url = downFile(mf.getSdkFileId(), mf.getMsgType(),sdk); + String msgType = getSuffixByMsgType(mf); + String url = downFile(mf.getSdkFileId(), msgType, sdk); if (url != null && !url.isEmpty()) { mf.setUrl(url); mf.setStatus(1); @@ -201,6 +205,7 @@ public class CropController { } } } + /** * 提取所有需要下载的媒体文件信息 */ @@ -230,10 +235,17 @@ public class CropController { if (msg.containsKey(msgType)) { String sdkFileId = msg.getJSONObject(msgType).getString("sdkfileid"); if (sdkFileId != null && !sdkFileId.trim().isEmpty()) { - CropFile cropFile = new CropFile(); // 注意:你写成了 CropConfig,应为 CropFile + CropFile cropFile = new CropFile(); cropFile.setMsgType(msgType); cropFile.setSeq(seq); cropFile.setSdkFileId(sdkFileId); + cropFile.setSeq(seq); + cropFile.setExt(msgType); + if (msgType.equals("file")) { + String fileext = msg.getJSONObject(msgType).getString("fileext"); + cropFile.setExt(fileext); + } + result.add(cropFile); } } @@ -246,9 +258,11 @@ public class CropController { } @GetMapping("/crop/downFile") - public String downFile(String sdkField,String msgType,Long sdk) throws IOException { - File tempFile = File.createTempFile(GlobalConstants.DOWNLOAD_TEMP_FILE_NAME_PREFIX , - getSuffixByMsgType(msgType), mediaContext.getTempMergeFileDir()); + public String downFile(String sdkField, String msgType, Long sdk) throws IOException { + File tempFile = File.createTempFile(GlobalConstants.DOWNLOAD_TEMP_FILE_NAME_PREFIX, + msgType, mediaContext.getTempMergeFileDir()); + sdk = sdkManager.initSdk("ww64f47cd0afc456a5", "mEizahrSF6axdfWtSK_f73a3j6-sV02hhyGG7ogmTpM"); + String indexbuf = null; // 初始化 indexbuf try (FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) { while (true) { @@ -273,8 +287,8 @@ public class CropController { return ""; } - public String getSuffixByMsgType(String msgType) { - switch (msgType) { + public String getSuffixByMsgType(CropFile cropFile) { + switch (cropFile.getMsgType()) { case "image": return ".jpg"; case "voice": @@ -282,7 +296,7 @@ public class CropController { case "video": return ".mp4"; case "file": - return ".bin"; + return "." + cropFile.getExt(); // 取真实后缀 default: return ".bin"; } @@ -296,7 +310,7 @@ public class CropController { * @param privateKeyStr 私钥字符串 * @return 解密后的原文 */ - private String decrypt(ChatData chatData, String privateKeyStr,Long sdk) throws Exception { + private String decrypt(ChatData chatData, String privateKeyStr, Long sdk) throws Exception { // 1.解密EncryptRandomKey String randomKey = EncodeUtils.decryptRandomKey(chatData.getEncryptRandomKey(), privateKeyStr); // 2.调用SDK方法解密密文数据 diff --git a/src/main/java/org/shop/crop/dao/CropFile.java b/src/main/java/org/shop/crop/dao/CropFile.java index 0601b14..fe90cee 100644 --- a/src/main/java/org/shop/crop/dao/CropFile.java +++ b/src/main/java/org/shop/crop/dao/CropFile.java @@ -23,7 +23,7 @@ public class CropFile { private String url; // 下载后上传 OSS 的地址 - private String fileName; // 可选:原始文件名(后续可补充) + private String ext; // 可选:原始文件名(后续可补充) private Integer status = 0; // 0 pending, 1 success, 2 failed