Merge branch 'feature/sz-237' into release/20231106

# Conflicts:
#	inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/MessageRecordService.java
#	inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/InsideMessageRecordApiImpl.java
#	inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageRecordServiceImpl.java
#	integration-test/src/test/resources/message.http
#	msg-center-api/src/main/java/cn/axzo/msg/center/api/InsideMessageRecordApi.java
#	msg-center-api/src/main/java/cn/axzo/msg/center/api/fallback/InsideMessageRecordApiFallBack.java
This commit is contained in:
王军 2023-10-31 10:43:32 +08:00
commit 71f187b6f5
13 changed files with 194 additions and 39 deletions

View File

@ -77,4 +77,9 @@ public interface MessageRecordService {
* @return 成功删除返回 {@code true}否则返回 {@code false}
*/
boolean deleteMessageRecords(MessageRecordDeleteReq request);
Integer unReadStatistics(MessageStatisticsReq request);
IPage<MessageRecordRes> queryMessageRecordList(MessageRecordReq request);
void updateStateReceive(List<Long> msgIdList);
}

View File

@ -2,20 +2,28 @@ package cn.axzo.msg.center.inside.notices.service.impl;
import cn.axzo.core.domain.PageResult;
import cn.axzo.msg.center.api.InsideMessageRecordApi;
import cn.axzo.msg.center.api.request.*;
import cn.axzo.msg.center.api.request.CmsMsgListReq;
import cn.axzo.msg.center.api.request.CmsMsgQueryReq;
import cn.axzo.msg.center.api.request.MessageRecordReq;
import cn.axzo.msg.center.api.request.MessageStatisticsReq;
import cn.axzo.msg.center.api.request.QueryMessageRecordReq;
import cn.axzo.msg.center.api.request.UpdateReadReq;
import cn.axzo.msg.center.api.response.MessageNewRes;
import cn.axzo.msg.center.api.response.MessageRecordRes;
import cn.axzo.msg.center.common.exception.ServiceException;
import cn.axzo.msg.center.common.utils.BeanConvertUtils;
import cn.axzo.msg.center.dal.MessageRecordDao;
import cn.axzo.msg.center.domain.dto.UpdateReadDTO;
import cn.axzo.msg.center.inside.notices.service.MessageRecordService;
import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@RestController
@ -24,6 +32,9 @@ public class InsideMessageRecordApiImpl implements InsideMessageRecordApi {
@Resource
private MessageRecordService messageRecordService;
@Resource
private MessageRecordDao messageRecordDao;
@Override
public CommonResponse<PageResult<MessageNewRes>> listMsgInfo4Trade(CmsMsgListReq req) {
CmsMsgQueryReq request=new CmsMsgQueryReq();
@ -34,15 +45,18 @@ public class InsideMessageRecordApiImpl implements InsideMessageRecordApi {
}
@Override
public CommonResponse<IPage<MessageRecordRes>> queryMessageRecordList(MessageRecordReq request) {
return null;
public CommonResponse<PageResult<MessageRecordRes>> queryMessageRecordList(MessageRecordReq request) {
IPage<MessageRecordRes> queryPage = messageRecordService.queryMessageRecordList(request);
PageResult<MessageRecordRes> result = new PageResult<>(queryPage.getRecords(), queryPage.getTotal());
return CommonResponse.success(result);
}
@Override
public CommonResponse<Boolean> changeHasRead(UpdateReadReq request) {
if(request.getToId() == null && request.getFromId() == null){
throw new ServiceException("发送人id和接收人id不能同时为空");
if(request.getToId() == null
&& request.getFromId() == null
&& CollectionUtil.isEmpty(request.getMsgIdList())){
throw new ServiceException("发送人id、接收人id、消息ID列表不能同时为空");
}
UpdateReadDTO updateReadDTO = BeanConvertUtils.copyBean(request, UpdateReadDTO.class);
Boolean updateSuccess = messageRecordService.changeHasRead(updateReadDTO);
@ -50,21 +64,20 @@ public class InsideMessageRecordApiImpl implements InsideMessageRecordApi {
}
@Override
public CommonResponse<IPage<MessageRecordRes>> queryUnReadList(QueryMessageRecordReq request) {
public CommonResponse<PageResult<MessageRecordRes>> queryUnReadList(QueryMessageRecordReq request) {
IPage<MessageRecordRes> result=messageRecordService.queryUnReadList(request);
return CommonResponse.success(result);
return CommonResponse.success(new PageResult<>(result.getRecords(), result.getTotal()));
}
@Override
public CommonResponse<IPage<MessageRecordRes>> querySent(QueryMessageRecordReq request) {
public CommonResponse<PageResult<MessageRecordRes>> querySent(QueryMessageRecordReq request) {
IPage<MessageRecordRes> result=messageRecordService.querySent(request);
return CommonResponse.success(result);
return CommonResponse.success(new PageResult<>(result.getRecords(), result.getTotal()));
}
@Override
public CommonResponse<Integer> unReadStatistics(MessageStatisticsReq request) {
return null;
return CommonResponse.success(messageRecordService.unReadStatistics(request));
}
@Override
@ -72,4 +85,9 @@ public class InsideMessageRecordApiImpl implements InsideMessageRecordApi {
return CommonResponse.success(messageRecordService.deleteMessageRecords(request));
}
@Override
public CommonResponse<Void> markReceived(List<Long> msgIdList) {
messageRecordService.updateStateReceive(msgIdList);
return CommonResponse.success();
}
}

View File

@ -32,19 +32,24 @@ import cn.azxo.framework.common.utils.LogUtil;
import cn.azxo.framework.common.utils.LogUtil.ErrorLevel;
import cn.azxo.framework.common.utils.LogUtil.ErrorType;
import cn.azxo.framework.common.utils.StringUtils;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import javax.annotation.Resource;
import java.util.*;
@ -569,11 +574,12 @@ public class MessageRecordServiceImpl implements MessageRecordService {
@Override
public IPage<MessageRecordRes> queryUnReadList(QueryMessageRecordReq request) {
IPage<MessageRecordRes> resultList=new MyPage<>();
IPage<MessageNewResDTO> newResDTOIPage = messageRecordDao.queryUnReadList(request);
if(newResDTOIPage == null || newResDTOIPage.getTotal()==0){
return null;
return resultList;
}
IPage<MessageRecordRes> resultList=new MyPage<>();
List<MessageRecordRes> messageList=new ArrayList<>();
for (MessageNewResDTO record : newResDTOIPage.getRecords()) {
MessageRecordRes item = BeanConvertUtils.copyBean(record, MessageRecordRes.class);
@ -610,4 +616,49 @@ public class MessageRecordServiceImpl implements MessageRecordService {
.eq(MessageRecord::getIsDelete, YesNoEnum.NO.getCode())
.update();
}
@Override
public Integer unReadStatistics(MessageStatisticsReq request) {
log.info("statistics reqeust:{}condition:{}", JSON.toJSONString(request),
Objects.nonNull(request.getMsgType()));
return messageRecordDao.lambdaQuery()
.eq(Objects.nonNull(request.getFromId()), MessageRecord::getFromId, request.getFromId())
.eq(Objects.nonNull(request.getModuleId()), MessageRecord::getModuleId, request.getFromId())
.eq(Objects.nonNull(request.getMsgType()), MessageRecord::getType, MsgTypeEnum.valueOf(request.getMsgType()))
.eq(Objects.nonNull(request.getToId()), MessageRecord::getToId, request.getToId())
.eq(Objects.nonNull(request.getTenantId()), MessageRecord::getTenantId, request.getTenantId())
.in(MessageRecord::getState, MsgStateEnum.HAS_BEEN_SENT, MsgStateEnum.RECEIVED)
.count();
}
@Override
public IPage<MessageRecordRes> queryMessageRecordList(MessageRecordReq request) {
IPage<MessageRecord> result = messageRecordDao.lambdaQuery()
.eq(Objects.nonNull(request.getMsgType()), MessageRecord::getType, MsgTypeEnum.valueOf(request.getMsgType()))
.eq(Objects.nonNull(request.getFromId()), MessageRecord::getFromId, request.getFromId())
.eq(Objects.nonNull(request.getTenantId()), MessageRecord::getTenantId, request.getTenantId())
.like(Strings.isNotBlank(request.getSearchContent()), MessageRecord::getContent, request.getSearchContent())
.eq(Objects.nonNull(request.getToId()), MessageRecord::getToId, request.getToId())
.in(Objects.nonNull(request.getMsgStatus()), MessageRecord::getState, request.getMsgStatus())
.eq(Objects.nonNull(request.getModuleId()), MessageRecord::getModuleId, request.getModuleId())
.orderByDesc(MessageRecord::getCreateAt)
.page(request.toPage());
return result.convert(r -> {
MessageRecordRes messageRecordRes = BeanConvertUtils.copyBean(r, MessageRecordRes.class);
messageRecordRes.setMsgId(r.getId());
return messageRecordRes;
});
}
@Override
public void updateStateReceive(List<Long> msgIdList) {
if (CollectionUtil.isEmpty(msgIdList)) {
return;
}
messageRecordDao.lambdaUpdate()
.set(MessageRecord::getState, MsgStateEnum.RECEIVED)
.in(MessageRecord::getId, msgIdList).update();
}
}

View File

@ -29,6 +29,18 @@ Content-Type: application/json
> reponse-check.js
###
POST {{host}}/msg/record/unread/statistics
Accept: application/json
Content-Type: application/json
{
"msgType": 1
}
> reponse-check.js
###
POST {{host}}/webApi/wx/message/list
Accept: application/json
@ -44,3 +56,18 @@ Content-Type: application/json
> reponse-check.js
###
POST {{host}}/msg/record/list
Accept: application/json
Content-Type: application/json
{
"msgType": 1,
"toId": 1,
"msgRouteType": 1,
"page": 1,
"pageSize": 10
}
> reponse-check.js

View File

@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.validation.Valid;
import java.util.List;
@FeignClient(name = "msg-center", url = "${server.serviceUrl}", fallback = InsideMessageRecordApiFallBack.class)
@Component
@ -32,7 +33,7 @@ public interface InsideMessageRecordApi {
* @return
*/
@PostMapping("msg/record/list")
CommonResponse<IPage<MessageRecordRes>> queryMessageRecordList(MessageRecordReq request);
CommonResponse<PageResult<MessageRecordRes>> queryMessageRecordList(@RequestBody MessageRecordReq request);
/**
* 修改成已读
@ -48,7 +49,7 @@ public interface InsideMessageRecordApi {
* @return
*/
@PostMapping("msg/record/unread/list")
CommonResponse<IPage<MessageRecordRes>> queryUnReadList(QueryMessageRecordReq request);
CommonResponse<PageResult<MessageRecordRes>> queryUnReadList(@RequestBody QueryMessageRecordReq request);
/**
* 查询已发送列表
@ -56,7 +57,7 @@ public interface InsideMessageRecordApi {
* @return
*/
@PostMapping("msg/record/sent/list")
CommonResponse<IPage<MessageRecordRes>> querySent(QueryMessageRecordReq request);
CommonResponse<PageResult<MessageRecordRes>> querySent(@RequestBody QueryMessageRecordReq request);
/**
* 统计未读数量
@ -64,7 +65,7 @@ public interface InsideMessageRecordApi {
* @return
*/
@PostMapping("msg/record/unread/statistics")
CommonResponse<Integer> unReadStatistics(MessageStatisticsReq request);
CommonResponse<Integer> unReadStatistics(@RequestBody MessageStatisticsReq request);
/**
* 批量删除消息记录支持以下两种方式
@ -79,4 +80,12 @@ public interface InsideMessageRecordApi {
*/
@PostMapping("msg/record/delete")
CommonResponse<Boolean> deleteMessageRecords(@RequestBody MessageRecordDeleteReq request);
/**
* 标记为已经接收
* @param msgIdList
* @return
*/
@PostMapping("msg/record/markReceived")
CommonResponse<Void> markReceived(@RequestBody List<Long> msgIdList);
}

View File

@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
public class InsideMessageRecordApiFallBack implements InsideMessageRecordApi {
@ -22,7 +24,7 @@ public class InsideMessageRecordApiFallBack implements InsideMessageRecordApi {
}
@Override
public CommonResponse<IPage<MessageRecordRes>> queryMessageRecordList(MessageRecordReq request) {
public CommonResponse<PageResult<MessageRecordRes>> queryMessageRecordList(MessageRecordReq request) {
log.warn("查询消息记录列表超时,req={}", JSONUtil.toJsonStr(request));
return CommonResponse.fail("查询消息记录列表超时");
}
@ -33,12 +35,12 @@ public class InsideMessageRecordApiFallBack implements InsideMessageRecordApi {
}
@Override
public CommonResponse<IPage<MessageRecordRes>> queryUnReadList(QueryMessageRecordReq request) {
public CommonResponse<PageResult<MessageRecordRes>> queryUnReadList(QueryMessageRecordReq request) {
return null;
}
@Override
public CommonResponse<IPage<MessageRecordRes>> querySent(QueryMessageRecordReq request) {
public CommonResponse<PageResult<MessageRecordRes>> querySent(QueryMessageRecordReq request) {
return null;
}
@ -51,4 +53,9 @@ public class InsideMessageRecordApiFallBack implements InsideMessageRecordApi {
public CommonResponse<Boolean> deleteMessageRecords(MessageRecordDeleteReq request) {
return CommonResponse.success(false);
}
@Override
public CommonResponse<Void> markReceived(List<Long> msgIdList) {
return CommonResponse.fail("更新消息状态异常");
}
}

View File

@ -2,10 +2,13 @@ package cn.axzo.msg.center.api.request;
import cn.axzo.basics.common.page.PageRequest;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.List;
@Data
@ToString(callSuper = true)
public class MessageRecordReq extends PageRequest {
/**

View File

@ -2,20 +2,22 @@ package cn.axzo.msg.center.api.request;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class UpdateReadReq {
/** 消息ID **/
private List<Long> msgIdList;
/**
* 消息类型 1:普通消息 2:待办
*/
@NotNull(message = "消息类型不能为空")
private Integer msgType;
/**
* 待办消息模块类型Id - 针对待办使用
*/
@NotNull(message = "moduleId不能为空")
private Long moduleId;
/**
* 发送人id

View File

@ -6,9 +6,13 @@ import cn.axzo.msg.center.api.enums.MsgTypeEnum;
import cn.axzo.msg.center.api.enums.ReceiveTypeEnum;
import lombok.Data;
import java.util.Date;
@Data
public class MessageRecordRes {
private Long msgId;
/**
* 发送者ID
*/
@ -100,4 +104,7 @@ public class MessageRecordRes {
* 租户id解决多个企业的问题
*/
private Long tenantId;
/** 创建时间 **/
private Date createAt;
}

View File

@ -17,6 +17,7 @@ import cn.axzo.msg.center.domain.enums.ModuleBizTypeEnum;
import cn.axzo.msg.center.domain.persistence.BaseEntity;
import cn.axzo.msg.center.domain.request.InsideCmsReadMsgReq;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -126,7 +127,8 @@ public class MessageRecordDao extends
}
public IPage<MessageRecordRes> querySent(QueryMessageRecordReq request){
return baseMapper.querySent(request);
IPage<MessageRecordRes> page = new Page<>(request.getPage(), request.getPageSize());
return baseMapper.querySent(page,request);
}
}

View File

@ -48,6 +48,6 @@ public interface MessageRecordMapper extends BaseMapper<MessageRecord>{
int updateHasRead(@Param("req") UpdateReadDTO request);
IPage<MessageNewResDTO> queryUnReadList(@Param("req") QueryMessageRecordReq req, IPage page);
IPage<MessageRecordRes> querySent(QueryMessageRecordReq request);
IPage<MessageRecordRes> querySent(IPage<MessageRecordRes> page, @Param("req") QueryMessageRecordReq request);
}

View File

@ -172,7 +172,20 @@
<!---->
<update id="updateHasRead" parameterType="cn.axzo.msg.center.domain.dto.UpdateReadDTO">
update message_record set state=4 where is_delete=0 AND module_id=#{req.moduleId} AND type=#{req.msgType}
update message_record set state=4
where is_delete=0
<if test="req.msgIdList != null">
AND id IN
<foreach close=")" collection="req.msgIdList" item="msgId" open="(" separator=",">
#{msgId}
</foreach>
</if>
<if test="req.moduleId != null">
AND module_id = #{req.moduleId}
</if>
<if test="req.msgType != null">
AND type = #{req.msgType}
</if>
<if test="req.tenantId != null">
AND tenant_id = #{req.tenantId}
</if>
@ -198,16 +211,16 @@
record.router_params as routerParam,
record.relation_id as relationId,
record.old_type_id as oldTypeId
from message_record
where to_id={req.toId}
from message_record AS record
where to_id=#{req.toId}
<if test="req.msgType != null and req.msgType > 0">
type = #{req.msgType}
AND type = #{req.msgType}
</if>
<if test="req.fromId != null and req.fromId > 0">
from_id = #{req.fromId}
AND from_id = #{req.fromId}
</if>
<if test="req.tenantId != null and req.tenantId > 0">
tenant_id = #{req.tenantId}
AND tenant_id = #{req.tenantId}
</if>
and module_id = #{req.moduleId}
and state in (2,3)
@ -229,19 +242,25 @@
record.extra as ext,
record.router_params as routerParam,
record.relation_id as relationId,
record.old_type_id as oldTypeId
from message_record
where to_id={req.toId}
record.old_type_id as oldTypeId,
record.tenant_id AS tenantId,
record.from_id AS fromId,
record.to_id AS toId,
record.create_at AS createAt
from message_record AS record
where to_id=#{req.toId}
<if test="req.msgType != null and req.msgType > 0">
type = #{req.msgType}
AND type = #{req.msgType}
</if>
<if test="req.fromId != null and req.fromId > 0">
from_id = #{req.fromId}
AND from_id = #{req.fromId}
</if>
<if test="req.tenantId != null and req.tenantId > 0">
tenant_id = #{req.tenantId}
AND tenant_id = #{req.tenantId}
</if>
<if test="req.moduleId != null and req.moduleId > 0">
AND module_id = #{req.moduleId}
</if>
and module_id = #{req.moduleId}
and state=2
and is_delete = 0
order by create_at desc,id desc

View File

@ -2,8 +2,13 @@ package cn.axzo.msg.center.domain.dto;
import lombok.Data;
import java.util.List;
@Data
public class UpdateReadDTO {
/** 消息ID **/
private List<Long> msgIdList;
/**
* 消息类型 1:普通消息 2:待办
*/