Commit 4095b386 by giaogiao

消息接收, 保存离线消息,保存消息收件箱表

parent 9271c171
package com.wecloud.im.controller;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.param.ImInboxPageParam;
import com.wecloud.im.param.ImInboxQueryVo;
import com.wecloud.im.service.ImInboxService;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.core.validator.groups.Add;
import io.geekidea.springbootplus.framework.core.validator.groups.Update;
import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 消息收件箱表 控制器
*
* @author wei
* @since 2021-05-06
*/
@Slf4j
@RestController
@RequestMapping("/imInbox")
@Api(value = "消息收件箱表API", tags = {"消息收件箱表"})
public class ImInboxController extends BaseController {
@Autowired
private ImInboxService imInboxService;
/**
* 添加消息收件箱表
*/
@PostMapping("/add")
@OperationLog(name = "添加消息收件箱表", type = OperationLogType.ADD)
@ApiOperation(value = "添加消息收件箱表")
public ApiResult<Boolean> addImInbox(@Validated(Add.class) @RequestBody ImInbox imInbox) throws Exception {
boolean flag = imInboxService.saveImInbox(imInbox);
return ApiResult.result(flag);
}
/**
* 修改消息收件箱表
*/
@PostMapping("/update")
@OperationLog(name = "修改消息收件箱表", type = OperationLogType.UPDATE)
@ApiOperation(value = "修改消息收件箱表")
public ApiResult<Boolean> updateImInbox(@Validated(Update.class) @RequestBody ImInbox imInbox) throws Exception {
boolean flag = imInboxService.updateImInbox(imInbox);
return ApiResult.result(flag);
}
/**
* 删除消息收件箱表
*/
@PostMapping("/delete/{id}")
@OperationLog(name = "删除消息收件箱表", type = OperationLogType.DELETE)
@ApiOperation(value = "删除消息收件箱表")
public ApiResult<Boolean> deleteImInbox(@PathVariable("id") Long id) throws Exception {
boolean flag = imInboxService.deleteImInbox(id);
return ApiResult.result(flag);
}
/**
* 获取消息收件箱表详情
*/
@GetMapping("/info/{id}")
@OperationLog(name = "消息收件箱表详情", type = OperationLogType.INFO)
@ApiOperation(value = "消息收件箱表详情")
public ApiResult<ImInboxQueryVo> getImInbox(@PathVariable("id") Long id) throws Exception {
ImInboxQueryVo imInboxQueryVo = imInboxService.getImInboxById(id);
return ApiResult.ok(imInboxQueryVo);
}
/**
* 消息收件箱表分页列表
*/
@PostMapping("/getPageList")
@OperationLog(name = "消息收件箱表分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "消息收件箱表分页列表")
public ApiResult<Paging<ImInboxQueryVo>> getImInboxPageList(@Validated @RequestBody ImInboxPageParam imInboxPageParam) throws Exception {
Paging<ImInboxQueryVo> paging = imInboxService.getImInboxPageList(imInboxPageParam);
return ApiResult.ok(paging);
}
}
package com.wecloud.im.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* 消息收件箱表
*
* @author wei
* @since 2021-05-06
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@TableName("im_Inbox")
@ApiModel(value = "ImInbox对象")
public class ImInbox extends BaseEntity {
private static final long serialVersionUID = 1L;
@NotNull(message = "收件id不能为空")
@ApiModelProperty("收件id")
@TableId(value = "id", type = IdType.INPUT)
private Long id;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
@ApiModelProperty("接收时间")
private Date receiverDate;
@NotNull(message = "应用appid不能为空")
@ApiModelProperty("应用appid")
private Long fkAppid;
@NotNull(message = "接收客户端id不能为空")
@ApiModelProperty("接收客户端id")
private Long receiver;
@NotNull(message = "消息id不能为空")
@ApiModelProperty("消息id")
private Long fkMsgId;
@ApiModelProperty("0未读; 1已读")
private Integer readMsg;
@ApiModelProperty("会话id")
private Long fkConversationId;
}
package com.wecloud.im.enums;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 状态,0-审核中,1-进行中,2-已完成,99-取消
*/
@Getter
@AllArgsConstructor
public enum PlainTypeStatusEnum implements BaseEnum {
OK(0, "正常"),
DISABLE(1, "禁用"),
CANCEL(99, "删除");
/**
* 编号
*/
private final Integer code;
/**
* 名称
*/
private final String desc;
}
package com.wecloud.im.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.param.ImInboxPageParam;
import com.wecloud.im.param.ImInboxQueryVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.io.Serializable;
/**
* 消息收件箱表 Mapper 接口
*
* @author wei
* @since 2021-05-06
*/
@Repository
public interface ImInboxMapper extends BaseMapper<ImInbox> {
/**
* 根据ID获取查询对象
*
* @param id
* @return
*/
ImInboxQueryVo getImInboxById(Serializable id);
/**
* 获取分页对象
*
* @param page
* @param imInboxPageParam
* @return
*/
IPage<ImInboxQueryVo> getImInboxPageList(@Param("page") Page page, @Param("param") ImInboxPageParam imInboxPageParam);
}
package com.wecloud.im.param;
import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <pre>
* 消息收件箱表 分页参数对象
* </pre>
*
* @author wei
* @date 2021-05-06
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "消息收件箱表分页参数")
public class ImInboxPageParam extends BasePageOrderParam {
private static final long serialVersionUID = 1L;
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <pre>
* 消息收件箱表 查询结果对象
* </pre>
*
* @author wei
* @date 2021-05-06
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "ImInboxQueryVo对象")
public class ImInboxQueryVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("收件id")
private Long id;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
@ApiModelProperty("接收时间")
private Date receiverDate;
@ApiModelProperty("应用appid")
private Long fkAppid;
@ApiModelProperty("接收客户端id")
private Long receiver;
@ApiModelProperty("消息id")
private Long fkMsgId;
@ApiModelProperty("0未读; 1已读")
private Boolean read;
@ApiModelProperty("会话id")
private Long fkConversationId;
}
\ No newline at end of file
package com.wecloud.im.service;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.param.ImInboxPageParam;
import com.wecloud.im.param.ImInboxQueryVo;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
/**
* 消息收件箱表 服务类
*
* @author wei
* @since 2021-05-06
*/
public interface ImInboxService extends BaseService<ImInbox> {
/**
* 保存
*
* @param imInbox
* @return
* @throws Exception
*/
boolean saveImInbox(ImInbox imInbox) throws Exception;
/**
* 修改
*
* @param imInbox
* @return
* @throws Exception
*/
boolean updateImInbox(ImInbox imInbox) throws Exception;
/**
* 删除
*
* @param id
* @return
* @throws Exception
*/
boolean deleteImInbox(Long id) throws Exception;
/**
* 根据ID获取查询对象
*
* @param id
* @return
* @throws Exception
*/
ImInboxQueryVo getImInboxById(Long id) throws Exception;
/**
* 获取分页对象
*
* @param imInboxPageParam
* @return
* @throws Exception
*/
Paging<ImInboxQueryVo> getImInboxPageList(ImInboxPageParam imInboxPageParam) throws Exception;
}
package com.wecloud.im.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.mapper.ImInboxMapper;
import com.wecloud.im.param.ImInboxPageParam;
import com.wecloud.im.param.ImInboxQueryVo;
import com.wecloud.im.service.ImInboxService;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 消息收件箱表 服务实现类
*
* @author wei
* @since 2021-05-06
*/
@Slf4j
@Service
public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox> implements ImInboxService {
@Autowired
private ImInboxMapper imInboxMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveImInbox(ImInbox imInbox) throws Exception {
return super.save(imInbox);
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean updateImInbox(ImInbox imInbox) throws Exception {
return super.updateById(imInbox);
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean deleteImInbox(Long id) throws Exception {
return super.removeById(id);
}
@Override
public ImInboxQueryVo getImInboxById(Long id) throws Exception {
return imInboxMapper.getImInboxById(id);
}
@Override
public Paging<ImInboxQueryVo> getImInboxPageList(ImInboxPageParam imInboxPageParam) throws Exception {
Page<ImInboxQueryVo> page = new PageInfo<>(imInboxPageParam, OrderItem.desc(getLambdaColumn(ImInbox::getCreateTime)));
IPage<ImInboxQueryVo> iPage = imInboxMapper.getImInboxPageList(page, imInboxPageParam);
return new Paging<ImInboxQueryVo>(iPage);
}
}
package com.wecloud.im.tillo.app_ws;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.tillo.app_ws.model.WsConstants;
import com.wecloud.im.tillo.app_ws.receive.ReadWsData;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
......@@ -9,7 +9,6 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
......@@ -30,8 +29,6 @@ import java.util.concurrent.TimeUnit;
public class WsHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
@Autowired
private ImMessageService imMessageService;
@Resource
private ReadWsData readWsData;
......@@ -54,35 +51,6 @@ public class WsHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
String data = msg.text();
// ImMessage imMessage = new ImMessage();
// imMessage.setId(new Snowflake(1L, 1L).nextId());
//
// imMessage.setCreateTime(new Date());
// imMessage.setWithdrawTime(new Date());
// imMessage.setUpdateDate(new Date());
// imMessage.setFkAppid(0L);
// imMessage.setSender(0L);
// imMessage.setContent(data);
// imMessage.setWithdraw(false);
// imMessage.setEvent(false);
// imMessage.setSystem(false);
// imMessage.setAt("");
// imMessage.setSendStatus(0);
// imMessage.setFkConversationId(0L);
//
// imMessageService.save(imMessage);
//
// JsonMapper jsonMapper = new JsonMapper();
//
// try {
// JsonNode jsonNode = jsonMapper.readTree(data);
// int i = 0;
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// }
// ChannelFuture channelFuture = ctx.writeAndFlush(new TextWebSocketFrame(data));
try {
if (data.isEmpty()) {
return;
......
......@@ -53,7 +53,6 @@ public class ReadWsData {
// ReceiveModel requestModel = JSON.parseObject(data, ReceiveModel.class);
JsonMapper jsonMapper = new JsonMapper();
ReceiveModel receiveModel = null;
......@@ -67,8 +66,10 @@ public class ReadWsData {
}
try {
// User user = userService.findById(userId);
this.doProcess(language, receiveModel, ctx);
WsRequestCmdEnum wsRequestUriPathEnum = WsRequestCmdEnum.getByCode(receiveModel.getCmd());
// 使用策略模式, 根据不同类型请求调用不同实现类
AbstractReceiveStrategy receiveStrategy = receiveStrategyContext.getStrategy(wsRequestUriPathEnum);
receiveStrategy.process(receiveModel, language, ctx, data);
} catch (Exception e) {
log.error("系统繁忙:" + data + ",appKey:" + appKey + ",clientId:" + clientId, e);
......@@ -77,12 +78,5 @@ public class ReadWsData {
}
private void doProcess(String language, ReceiveModel requestModel, ChannelHandlerContext ctx) {
WsRequestCmdEnum wsRequestUriPathEnum = WsRequestCmdEnum.getByCode(requestModel.getCmd());
// 使用策略模式, 根据不同类型请求调用不同实现类
AbstractReceiveStrategy receiveStrategy = receiveStrategyContext.getStrategy(wsRequestUriPathEnum);
receiveStrategy.process(requestModel, language, ctx);
}
}
package com.wecloud.im.tillo.app_ws.sender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class WsWriter {
}
......@@ -19,5 +19,5 @@ public abstract class AbstractReceiveStrategy {
* @param language
* @throws Exception
*/
abstract public void process(ReceiveModel requestModel, String language, ChannelHandlerContext ctx);
abstract public void process(ReceiveModel requestModel, String language, ChannelHandlerContext ctx, String data);
}
......@@ -25,7 +25,7 @@ import java.util.Set;
public class ReceiveStrategyProcessor implements BeanFactoryPostProcessor {
// 扫码注解的包路径
private static final String STRATEGY_PACK = "com.sql.tillo.app_ws.strategy,com.sql.tillo.app_ws.process";
private static final String STRATEGY_PACK = "com.wecloud.im.tillo.app_ws.strategy.concrete";
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
......
package com.wecloud.im.tillo.app_ws.strategy.concrete;
import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.tillo.app_ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.tillo.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.tillo.app_ws.strategy.AbstractReceiveStrategy;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* @Description 处理app单聊消息
*/
......@@ -16,9 +30,65 @@ import org.springframework.stereotype.Service;
@Slf4j
public class SingleConcreteReceiveStrategy extends AbstractReceiveStrategy {
@Autowired
private ImMessageService imMessageService;
@Autowired
private ImInboxService imInboxService;
@Autowired
private ImApplicationService imApplicationService;
@Override
public void process(ReceiveModel requestModel, String language, ChannelHandlerContext ctx) {
public void process(ReceiveModel requestModel, String language, ChannelHandlerContext ctx, String data) {
String appKey = ctx.channel().attr(MangerChannelService.APP_KEY).get();
String clientId = ctx.channel().attr(MangerChannelService.CLIENT_ID).get();
ImApplication imApplication = imApplicationService.getOne(new QueryWrapper<ImApplication>().lambda()
.eq(ImApplication::getAppKey, appKey));
JsonMapper jsonMapper = new JsonMapper();
String content = null;
Long toConversation = Long.valueOf(requestModel.getData().get("toConversation").toString());
long messageId = new Snowflake(1L, 1L).nextId();
long imInboxId = new Snowflake(1L, 1L).nextId();
try {
content = jsonMapper.writeValueAsString(requestModel.getData());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 保存离线消息
ImMessage imMessage = new ImMessage();
imMessage.setId(messageId);
imMessage.setCreateTime(new Date());
// imMessage.setWithdrawTime(new Date());
// imMessage.setUpdateDate(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(0L);
imMessage.setContent(content);
imMessage.setWithdraw(false);
imMessage.setEvent(false);
imMessage.setSystem(false);
// imMessage.setAt("");
imMessage.setSendStatus(0);
imMessage.setFkConversationId(toConversation);
imMessageService.save(imMessage);
// 向接收方推送
// ChannelFuture channelFuture = ctx.writeAndFlush(new TextWebSocketFrame(data));
ImInbox imInbox = new ImInbox();
imInbox.setId(imInboxId);
imInbox.setCreateTime(new Date());
// imInbox.setUpdateTime(new Date());
// imInbox.setReceiverDate(new Date());
imInbox.setFkAppid(123L);
imInbox.setReceiver(12L);
imInbox.setFkMsgId(messageId);
imInbox.setReadMsg(0);
imInbox.setFkConversationId(toConversation);
imInboxService.save(imInbox);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wecloud.im.mapper.ImInboxMapper">
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id
, create_time, update_time, receiver_date, fk_appid, receiver, fk_msg_id, read, fk_conversation_id
</sql>
<select id="getImInboxById" resultType="com.wecloud.im.param.ImInboxQueryVo">
select
<include refid="Base_Column_List"/>
from im_Inbox where id = #{id}
</select>
<select id="getImInboxPageList" parameterType="com.wecloud.im.param.ImInboxPageParam"
resultType="com.wecloud.im.param.ImInboxQueryVo">
select
<include refid="Base_Column_List"/>
from im_Inbox
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment