From a00d361f6b0bc421711194ae2e7a9d9d59aedf04 Mon Sep 17 00:00:00 2001 From: PengJ <2413927716@qq.com> Date: Thu, 8 Jan 2026 16:59:01 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=BA=94=E6=80=A5=E5=8D=95=E3=80=91?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E8=A7=A3=E6=95=A3=E7=BE=A4=E8=81=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/updatesql/202618-应急单表新增字段.sql | 2 + .../com/renkang/emergency/entity/Order.java | 5 ++ .../emergency/task/EmergencyOrderJob.java | 72 +++++++++++++++++++ .../java/com/renkang/im/api/IMHelloApi.java | 4 ++ .../vo/{ImResult.java => ImBaseResult.java} | 10 +-- .../renkang/im/controller/TXController.java | 7 ++ .../renkang/im/util/TencentCloudImUtil.java | 25 +++++++ 7 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 db/updatesql/202618-应急单表新增字段.sql create mode 100644 health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/task/EmergencyOrderJob.java rename health-im/health-im-api/src/main/java/com/renkang/im/vo/{ImResult.java => ImBaseResult.java} (78%) diff --git a/db/updatesql/202618-应急单表新增字段.sql b/db/updatesql/202618-应急单表新增字段.sql new file mode 100644 index 0000000..747381a --- /dev/null +++ b/db/updatesql/202618-应急单表新增字段.sql @@ -0,0 +1,2 @@ +ALTER TABLE `emergency_order` +ADD COLUMN `destroy_group` tinyint(1) NULL DEFAULT 0 COMMENT '是否解散群聊(0:否 1:是)' AFTER `major_user_two_avatar`; \ No newline at end of file diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/Order.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/Order.java index 066a962..a56c3fc 100644 --- a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/Order.java +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/Order.java @@ -88,6 +88,11 @@ public class Order implements Serializable { @Excel(name = "是否正在会话(0:否 1:是)", width = 15) @Schema(title = "是否正在会话(0:否 1:是)") private java.lang.Boolean sessionNow; + /** + * 是否解散群聊(0:否 1:是) + */ + @Schema(title = "是否解散群聊(0:否 1:是)") + private java.lang.Boolean destroyGroup; /** * 发起人id */ diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/task/EmergencyOrderJob.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/task/EmergencyOrderJob.java new file mode 100644 index 0000000..31907cb --- /dev/null +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/task/EmergencyOrderJob.java @@ -0,0 +1,72 @@ +package com.renkang.emergency.task; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.renkang.emergency.entity.Order; +import com.renkang.emergency.mapper.OrderMapper; +import com.renkang.im.api.IMHelloApi; +import com.renkang.im.vo.ImBaseResult; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author pj + * @version 1.0 + * @description: 应急单任务 + * @date 2026/1/8 14:21 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class EmergencyOrderJob { + + private final OrderMapper orderMapper; + private final IMHelloApi imHelloApi; + + /** + * @author: pj + * @description: 解散群组(解散一个月之前已结束的应急单类型是应急就医的群组) + * @date 2026/1/8 14:22 + */ + @XxlJob(value = "destroyGroupJob") + public ReturnT destroyGroup() { + try { + int count = 0; + log.info("========开始解散群组========"); + DateTime dateTime = DateUtil.offsetMonth(DateUtil.date(), -1); + List orders = orderMapper.selectList(new LambdaQueryWrapper() + .eq(Order::getOrderStatus, 5) + .eq(Order::getInitiatorType, "1") + .eq(Order::getDestroyGroup, 0) + .lt(Order::getCreateTime, dateTime) + ); + for (Order order : orders) { + Result imResultResult = imHelloApi.destroyGroup(order.getSessionId()); + if (imResultResult.getCode() != 200) { + log.error("解散群组失败:{}", order.getSessionId()); + } else if (imResultResult.getResult().getActionStatus().equals("OK")) { + log.error("解散群组成功:{}", order.getSessionId()); + orderMapper.update(null, new LambdaUpdateWrapper() + .eq(Order::getId, order.getId()) + .set(Order::getDestroyGroup, 1) + ); + count++; + } else { + log.error("解散群组失败:{}", order.getSessionId()); + } + } + log.info("========结束解散群组,成功解散'" + count + "'个群组========"); + return ReturnT.SUCCESS; + } catch (Exception e) { + return ReturnT.FAIL; + } + } +} diff --git a/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java b/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java index e757325..d32d610 100644 --- a/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java +++ b/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java @@ -5,6 +5,7 @@ import com.renkang.im.api.fallback.IMHelloFallback; import com.renkang.im.dto.AddGroupMemberDTO; import com.renkang.im.entity.*; import com.renkang.im.vo.AddGroupMemberVO; +import com.renkang.im.vo.ImBaseResult; import org.jeecg.common.api.vo.Result; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.validation.annotation.Validated; @@ -76,4 +77,7 @@ public interface IMHelloApi { @PostMapping(value = "/wnapp/addGroupMember") Result addGroupMember(@RequestBody @Validated AddGroupMemberDTO dto); + @GetMapping("/wnapp/destroyGroup") + Result destroyGroup(@RequestParam("groupId") String groupId); + } diff --git a/health-im/health-im-api/src/main/java/com/renkang/im/vo/ImResult.java b/health-im/health-im-api/src/main/java/com/renkang/im/vo/ImBaseResult.java similarity index 78% rename from health-im/health-im-api/src/main/java/com/renkang/im/vo/ImResult.java rename to health-im/health-im-api/src/main/java/com/renkang/im/vo/ImBaseResult.java index 17806bc..f3a16c2 100644 --- a/health-im/health-im-api/src/main/java/com/renkang/im/vo/ImResult.java +++ b/health-im/health-im-api/src/main/java/com/renkang/im/vo/ImBaseResult.java @@ -4,8 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - /** * @author PengJ * @description: IM返回VO @@ -13,7 +11,7 @@ import java.util.List; */ @NoArgsConstructor @Data -public class ImResult { +public class ImBaseResult { /** * 请求处理的结果 @@ -36,10 +34,4 @@ public class ImResult { */ @JsonProperty("ErrorInfo") private String errorInfo; - - /** - * 导入失败的账号列表 - */ - @JsonProperty("FailAccounts") - private List failAccounts; } diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java b/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java index 705b80f..f0ad59c 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java @@ -12,6 +12,7 @@ import com.renkang.im.util.IdWorker; import com.renkang.im.util.TencentCloudImUtil; import com.renkang.im.util.UniqId; import com.renkang.im.vo.AddGroupMemberVO; +import com.renkang.im.vo.ImBaseResult; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.shiro.SecurityUtils; @@ -397,6 +398,12 @@ public class TXController { return Result.OK(tencentCloudImUtil.addGroupMember(dto)); } + @Operation(summary = "解散群组", description = "解散群组") + @GetMapping("/destroyGroup") + public Result destroyGroup(@RequestParam("groupId") String groupId) { + return Result.OK(tencentCloudImUtil.destroyGroup(groupId)); + } + private String encodeChineseCharacters(String str) { return str.codePoints() .mapToObj(c -> { diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java b/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java index 1ea1576..3df3070 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java @@ -13,6 +13,7 @@ import com.renkang.im.common.TencentCloudImConstant; import com.renkang.im.dto.AddGroupMemberDTO; import com.renkang.im.entity.*; import com.renkang.im.vo.AddGroupMemberVO; +import com.renkang.im.vo.ImBaseResult; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; @@ -479,6 +480,30 @@ public class TencentCloudImUtil { return addGroupMemberVO; } + /** + * 解散群组 + * + * @param groupId + * @return + */ + public ImBaseResult destroyGroup(String groupId) { + try { + Integer random = RandomUtils.nextInt(0, 999999999); + String httpsUrl = getHttpsUrl(TencentCloudImApiConstant.GroupManage.DESTROY_GROUP, random); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("GroupId", groupId); + log.info("腾讯云im【解散群组】,请求参数:{}", jsonObject); + String result = HttpUtil.doPost(httpsUrl, jsonObject); + log.info("腾讯云im【解散群组】,返回结果:{}", result); + return JSONObject.toJavaObject(JSONObject.parseObject(result), ImBaseResult.class); + } catch (Exception e) { + log.error("【解散群组】异常:{}", e.getMessage()); + ImBaseResult result = new ImBaseResult(); + result.setActionStatus("FAIL"); + return result; + } + } + /** * 拉取群聊历史消息