From 56697c1a788c24a75bd89ab4042749a73e6bd1fa Mon Sep 17 00:00:00 2001 From: PengJ <2413927716@qq.com> Date: Thu, 27 Nov 2025 16:30:31 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90im=E6=B6=88=E6=81=AF=E3=80=91=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=9C=B0=E5=9D=80=E6=9B=BF=E6=8D=A2=EF=BC=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BF=AE=E5=A4=8D=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../im/common/TencentCloudImConstant.java | 3 + .../im/controller/TxImMessageConTroller.java | 14 ++++ .../com/renkang/im/service/ImService.java | 2 + .../im/service/impl/ImServiceImpl.java | 76 +++++++++++++++++++ 4 files changed, 95 insertions(+) diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/common/TencentCloudImConstant.java b/health-im/health-im-biz/src/main/java/com/renkang/im/common/TencentCloudImConstant.java index 63b48b3..2e5183f 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/common/TencentCloudImConstant.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/common/TencentCloudImConstant.java @@ -99,4 +99,7 @@ public interface TencentCloudImConstant { String AP_SHANGHAI_TC_RAW = "https://cos.ap-shanghai.tencentcos.cn"; String AP_SHANGHAI_TC_RP = "http://101.201.149.156:8609/tc"; + String CN_RICH_ROW = "https://1600084494-cn.rich.my-imcloud.com"; + String CN_RICH_RP = "http://101.201.149.156:8610/imdata"; + } \ No newline at end of file diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TxImMessageConTroller.java b/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TxImMessageConTroller.java index a424c9e..b0e5073 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TxImMessageConTroller.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TxImMessageConTroller.java @@ -46,9 +46,23 @@ public class TxImMessageConTroller { } @GetMapping("/syncImMessage") + @Operation(summary = "同步IM消息") public Result test(String groupId) { imService.syncGroupHistory(groupId); return Result.ok(); } + /** + * 同步IM消息(数据修复) + * + * @param groupIds(修复消息的群组id(多个用,隔开,不传则修复所有数据)) + * @return + */ + @GetMapping("/syncImMessageRepairData") + @Operation(summary = "同步IM消息(数据修复)") + public Result syncImMessageRepairData(String groupIds) { + imService.syncImMessageRepairData(groupIds); + return Result.ok(); + } + } diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/service/ImService.java b/health-im/health-im-biz/src/main/java/com/renkang/im/service/ImService.java index d1edb1a..c3a678a 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/service/ImService.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/service/ImService.java @@ -46,4 +46,6 @@ public interface ImService { Page listGroupSyncRecord(GroupSyncFilter filter); + void syncImMessageRepairData(String groupIds); + } diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/service/impl/ImServiceImpl.java b/health-im/health-im-biz/src/main/java/com/renkang/im/service/impl/ImServiceImpl.java index 8123751..0657ba6 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/service/impl/ImServiceImpl.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/service/impl/ImServiceImpl.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.renkang.consultation.api.ConSessionHelloApi; @@ -38,6 +39,7 @@ import java.net.URISyntaxException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; +import java.util.stream.Collectors; import static com.renkang.im.common.TencentCloudImConstant.*; @@ -347,6 +349,9 @@ public class ImServiceImpl implements ImService { } private String handleFile(String url) { + if (!url.startsWith("http")) { + return url; + } byte[] fileBytes; String fileName = UUID.randomUUID().toString(); try { @@ -386,6 +391,9 @@ public class ImServiceImpl implements ImService { if (url.startsWith(AP_SHANGHAI_TC_RAW)) { return url.replace(AP_SHANGHAI_TC_RAW, AP_SHANGHAI_TC_RP); } + if (url.startsWith(CN_RICH_ROW)) { + return url.replace(CN_RICH_ROW, CN_RICH_RP); + } return url; } @@ -466,4 +474,72 @@ public class ImServiceImpl implements ImService { LambdaQueryWrapper wrapper = WrapperUtils.initLambdaWrapper(filter); return imGroupSyncRecordMapper.selectPage(filter.getPage(), wrapper); } + + /** + * description: 修复IM消息数据 + * + * @date: 2025/11/27 16:27 + * @Param groupIds: [java.lang.String] + */ + @Override + public void syncImMessageRepairData(String groupIds) { + List groupIdArray = new ArrayList<>(); + if (StrUtil.isNotBlank(groupIds)) { + groupIdArray = Arrays.stream(groupIds.split(",")).collect(Collectors.toList()); + } + List imMsgRecordAlls = imMsgRecordAllMapper.selectList(new LambdaQueryWrapper() + .in(!groupIdArray.isEmpty(), ImMsgRecordAll::getGroupid, groupIdArray) + ); + asyncTaskExecutor.submit(() -> { + int index = 0; + for (ImMsgRecordAll imMsgRecordAll : imMsgRecordAlls) { + index++; + try { + String contentType = imMsgRecordAll.getContenttype(); + String content = imMsgRecordAll.getMsgcontent(); + if (StrUtil.isEmpty(contentType) || StrUtil.isEmpty(content)) { + continue; + } + JSONObject jsonObject = JSON.parseObject(content); + JSONArray msgBody = jsonObject.getJSONArray(MSG_BODY); + boolean isRepair = false; + for (int i = 0; i < msgBody.size(); i++) { + JSONObject jsonObject1 = msgBody.getJSONObject(i); + JSONObject msgContent = jsonObject1.getJSONObject(MSG_CONTENT); + switch (contentType) { + case TIM_IMAGE_ELEM: + handleImageElem(msgContent); + isRepair = true; + break; + case TIM_VIDEO_FILE_ELEM: + handleVideoFileElem(msgContent); + isRepair = true; + break; + case TIM_FILE_ELEM: + handleFileElem(msgContent); + isRepair = true; + break; + case TIM_SOUND_ELEM: + handleSoundElem(msgContent); + isRepair = true; + break; + default: + } + } + if (isRepair) { + imMsgRecordAllMapper.update(new LambdaUpdateWrapper() + .eq(ImMsgRecordAll::getId, imMsgRecordAll.getId()) + .set(ImMsgRecordAll::getMsgcontent, jsonObject.toJSONString()) + ); + log.info("修复数据(数据id:{})成功:{}", imMsgRecordAll.getId(), jsonObject.toJSONString()); + } + } catch (Exception e) { + log.error("修复数据(数据id:{})失败:{}", imMsgRecordAll.getId(), e.getMessage()); + } finally { + //修复进度 + log.info("======修复进度:{}/{}", index, imMsgRecordAlls.size()); + } + } + }); + } }