package com.doumee.service.business.impl; import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckRequest; import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckResponse; 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.biz.system.SystemDictDataBiz; 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.core.wx.WxMiniConfig; import com.doumee.dao.business.*; import com.doumee.dao.business.model.*; 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.dao.web.request.CommentApplyRequest; import com.doumee.service.business.CommentService; import com.doumee.service.business.ZanService; import com.github.yulichang.wrapper.MPJLambdaWrapper; import me.chanjar.weixin.common.error.WxErrorException; 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 MemberMapper memberMapper; @Autowired private NoticeMapper noticeMapper; @Autowired private ZanService zanService; @Autowired private ApplicationEventPublisher applicationEventPublisher; @Autowired private MultifileMapper multifileMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Override public Comment apply(CommentApplyRequest comment, Integer memberId) { if (StringUtils.isNotBlank(comment.getContent())) { try { WxMaMsgSecCheckCheckRequest checkRequest = WxMaMsgSecCheckCheckRequest.builder() .version("2") .scene(3) .openid(getMemberOpenId(memberId)) .content(comment.getContent()) .build(); WxMaMsgSecCheckCheckResponse checkResponse = WxMiniConfig.wxMaService.getSecurityService().checkMessage(checkRequest); if (checkResponse.getResult() != null && checkResponse.getResult().getSuggest() != null) { String suggest = checkResponse.getResult().getSuggest(); if ("risky".equalsIgnoreCase(suggest)) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "评论内容包含违规信息,请修改后重新发布"); } } } catch (WxErrorException e) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "内容安全检测失败,请稍后重试"); } } Comment target = new Comment(); target.setCreateDate(new Date()); target.setEditDate(new Date()); target.setRemark(comment.getRemark()); target.setMemberId(memberId); target.setActivityId(comment.getActivityId()); target.setContent(comment.getContent()); target.setAnonymous(Constants.ONE); target.setStatus(Constants.ZERO); target.setType(Constants.ZERO); if (comment.getReplyId() != null){ Comment reply = commentMapper.selectJoinOne(Comment.class,new MPJLambdaWrapper() .selectAll(Comment.class) .selectAs(Member::getNickname,Comment::getReplyMemberNikeName) .leftJoin(Member.class,Member::getId,Comment::getMemberId) .eq(Comment::getId,comment.getReplyId()) ); reply = Optional.ofNullable(reply).orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "回复目标不存在")); target.setReplyId(reply.getId()); target.setCommentId(Objects.isNull(reply.getCommentId())?reply.getId():reply.getCommentId()); target.setType(Constants.ONE); target.setCommentMemberId(reply.getMemberId()); if(!Constants.equalsInteger(memberId,reply.getMemberId())){ Member member = memberMapper.selectById(memberId); //评论发送用户消息 //发送核销通知 Notice notice = Notice.getNotice( Constants.NoticeType.COMMENT, reply.getMemberId(), reply.getActivityId() ); notice.setContent(notice.getContent().replace("{param}",member.getNickname())); noticeMapper.insert(notice); } }else 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); String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() ; if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(comment.getMultifileList())){ String commentFile = path + systemDictDataBiz.queryByCode(Constants.OSS, Constants.COMMENT_FILE).getCode(); for (Multifile multifile:comment.getMultifileList()) { multifile.setCreateDate(new Date()); multifile.setEditDate(new Date()); multifile.setObjId(target.getId()); multifile.setObjType(Constants.MultiFile.COMMENT_FILE.getKey()); multifile.setFileFullUrl(commentFile + multifile.getFileurl()); } multifileMapper.insert(comment.getMultifileList()); target.setMultifileList(comment.getMultifileList()); } Member member = memberMapper.selectById(memberId); if(Objects.nonNull(member)){ target.setNikeName(member.getNickname()); if(StringUtils.isNotBlank(member.getImgurl())){ String memberFile = path + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILE).getCode(); target.setMemberImgUrl(memberFile + member.getImgurl()); } } target.setZanCount(Constants.ZERO); target.setZanStatus(Constants.ZERO); return target; } @Override public void deleteById(Integer id,Integer memberId) { Comment comment = commentMapper.selectById(id); if(Objects.isNull(comment)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "评论不存在"); } if(!Constants.equalsInteger(memberId,comment.getMemberId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "非您的评论无权限删除"); } commentMapper.update(new UpdateWrapper().lambda() .set(Comment::getIsdeleted,Constants.ONE) .eq(Comment::getId,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); if(Objects.isNull(pageWrap.getModel().getMemberId())){ queryWrapper.select(" 0 ",ActivityCommentDTO::getZanStatus); }else{ queryWrapper.select(" (select count(1) from zan z where z.OBJ_ID = t.id and z.MEMBER_ID = "+pageWrap.getModel().getMemberId()+" and z.ISDELETED = 0 and z.OBJ_TYPE = 1) ",ActivityCommentDTO::getZanStatus); } queryWrapper.select(" (select count(1) from zan z where z.OBJ_ID = t.id and z.ISDELETED = 0 and z.OBJ_TYPE = 0) ",ActivityCommentDTO::getZanCount); queryWrapper.selectAs(Member::getNickname,ActivityCommentDTO::getNikeName); 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()); queryWrapper.orderByAsc(Comment::getId); 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::getReplyId,ActivityReplyCommentDTO::getReplyId); replyWrapper.selectAs(Comment::getIsdeleted,ActivityReplyCommentDTO::getIsdeleted); if(Objects.isNull(pageWrap.getModel().getMemberId())){ replyWrapper.select(" 0 ",ActivityReplyCommentDTO::getZanStatus); }else{ replyWrapper.select(" (select count(1) from zan z where z.OBJ_ID = t.id and z.MEMBER_ID = "+pageWrap.getModel().getMemberId()+" and z.ISDELETED = 0 and z.OBJ_TYPE = 1) ",ActivityReplyCommentDTO::getZanStatus); } replyWrapper.select(" (select count(1) from zan z where z.OBJ_ID = t.id and z.ISDELETED = 0 and z.OBJ_TYPE = 0) ",ActivityReplyCommentDTO::getZanCount); replyWrapper.selectAs(Comment::getCommentId,ActivityReplyCommentDTO::getCommentId); replyWrapper.selectAs(Comment::getMemberId,ActivityReplyCommentDTO::getMemberId); replyWrapper.selectAs(Comment::getContent,ActivityReplyCommentDTO::getContent); replyWrapper.selectAs(Member::getNickname,ActivityReplyCommentDTO::getNikeName); replyWrapper.selectAs(Member::getImgurl,ActivityReplyCommentDTO::getMemberImgUrl); replyWrapper.selectCount(Comment::getId,ActivityReplyCommentDTO::getReplyCount); replyWrapper.selectMin(Comment::getCreateDate,ActivityReplyCommentDTO::getCreateDate); replyWrapper.select("reply.NICKNAME",ActivityReplyCommentDTO::getReplyMemberNikeName); replyWrapper.leftJoin(Member.class,Member::getId,Comment::getMemberId); replyWrapper.leftJoin("member reply on reply.id = t.REPLY_MEMBER_ID"); 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, replyWrapper); 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)); String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode(); String memberFile = path + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILE).getCode(); String commentFile = path + systemDictDataBiz.queryByCode(Constants.OSS, Constants.COMMENT_FILE).getCode(); List multifileList = multifileMapper.selectList(new QueryWrapper() .lambda() .eq(Multifile::getIsdeleted,Constants.ZERO) .in(Multifile::getObjId,commentIds) .eq(Multifile::getObjType,Constants.MultiFile.COMMENT_FILE.getKey()) .orderByDesc(Multifile::getId) ); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){ for (Multifile multifile:multifileList) { multifile.setFileFullUrl(commentFile + multifile.getFileurl()); } } result.getRecords().forEach(s->{ if(Constants.equalsInteger(s.getIsdeleted(),Constants.ONE)){ s.setContent("该评论已被原作者删除"); }else{ if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){ s.setMultifileList(multifileList.stream().filter(t -> t.getObjId().equals(s.getId())).collect(Collectors.toList())); } } s.setMemberImgUrl(StringUtils.isNotBlank(s.getMemberImgUrl())?memberFile+s.getMemberImgUrl():null); ZanDTO object = MapUtils.getObject(count, s.getId()); ActivityReplyCommentDTO replyCommentDTO = collect.get(s.getId()); if(Objects.nonNull(replyCommentDTO)){ ZanDTO replyZan = MapUtils.getObject(count, replyCommentDTO.getId()); replyCommentDTO.setZanCount(replyZan != null ? replyZan.getCount() : 0); if(Constants.equalsInteger(replyCommentDTO.getIsdeleted(),Constants.ONE)){ replyCommentDTO.setContent("该评论已被原作者删除"); }else{ if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){ replyCommentDTO.setMultifileList(multifileList.stream().filter(t -> t.getObjId().equals(replyCommentDTO.getId())).collect(Collectors.toList())); } } replyCommentDTO.setMemberImgUrl(StringUtils.isNotBlank(replyCommentDTO.getMemberImgUrl())?memberFile+replyCommentDTO.getMemberImgUrl():null); 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::getNikeName); queryWrapper.selectAs(Member::getImgurl,ActivityReplyCommentDTO::getMemberImgUrl); if(Objects.isNull(pageWrap.getModel().getMemberId())){ queryWrapper.select(" 0 ",ActivityReplyCommentDTO::getZanStatus); }else{ queryWrapper.select(" (select count(1) from zan z where z.OBJ_ID = t.id and z.MEMBER_ID = "+pageWrap.getModel().getMemberId()+" and z.ISDELETED = 0 and z.OBJ_TYPE = 1) ",ActivityReplyCommentDTO::getZanStatus); } queryWrapper.select(" (select count(1) from zan z where z.OBJ_ID = t.id and z.ISDELETED = 0 and z.OBJ_TYPE = 0) ",ActivityReplyCommentDTO::getZanCount); queryWrapper.select("reply.NICKNAME as replyMemberNikeName"); queryWrapper.leftJoin(Member.class,Member::getId,Comment::getMemberId); queryWrapper.leftJoin("member reply on reply.id = t.COMMENT_MEMBER_ID"); queryWrapper.eq(Comment::getType, Constants.ONE); queryWrapper.eq(Comment::getStatus, Constants.ZERO); queryWrapper.eq(Comment::getCommentId,pageWrap.getModel().getCommentId()); queryWrapper.orderByAsc(Comment::getId); IPage result = commentJoinMapper.selectJoinPage(page, ActivityReplyCommentDTO.class, queryWrapper); if (CollectionUtils.isEmpty(result.getRecords())){ return PageData.from(result); } String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode(); String memberFile = path + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILE).getCode(); String commentFile = path + systemDictDataBiz.queryByCode(Constants.OSS, Constants.COMMENT_FILE).getCode(); List multifileList = multifileMapper.selectList(new QueryWrapper() .lambda() .eq(Multifile::getIsdeleted,Constants.ZERO) .eq(Multifile::getObjId,pageWrap.getModel().getCommentId()) .eq(Multifile::getObjType,Constants.MultiFile.COMMENT_FILE.getKey()) .orderByDesc(Multifile::getId) ); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){ for (Multifile multifile:multifileList) { multifile.setFileFullUrl(commentFile + multifile.getFileurl()); } } List integerStream = result.getRecords().stream().map(s -> s.getId()).collect(Collectors.toList()); Map count = zanService.count(integerStream); result.getRecords().forEach(s->{ if(Constants.equalsInteger(s.getIsdeleted(),Constants.ONE)){ s.setContent("该评论已被原作者删除"); }else{ if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){ s.setMultifileList(multifileList.stream().filter(t -> t.getObjId().equals(s.getId())).collect(Collectors.toList())); } } s.setMemberImgUrl(StringUtils.isNotBlank(s.getMemberImgUrl())?memberFile+s.getMemberImgUrl():null); 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); } private String getMemberOpenId(Integer memberId) { Member member = memberMapper.selectById(memberId); return member != null ? member.getOpenId() : null; } }