新增:应用系统推送IM消息 im:send-message
This commit is contained in:
parent
4e4a4c2f82
commit
621c205b6c
@ -13,7 +13,10 @@ import org.redkale.convert.json.JsonConvert;
|
||||
import org.redkale.net.http.RestMapping;
|
||||
import org.redkale.net.http.RestService;
|
||||
import org.redkale.service.RetResult;
|
||||
import org.redkale.source.*;
|
||||
import org.redkale.source.ColumnValue;
|
||||
import org.redkale.source.FilterBean;
|
||||
import org.redkale.source.FilterNode;
|
||||
import org.redkale.source.Flipper;
|
||||
import org.redkale.util.AnyValue;
|
||||
import org.redkale.util.Comment;
|
||||
import org.redkale.util.TypeToken;
|
||||
@ -34,8 +37,8 @@ public class ImAccountService extends BaseService {
|
||||
protected MyRedisCacheSource<String> strCache;
|
||||
@Resource
|
||||
protected ImMessageMonitor messageMonitor;
|
||||
@Resource
|
||||
protected ImAccountService accountService;
|
||||
/*@Resource
|
||||
protected ImAccountService accountService;*/
|
||||
|
||||
@Override
|
||||
public void init(AnyValue config) {
|
||||
@ -93,7 +96,7 @@ public class ImAccountService extends BaseService {
|
||||
SubscribeBean bean = r.getValue();
|
||||
String imtoken = bean.getImtoken();
|
||||
|
||||
ImUser user = accountService.currentImUser(imtoken);
|
||||
ImUser user = currentImUser(imtoken);
|
||||
int userid = user.getUserid();
|
||||
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", ImUser.STATUS_FREEZE_ACTIVE));
|
||||
intCache.setBit("im:banned-talk", userid, true);
|
||||
@ -106,7 +109,7 @@ public class ImAccountService extends BaseService {
|
||||
SubscribeBean bean = r.getValue();
|
||||
String imtoken = bean.getImtoken();
|
||||
|
||||
ImUser user = accountService.currentImUser(imtoken);
|
||||
ImUser user = currentImUser(imtoken);
|
||||
int userid = user.getUserid();
|
||||
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", 10));
|
||||
intCache.setBit("im:banned-talk", userid, false);
|
||||
@ -127,6 +130,10 @@ public class ImAccountService extends BaseService {
|
||||
return user;
|
||||
}
|
||||
|
||||
public ImUser getImUser(ImBean bean) {
|
||||
return zimSource.find(ImUser.class, FilterNode.create("guserid", bean.getGuserid()).and("appid", bean.getAppid()));
|
||||
}
|
||||
|
||||
/*@Comment("获取当前用户ID")
|
||||
public int currentImUserId(String token) {
|
||||
return currentImUser(token).getUserid();
|
||||
@ -190,7 +197,7 @@ public class ImAccountService extends BaseService {
|
||||
*/
|
||||
@RestMapping(name = "subscribe", auth = false, comment = "给用户订阅频道信息")
|
||||
public RetResult subscribe(SubscribeBean bean) {
|
||||
ImUser user = accountService.currentImUser(bean.getImtoken());
|
||||
ImUser user = currentImUser(bean.getImtoken());
|
||||
int userid = user.getUserid();
|
||||
Lock lock = zhub.lock("im:channel-create:" + userid, 500);
|
||||
try {
|
||||
@ -220,7 +227,7 @@ public class ImAccountService extends BaseService {
|
||||
*/
|
||||
@RestMapping(name = "unsubscribe", auth = false, comment = "取消频道订阅")
|
||||
public RetResult unsubscribe(SubscribeBean bean) {
|
||||
ImUser user = accountService.currentImUser(bean.getImtoken());
|
||||
ImUser user = currentImUser(bean.getImtoken());
|
||||
int userid = user.getUserid();
|
||||
|
||||
|
||||
|
@ -3,6 +3,9 @@ package com.zchd.zim;
|
||||
import com.zchd.base.BaseService;
|
||||
import com.zchd.base.util.Kv;
|
||||
import com.zchd.base.util.QueueTask;
|
||||
import com.zchd.base.util.Utils;
|
||||
import com.zchd.zim.bean.ImBean;
|
||||
import com.zchd.zim.bean.MessageBean;
|
||||
import com.zchd.zim.entity.ChannelMessage;
|
||||
import com.zchd.zim.entity.ChannelUser;
|
||||
import com.zchd.zim.entity.FriendMessage;
|
||||
@ -11,12 +14,14 @@ import net.tccn.timer.Timers;
|
||||
import net.tccn.zhub.ZHubClient;
|
||||
import org.redkale.net.http.RestService;
|
||||
import org.redkale.net.http.WebSocketNode;
|
||||
import org.redkale.service.RetResult;
|
||||
import org.redkale.source.ColumnValue;
|
||||
import org.redkale.source.DataSource;
|
||||
import org.redkale.source.FilterNode;
|
||||
import org.redkale.source.Flipper;
|
||||
import org.redkale.util.AnyValue;
|
||||
import org.redkale.util.Comment;
|
||||
import org.redkale.util.TypeToken;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.persistence.Transient;
|
||||
@ -39,11 +44,52 @@ public class ImChatService extends BaseService {
|
||||
@Transient //消息存储
|
||||
protected QueueTask<Runnable> dbQueue = new QueueTask<>(1);
|
||||
|
||||
@Resource
|
||||
private ImAccountService accountService;
|
||||
|
||||
|
||||
@Override
|
||||
public void init(AnyValue config) {
|
||||
msgQueue.init(logger, Runnable::run);
|
||||
dbQueue.init(logger, Runnable::run);
|
||||
|
||||
zhub.rpcSubscribe("im:send-message", new TypeToken<MessageBean>() {
|
||||
}, r -> {
|
||||
MessageBean bean = r.getValue();
|
||||
|
||||
/*// 当指定点对点消息类型的时候,消息类型必须明确
|
||||
if (!Utils.isEmpty(bean.getGuserid()) && Utils.isEmpty(bean.getMessagetype())) {
|
||||
return r.retError("发送消息类型未明确");
|
||||
}*/
|
||||
if (Utils.isEmpty(bean.getGuserid()) && bean.getReceivechannel() == null) {
|
||||
return r.retError("发送目标未明确");
|
||||
}
|
||||
|
||||
// 发送点对点消息
|
||||
if (!Utils.isEmpty(bean.getGuserid())) {
|
||||
ImBean imBean = bean.buildImBean();
|
||||
ImUser imUser = accountService.getImUser(imBean);
|
||||
// 接收人未注册 IM 信息,为其注册信息
|
||||
if (imUser == null) {
|
||||
RetResult<Kv> result = accountService.register(imBean);
|
||||
if (!result.isSuccess()) {
|
||||
return r.retError(result.getRetinfo());
|
||||
}
|
||||
imUser = accountService.getImUser(imBean);
|
||||
}
|
||||
|
||||
FriendMessage message = bean.buildFriendMessage(0, imUser.getUserid());
|
||||
sendFriendMessage(message);
|
||||
}
|
||||
|
||||
// 发送群组消息
|
||||
if (bean.getReceivechannel() != null) {
|
||||
ChannelMessage message = bean.buildChannelMessage(0); // 发送者:0系统发送
|
||||
sendChannelMessage(message);
|
||||
}
|
||||
|
||||
return r.render();
|
||||
});
|
||||
}
|
||||
|
||||
@Comment("发送私聊消息")
|
||||
@ -166,7 +212,7 @@ public class ImChatService extends BaseService {
|
||||
public Kv buildFriendMessageDeail(FriendMessage message) {
|
||||
Kv detail = Kv.toKv(message, "content", "messageid", "sendtime");
|
||||
detail.set("sendguserid", getGuserid(message.getSenduserid()));
|
||||
Kv data = Kv.of("detail", detail).set("type", "friend-text");
|
||||
Kv data = Kv.of("detail", detail).set("type", message.getMessagetype());
|
||||
return data;
|
||||
}
|
||||
|
||||
|
65
src/com/zchd/zim/bean/MessageBean.java
Normal file
65
src/com/zchd/zim/bean/MessageBean.java
Normal file
@ -0,0 +1,65 @@
|
||||
package com.zchd.zim.bean;
|
||||
|
||||
import com.zchd.base.util.Utils;
|
||||
import com.zchd.zim.entity.AppInfo;
|
||||
import com.zchd.zim.entity.ChannelMessage;
|
||||
import com.zchd.zim.entity.FriendMessage;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.redkale.util.Comment;
|
||||
|
||||
import javax.persistence.Column;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
public class MessageBean {
|
||||
|
||||
@Column(comment = "[消息内容]")
|
||||
private String content = "";
|
||||
|
||||
@Column(comment = "[平台信息]{appid, appsecret}")
|
||||
private AppInfo appinfo;
|
||||
|
||||
@Column(comment = "[消息类型]用于点对点模式下的消息类别标注")
|
||||
private String messagetype = "";
|
||||
|
||||
@Column(comment = "[接收人]")
|
||||
private String guserid;
|
||||
|
||||
@Comment("[接收群组]{channeltype, channelvalue}")
|
||||
private SubscribeBean receivechannel;
|
||||
|
||||
public FriendMessage buildFriendMessage(int senduserid, int userid) {
|
||||
FriendMessage message = new FriendMessage();
|
||||
message.setContent(content);
|
||||
message.setMessagetype(messagetype);
|
||||
message.setSenduserid(senduserid);
|
||||
message.setReceiveuserid(userid);
|
||||
message.setCreatetime(System.currentTimeMillis());
|
||||
message.setStatus((short) 20);
|
||||
message.setMessageid(Utils.fmt36(senduserid) + "-" + Utils.fmt36(message.getCreatetime()));
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
public ChannelMessage buildChannelMessage(int senduserid) {
|
||||
ChannelMessage message = new ChannelMessage();
|
||||
message.setContent(content);
|
||||
message.setAppid(appinfo.getAppid());
|
||||
message.setSenduserid(senduserid);
|
||||
message.setChanneltype(receivechannel.getChanneltype());
|
||||
message.setChannelvalue(receivechannel.getChannelvalue());
|
||||
message.setCreatetime(System.currentTimeMillis());
|
||||
message.setStatus((short) 20);
|
||||
message.setMessageid(Utils.fmt36(message.getSenduserid()) + "-" + Utils.fmt36(message.getCreatetime()));
|
||||
return message;
|
||||
}
|
||||
|
||||
public ImBean buildImBean() {
|
||||
ImBean bean = new ImBean();
|
||||
bean.setAppid(appinfo.getAppid());
|
||||
bean.setAppsecret(appinfo.getAppsecret());
|
||||
bean.setGuserid(guserid);
|
||||
return bean;
|
||||
}
|
||||
}
|
@ -17,6 +17,9 @@ public class FriendMessage {
|
||||
@Column(comment = "[私聊ID]发送人-时间戳")
|
||||
private String messageid = "";
|
||||
|
||||
@Column(comment = "[消息类型]")
|
||||
private String messagetype = "friend-text";
|
||||
|
||||
@Column(comment = "[私聊内容]")
|
||||
private String content = "";
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user