【应急单】定时解散群聊

This commit is contained in:
2026-01-08 16:59:01 +08:00
parent 464abc6521
commit a00d361f6b
7 changed files with 116 additions and 9 deletions
@@ -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`;
@@ -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
*/
@@ -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<String> destroyGroup() {
try {
int count = 0;
log.info("========开始解散群组========");
DateTime dateTime = DateUtil.offsetMonth(DateUtil.date(), -1);
List<Order> orders = orderMapper.selectList(new LambdaQueryWrapper<Order>()
.eq(Order::getOrderStatus, 5)
.eq(Order::getInitiatorType, "1")
.eq(Order::getDestroyGroup, 0)
.lt(Order::getCreateTime, dateTime)
);
for (Order order : orders) {
Result<ImBaseResult> 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<Order>()
.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;
}
}
}
@@ -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<AddGroupMemberVO> addGroupMember(@RequestBody @Validated AddGroupMemberDTO dto);
@GetMapping("/wnapp/destroyGroup")
Result<ImBaseResult> destroyGroup(@RequestParam("groupId") String groupId);
}
@@ -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<String> failAccounts;
}
@@ -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<ImBaseResult> destroyGroup(@RequestParam("groupId") String groupId) {
return Result.OK(tencentCloudImUtil.destroyGroup(groupId));
}
private String encodeChineseCharacters(String str) {
return str.codePoints()
.mapToObj(c -> {
@@ -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;
}
}
/**
* 拉取群聊历史消息