IM消息功能

This commit is contained in:
chc
2022-12-27 18:14:47 +08:00
parent 54e04be768
commit 73aa36fc69
29 changed files with 542 additions and 126 deletions

View File

@@ -0,0 +1,92 @@
package cn.lili.controller.goods;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
import cn.lili.modules.search.service.EsGoodsSearchService;
import cn.lili.modules.search.service.HotWordsService;
import cn.lili.modules.statistics.aop.PageViewPoint;
import cn.lili.modules.statistics.aop.enums.PageViewEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.SearchPage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
/**
* 买家端,商品接口
*
* @author Chopper
* @since 2020/11/16 10:06 下午
*/
@Slf4j
@Api(tags = "买家端,商品接口")
@RestController
@RequestMapping("/im/goods/goods")
public class GoodsImController {
/**
* 商品
*/
@Autowired
private GoodsService goodsService;
/**
* 商品SKU
*/
@Autowired
private GoodsSkuService goodsSkuService;
/**
* ES商品搜索
*/
@Autowired
private EsGoodsSearchService goodsSearchService;
@Autowired
private HotWordsService hotWordsService;
@ApiOperation(value = "通过id获取商品信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path"),
@ApiImplicitParam(name = "skuId", value = "skuId", required = true, paramType = "path")
})
@GetMapping(value = "/sku/{goodsId}/{skuId}")
@PageViewPoint(type = PageViewEnum.SKU, id = "#id")
public ResultMessage<Map<String, Object>> getSku(@NotNull(message = "商品ID不能为空") @PathVariable("goodsId") String goodsId,
@NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId) {
try {
// 读取选中的列表
Map<String, Object> map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId);
return ResultUtil.data(map);
} catch (ServiceException se) {
log.info(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.GOODS_ERROR.message(), e);
return ResultUtil.error(ResultCode.GOODS_ERROR);
}
}
}

View File

@@ -33,7 +33,7 @@ import java.util.List;
@Slf4j
@RestController
@Api(tags = "管理员")
@RequestMapping("/manager/im/passport/user")
@RequestMapping("/im/manager/im/passport/user")
@Validated
public class ImManagerController {
@Autowired

View File

@@ -21,7 +21,7 @@ import java.util.List;
*/
@RestController
@Api(tags = "Im消息接口")
@RequestMapping("/lili/imMessage")
@RequestMapping("/im/message")
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ImMessageController {
@@ -31,7 +31,6 @@ public class ImMessageController {
@GetMapping(value = "/{id}")
@ApiOperation(value = "查看Im消息详情")
public ResultMessage<ImMessage> get(@PathVariable String id) {
ImMessage imMessage = imMessageService.getById(id);
return new ResultUtil<ImMessage>().setData(imMessage);
}
@@ -39,14 +38,13 @@ public class ImMessageController {
@GetMapping
@ApiOperation(value = "分页获取Im消息")
public ResultMessage<List<ImMessage>> historyMessage(MessageQueryParams messageQueryParams) {
List<ImMessage> data = imMessageService.list(messageQueryParams.initQueryWrapper());
List<ImMessage> data = imMessageService.getList(messageQueryParams);
return new ResultUtil<List<ImMessage>>().setData(data);
}
@PostMapping
@ApiOperation(value = "新增Im消息")
public ResultMessage<ImMessage> save(ImMessage imMessage) {
if (imMessageService.save(imMessage)) {
return new ResultUtil<ImMessage>().setData(imMessage);
}
@@ -65,18 +63,27 @@ public class ImMessageController {
@DeleteMapping(value = "/{ids}")
@ApiOperation(value = "删除Im消息")
public ResultMessage<Object> delAllByIds(@PathVariable List ids) {
imMessageService.removeByIds(ids);
return ResultUtil.success(ResultCode.SUCCESS);
}
@GetMapping(value = "/newMessage")
@ApiOperation(value = "删除Im消息")
@ApiOperation(value = "查看是否有新消息")
public ResultMessage<Boolean> hasNewMessage(String accessToken) {
return ResultUtil.data(imMessageService.hasNewMessage(accessToken));
}
@GetMapping(value = "/unredMessage")
@ApiOperation(value = "获取所有未读消息")
public ResultMessage<Long> getUnreadMessageCount() {
return ResultUtil.data(imMessageService.unreadMessageCount());
}
@PutMapping(value = "/clean/unred")
@ApiOperation(value = "清除所有未读消息")
public ResultMessage<Object> cleanUnreadMessage() {
imMessageService.cleanUnreadMessage();
return ResultUtil.success();
}
}

View File

@@ -8,8 +8,10 @@ import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.im.entity.dos.ImTalk;
import cn.lili.modules.im.entity.vo.ImTalkVO;
import cn.lili.modules.im.service.ImTalkService;
import cn.lili.modules.store.service.StoreService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,13 +27,16 @@ import java.util.stream.Collectors;
*/
@RestController
@Api(tags = "聊天接口")
@RequestMapping("/lili/imTalk")
@RequestMapping("/im/talk")
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ImTalkController {
private final ImTalkService imTalkService;
@Autowired
private StoreService storeService;
@GetMapping(value = "/{id}")
@ApiOperation(value = "查看聊天详情")
public ResultMessage<ImTalk> get(@PathVariable String id) {
@@ -47,6 +52,13 @@ public class ImTalkController {
return ResultUtil.data(imTalkService.getTalkByUser(authUser.getId(), uid));
}
@GetMapping(value = "/by/user/{userId}")
@ApiOperation(value = "查看与某人聊天详情")
public ResultMessage<ImTalkVO> getByUser(@PathVariable String userId) {
AuthUser authUser = UserContext.getCurrentUser();
return ResultUtil.data(new ImTalkVO(imTalkService.getTalkByUser(authUser.getId(), userId), authUser.getId()));
}
@GetMapping(value = "/top")
@ApiOperation(value = "查看与某人聊天详情")
public ResultMessage top(String id, Boolean top) {
@@ -56,32 +68,15 @@ public class ImTalkController {
@GetMapping("/list")
@ApiOperation(value = "分页获取聊天")
public ResultMessage<List<ImTalkVO>> getByPage() {
AuthUser authUser = UserContext.getCurrentUser();
LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ImTalk::getUserId1, authUser.getId()).or().eq(ImTalk::getUserId2, authUser.getId());
List<ImTalk> imTalks = imTalkService.list(queryWrapper);
List<ImTalkVO> results = imTalks.stream().map(imTalk -> {
return new ImTalkVO(imTalk, authUser.getId());
}).collect(Collectors.toList());
return ResultUtil.data(results);
@ApiImplicitParam(name = "userName", value = "用户名称", paramType = "query", dataType = "String")
public ResultMessage<List<ImTalkVO>> getUserTalkList(String userName) {
return ResultUtil.data(imTalkService.getUserTalkList(userName));
}
@GetMapping("/store/list")
@ApiOperation(value = "分页获取商家聊天")
public ResultMessage<List<ImTalkVO>> getStoreTalkList() {
AuthUser authUser = UserContext.getCurrentUser();
LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ImTalk::getUserId1, authUser.getStoreId()).or().eq(ImTalk::getUserId2, authUser.getStoreId());
List<ImTalk> imTalks = imTalkService.list(queryWrapper);
List<ImTalkVO> results = imTalks.stream().map(imTalk -> {
return new ImTalkVO(imTalk, authUser.getStoreId());
}).collect(Collectors.toList());
return ResultUtil.data(results);
return ResultUtil.data(imTalkService.getStoreTalkList());
}
@DeleteMapping(value = "/{id}")

View File

@@ -5,16 +5,23 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.member.service.FootprintService;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.service.StoreService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -24,7 +31,7 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@Api(tags = "Im消息接口")
@RequestMapping("/lili/imUser")
@RequestMapping("/im/user")
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ImUserController {
@@ -34,6 +41,9 @@ public class ImUserController {
@Autowired
private StoreService storeService;
@Autowired
private FootprintService footprintService;
@GetMapping
@ApiOperation(value = "获取用户信息")
public ResultMessage<Member> getImUser() {
@@ -42,10 +52,30 @@ public class ImUserController {
}
@GetMapping("/store")
@ApiOperation(value = "获取用户信息")
@ApiOperation(value = "获取店铺信息")
public ResultMessage<Store> getStoreUser() {
AuthUser authUser = UserContext.getCurrentUser();
return ResultUtil.data(storeService.getById(authUser.getStoreId()));
}
@GetMapping("/{memberId}")
@ApiImplicitParam(name = "memberId", value = "店铺Id", required = true, dataType = "String", paramType = "path")
@ApiOperation(value = "获取用户信息")
public ResultMessage<Member> getImUserDetail(@PathVariable String memberId) {
return ResultUtil.data(memberService.getById(memberId));
}
@GetMapping("/store/{storeId}")
@ApiImplicitParam(name = "storeId", value = "店铺Id", required = true, dataType = "String", paramType = "path")
@ApiOperation(value = "获取店铺信息")
public ResultMessage<Store> getStoreUserDetail(@PathVariable String storeId) {
return ResultUtil.data(storeService.getById(storeId));
}
@GetMapping("/history")
@ApiOperation(value = "获取会员的历史足迹")
public ResultMessage<IPage<EsGoodsIndex>> getMemberHistory(FootPrintQueryParams params) {
return ResultUtil.data(footprintService.footPrintPage(params));
}
}

View File

@@ -25,7 +25,7 @@ import javax.validation.constraints.NotNull;
@Slf4j
@RestController
@Api(tags = "管理端,自定义分词接口")
@RequestMapping("/store/qa")
@RequestMapping("/im/store/qa")
public class QAStoreController {
@Autowired

View File

@@ -7,16 +7,20 @@ import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.SnowFlake;
import cn.lili.modules.im.config.CustomSpringConfigurator;
import cn.lili.modules.im.entity.dos.ImMessage;
import cn.lili.modules.im.entity.dos.ImTalk;
import cn.lili.modules.im.entity.enums.MessageResultType;
import cn.lili.modules.im.entity.vo.MessageOperation;
import cn.lili.modules.im.entity.vo.MessageVO;
import cn.lili.modules.im.service.ImMessageService;
import cn.lili.modules.im.service.ImTalkService;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.service.StoreService;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -50,6 +54,9 @@ public class WebSocketServer {
@Autowired
private StoreService storeService;
@Autowired
private ImTalkService imTalkService;
@Autowired
private Cache cache;
@@ -116,16 +123,12 @@ public class WebSocketServer {
break;
case MESSAGE:
//保存消息
ImMessage imMessage = new ImMessage();
imMessage.setFromUser(messageOperation.getFrom());
imMessage.setMessageType(messageOperation.getMessageType());
imMessage.setIsRead(false);
imMessage.setText(messageOperation.getContext());
imMessage.setTalkId(messageOperation.getTalkId());
imMessage.setCreateTime(new Date());
imMessage.setToUser(messageOperation.getTo());
imMessage.setId(SnowFlake.getIdStr());
ImMessage imMessage = new ImMessage(messageOperation);
imMessageService.save(imMessage);
//修改最后消息信息
imTalkService.update(new LambdaUpdateWrapper<ImTalk>().eq(ImTalk::getId,messageOperation.getTalkId()).set(ImTalk::getLastTalkMessage,messageOperation.getContext())
.set(ImTalk::getLastTalkTime,imMessage.getCreateTime())
.set(ImTalk::getLastMessageType,imMessage.getMessageType()));
//发送消息
sendMessage(messageOperation.getTo(), new MessageVO(MessageResultType.MESSAGE, imMessage));
break;