feat(emergency): push/send 接入IM消息推送,SendIm 新增 businessId 字段

- SendIm 新增 businessId 字段(String),用于区分业务来源,不影响已有调用
- FirstAidPushServiceImpl.send() 步骤5从日志占位改为实际发送IM群消息
- businessId 固定为 "article",前端可据此识别宣教推送消息
- 工单无 sessionId 时跳过IM发送并 log.warn 告警

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-07 09:48:37 +08:00
co-authored by Claude
parent 945c0b46d7
commit f10221e92c
2 changed files with 34 additions and 7 deletions
@@ -20,4 +20,8 @@ public class SendIm {
* 类型 1: 应急单 * 类型 1: 应急单
*/ */
private Integer type; private Integer type;
/**
* 业务标识,用于区分不同业务来源(例:"article"=宣教推送)
*/
private String businessId;
} }
@@ -2,9 +2,11 @@ package com.renkang.emergency.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.renkang.emergency.bean.response.SendIm;
import com.renkang.emergency.constant.FirstAidConstants; import com.renkang.emergency.constant.FirstAidConstants;
import com.renkang.emergency.dto.PushBatchSendDTO; import com.renkang.emergency.dto.PushBatchSendDTO;
import com.renkang.emergency.dto.PushFilterDTO; import com.renkang.emergency.dto.PushFilterDTO;
@@ -17,6 +19,8 @@ import com.renkang.emergency.mapper.FirstAidResourceMapper;
import com.renkang.emergency.mapper.FirstAidResourceCategoryMapper; import com.renkang.emergency.mapper.FirstAidResourceCategoryMapper;
import com.renkang.emergency.mapper.OrderMapper; import com.renkang.emergency.mapper.OrderMapper;
import com.renkang.emergency.service.IFirstAidPushService; import com.renkang.emergency.service.IFirstAidPushService;
import com.renkang.im.api.IMHelloApi;
import com.renkang.im.entity.ImGroupMsgTextReqDO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.LoginUser;
@@ -55,6 +59,9 @@ public class FirstAidPushServiceImpl implements IFirstAidPushService {
@Autowired @Autowired
private FirstAidPushServiceImpl self; private FirstAidPushServiceImpl self;
@Autowired
private IMHelloApi imHelloApi;
@Override @Override
public IPage<FirstAidResource> queryResourceList(String orderId, PushFilterDTO filter, Page<FirstAidResource> page) { public IPage<FirstAidResource> queryResourceList(String orderId, PushFilterDTO filter, Page<FirstAidResource> page) {
LambdaQueryWrapper<FirstAidResource> wrapper = buildFilterWrapper(filter); LambdaQueryWrapper<FirstAidResource> wrapper = buildFilterWrapper(filter);
@@ -108,10 +115,11 @@ public class FirstAidPushServiceImpl implements IFirstAidPushService {
throw new RuntimeException("该资源已推送,请勿重复操作"); throw new RuntimeException("该资源已推送,请勿重复操作");
} }
// 3. 获取推送目标 // 3. 获取工单信息
String targetUserId = null; String targetUserId = null;
Order order = null;
if (StrUtil.isNotBlank(orderId)) { if (StrUtil.isNotBlank(orderId)) {
Order order = orderMapper.selectById(orderId); order = orderMapper.selectById(orderId);
if (order != null) { if (order != null) {
targetUserId = order.getSalvageUserId(); targetUserId = order.getSalvageUserId();
} }
@@ -131,11 +139,26 @@ public class FirstAidPushServiceImpl implements IFirstAidPushService {
record.setPushTime(new Date()); record.setPushTime(new Date());
pushRecordMapper.insert(record); pushRecordMapper.insert(record);
// 5. 推送通知(预留,当前记录日志) // 5. 构建推送IM消息并发送
log.info("急救宣教推送: resourceId={}, title={}, orderId={}, targetUserId={}, pushById={}, pushByName={}", if (order != null && StrUtil.isNotBlank(order.getSessionId())) {
resourceId, resource.getTitle(), orderId, targetUserId, SendIm sendIm = new SendIm();
loginUser != null ? loginUser.getId() : null, sendIm.setType(1);
loginUser != null ? loginUser.getRealname() : null); sendIm.setTitle(resource.getTitle());
sendIm.setContent(StrUtil.isNotBlank(resource.getSummary()) ? resource.getSummary() : resource.getTitle());
sendIm.setBusinessId("article");
ImGroupMsgTextReqDO im = new ImGroupMsgTextReqDO();
im.setGroupId(order.getSessionId());
im.setFromUserId("administrator");
im.setContent(JSONObject.toJSON(sendIm).toString());
imHelloApi.sendGroupMsg(im);
log.info("急救宣教推送IM消息已发送: resourceId={}, title={}, orderId={}, sessionId={}, businessId=article",
resourceId, resource.getTitle(), orderId, order.getSessionId());
} else {
log.warn("急救宣教推送IM消息未发送(工单无群聊sessionId: resourceId={}, orderId={}",
resourceId, orderId);
}
} }
@Override @Override