package com.doumee.service.business.impl; import com.doumee.config.listener.event.IntegralEvent; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.Utils; import com.doumee.dao.business.CommentJoinMapper; import com.doumee.dao.business.CommentMapper; import com.doumee.dao.business.model.Activity; import com.doumee.dao.business.model.Comment; import com.doumee.dao.business.model.Member; import com.doumee.dao.web.dto.CommentDTO; import com.doumee.dao.web.dto.ZanDTO; import com.doumee.dao.web.dto.activity.ActivityCommentDTO; import com.doumee.dao.web.dto.activity.ActivityReplyCommentDTO; import com.doumee.service.business.CommentService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.doumee.service.business.MemberService; import com.doumee.service.business.ZanService; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 发现模块评论管理信息表(资讯、探店)Service实现 * @author 江蹄蹄 * @date 2023/03/21 15:48 */ @Service public class CommentServiceImpl implements CommentService { @Autowired private CommentMapper commentMapper; @Autowired private CommentJoinMapper commentJoinMapper; @Autowired private MemberService memberService; @Autowired private ZanService zanService; @Autowired private ApplicationEventPublisher applicationEventPublisher; @Override public Integer create(Comment comment,Integer memberId) { LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal(); Comment target = new Comment(); target.setCreator(loginUserInfo.getId()); target.setCreateDate(new Date()); target.setEditor(loginUserInfo.getId()); target.setEditDate(new Date()); target.setRemark(comment.getRemark()); target.setMemberId(loginUserInfo.getMemberId()); target.setActivityId(comment.getActivityId()); target.setContent(comment.getContent()); target.setAnonymous(comment.getAnonymous()); if (comment.getReplyId() != null){ Comment reply = commentMapper.selectById(comment.getReplyId()); reply = Optional.ofNullable(reply).orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "回复目标不存在")); target.setReplyId(reply.getId()); target.setReplyMemberId(reply.getMemberId()); target.setType(Constants.ONE); } if (comment.getCommentId() != null ){ Comment reply = commentMapper.selectById(comment.getCommentId()); reply = Optional.ofNullable(reply).orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "一级评论目标不存在")); target.setCommentId(reply.getCommentId()); target.setCommentMemberId(reply.getMemberId()); } target.setRecIntegral(new BigDecimal("0")); commentMapper.insert(target); IntegralEvent integralEvent = new IntegralEvent(this,target, Constants.CoffeeBeanTask.POST_COMMENTS,memberId); applicationEventPublisher.publishEvent(integralEvent); return comment.getId(); } @Override public void deleteById(Integer id) { commentMapper.deleteById(id); } @Override public void delete(Comment comment) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(comment); commentMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } commentMapper.deleteBatchIds(ids); } @Override public void updateById(Comment comment) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); comment.setEditor(user.getId()); comment.setEditDate(new Date()); commentMapper.updateById(comment); } @Override public void updateByIdInBatch(List comments) { if (CollectionUtils.isEmpty(comments)) { return; } for (Comment comment: comments) { this.updateById(comment); } } @Override public Comment findById(Integer id) { return commentMapper.selectById(id); } @Override public Comment findOne(Comment comment) { QueryWrapper wrapper = new QueryWrapper<>(comment); return commentMapper.selectOne(wrapper); } @Override public List findList(Comment comment) { QueryWrapper wrapper = new QueryWrapper<>(comment); return commentMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(Comment.class); queryWrapper.selectAs(Member::getNickname,Comment::getNikeName); queryWrapper.selectAs(Activity::getName,Comment::getActivityName); queryWrapper.selectAs(Activity::getType,Comment::getActivityType); queryWrapper.leftJoin(Member.class,Member::getId,Comment::getMemberId); queryWrapper.leftJoin(Activity.class,Activity::getId,Comment::getActivityId); queryWrapper.eq(pageWrap.getModel().getType()!=null,Comment::getType,pageWrap.getModel().getType()); queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getNikeName()),Member::getNickname,pageWrap.getModel().getNikeName()); queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getContent()),Comment::getContent,pageWrap.getModel().getContent()); queryWrapper.orderByDesc(Comment::getCreateDate); IPage result = commentJoinMapper.selectJoinPage(page, Comment.class, queryWrapper); return PageData.from(result); } @Override public Long count(Comment comment) { QueryWrapper wrapper = new QueryWrapper<>(comment); return commentMapper.selectCount(wrapper); } @Override public Long count(Date start, Date end, Integer memberId) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(Comment::getMemberId,memberId) .between(Comment::getCreateDate,start,end); return commentMapper.selectCount(wrapper); } @Override public PageData findActivityCommentDTOPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(Comment.class); queryWrapper.selectAs(Member::getNickname,ActivityCommentDTO::getNikeName); queryWrapper.selectAs(Member::getImgurl,ActivityCommentDTO::getMemberImgUrl); queryWrapper.selectAs(Member::getImgurl,ActivityCommentDTO::getMemberImgUrl); queryWrapper.leftJoin(Member.class,Member::getId,Comment::getMemberId); queryWrapper.eq(Comment::getType, Constants.ZERO); queryWrapper.eq(Comment::getStatus, Constants.ZERO); queryWrapper.eq(Comment::getActivityId,pageWrap.getModel().getActivityId()); IPage result = commentJoinMapper.selectJoinPage(page, ActivityCommentDTO.class, queryWrapper); if (CollectionUtils.isEmpty(result.getRecords())){ return PageData.from(result); } // 查询各个评论 的首条回复 和回复总条数 List commentIds = result.getRecords().stream().map(s -> s.getId()).collect(Collectors.toList()); MPJLambdaWrapper replyWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); replyWrapper.selectAs(Comment::getId,ActivityReplyCommentDTO::getId); replyWrapper.selectAs(Comment::getCommentId,ActivityReplyCommentDTO::getCommentId); replyWrapper.selectAs(Comment::getMemberId,ActivityReplyCommentDTO::getMemberId); replyWrapper.selectAs(Comment::getContent,ActivityReplyCommentDTO::getContent); replyWrapper.selectAs(Member::getNickname,ActivityReplyCommentDTO::getMemberNikeName); replyWrapper.selectAs(Member::getImgurl,ActivityReplyCommentDTO::getMemberImgUrl); replyWrapper.selectCount(Comment::getId,ActivityReplyCommentDTO::getReplyCount); replyWrapper.selectMin(Comment::getCreateDate,ActivityReplyCommentDTO::getCreateDate); replyWrapper.leftJoin(Member.class,Member::getId,Comment::getMemberId); replyWrapper.eq(Comment::getType, Constants.ONE); replyWrapper.eq(Comment::getStatus, Constants.ZERO); replyWrapper.in(Comment::getCommentId,commentIds); replyWrapper.groupBy(Comment::getCommentId); List activityCommentDTOS = commentJoinMapper.selectJoinList(ActivityReplyCommentDTO.class, queryWrapper); List integerStream = activityCommentDTOS.stream().map(s -> s.getId()).collect(Collectors.toList()); commentIds.addAll(integerStream); Map count = zanService.count(commentIds); Map collect = activityCommentDTOS.stream().collect(Collectors.toMap(s -> s.getCommentId(), s -> s)); result.getRecords().forEach(s->{ ZanDTO object = MapUtils.getObject(count, s.getId()); ActivityReplyCommentDTO replyCommentDTO = collect.get(s.getId()); ZanDTO replyZan = MapUtils.getObject(count, replyCommentDTO.getId()); replyCommentDTO.setZanCount(replyZan != null ? replyZan.getCount() : 0); s.setActivityReplyCommentDTO(replyCommentDTO); s.setReplyCount(replyCommentDTO.getReplyCount()); s.setZanCount(object != null ? object.getCount() : 0); }); return PageData.from(result); } @Override public PageData findActivityReplyCommentDTOPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(Comment.class); queryWrapper.selectAs(Member::getNickname,ActivityReplyCommentDTO::getMemberNikeName); queryWrapper.selectAs(Member::getImgurl,ActivityReplyCommentDTO::getMemberImgUrl); queryWrapper.select("reply.NICKNAME as replyMemberNikeName"); queryWrapper.leftJoin(Member.class,Member::getId,Comment::getMemberId); queryWrapper.leftJoin("member reply on reply.id = t.REPLY_MEMBER_ID"); queryWrapper.eq(Comment::getType, Constants.ONE); queryWrapper.eq(Comment::getStatus, Constants.ZERO); queryWrapper.eq(Comment::getCommentId,pageWrap.getModel().getCommentId()); IPage result = commentJoinMapper.selectJoinPage(page, ActivityReplyCommentDTO.class, queryWrapper); if (CollectionUtils.isEmpty(result.getRecords())){ return PageData.from(result); } List integerStream = result.getRecords().stream().map(s -> s.getId()).collect(Collectors.toList()); Map count = zanService.count(integerStream); result.getRecords().forEach(s->{ ZanDTO replyZan = MapUtils.getObject(count, s.getId()); s.setZanCount(replyZan != null ? replyZan.getCount() : 0); if (pageWrap.getModel().getCommentId().equals(s.getReplyId())){ s.setReplyMemberNikeName(null); } }); return PageData.from(result); } }