package com.ruoyi.order.service.impl; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.feignClient.AppUserIntegralChangeClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserCar; import com.ruoyi.account.api.model.TAppUserIntegralChange; import com.ruoyi.chargingPile.api.domain.SiteMenu; import com.ruoyi.chargingPile.api.feignClient.PartnerClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TEvaluationAutoReply; import com.ruoyi.order.api.model.TOrderEvaluate; import com.ruoyi.order.api.model.TOrderEvaluateTag; import com.ruoyi.order.api.query.TOrderEvaluateQuery; import com.ruoyi.order.api.vo.SiteDetailEvaluateVO; import com.ruoyi.order.api.vo.TOrderEvaluateVO; import com.ruoyi.order.dto.GetOrderEvaluatePageList; import com.ruoyi.order.dto.GetOrderEvaluatePageListDTO; import com.ruoyi.order.dto.OrderEvaluateVo; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.mapper.TOrderEvaluateMapper; import com.ruoyi.order.mapper.TOrderEvaluateTagMapper; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TEvaluationAutoReplyService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.other.api.domain.TEvaluationTag; import com.ruoyi.other.api.domain.TIntegralRule; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.feignClient.*; import com.ruoyi.other.api.vo.TEvaluationTagVO; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.feignClient.SysUserRoleClient; import com.ruoyi.system.api.model.SysUserRoleVo; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author xiaochen * @since 2024-08-07 */ @Service public class TOrderEvaluateServiceImpl extends ServiceImpl implements TOrderEvaluateService { @Resource private TEvaluationTagClient evaluationTagClient; @Resource private AppUserClient appUserClient; @Resource private AppUserCarClient appUserCarClient; @Resource private TOrderEvaluateTagMapper orderEvaluateTagMapper; @Resource private TChargingOrderMapper chargingOrderMapper; @Resource private SiteClient siteClient; @Resource private TokenService tokenService; @Resource private TChargingOrderService chargingOrderService; @Resource private IntegralRuleClient integralRuleClient; @Resource private AppUserIntegralChangeClient appUserIntegralChangeClient; @Resource private VipClient vipClient; @Resource private SysUserClient sysUserClient; @Resource private PartnerClient partnerService; @Resource private UserSiteClient userSiteClient; @Resource private RoleSiteClient roleSiteClient; @Resource private SysUserRoleClient sysUserRoleClient; @Resource private TEvaluationAutoReplyService evaluationAutoReplyService; @Resource private TOrderEvaluateMapper orderEvaluateMapper; @Override public List getTagCount(Integer siteId) { // 查询标签列表 R> r = evaluationTagClient.getList(); List tagList = r.getData(); // 查询站点下的所有订单 List tChargingOrders = chargingOrderMapper.selectList(Wrappers.lambdaQuery(TChargingOrder.class) .eq(TChargingOrder::getSiteId, siteId)); if(CollectionUtils.isEmpty(tChargingOrders)){ tagList.forEach(e->e.setTagCount(0)); packageTagCount(0L,"有图",2,tagList); packageTagCount(0L,"好评",3,tagList); packageTagCount(0L,"中差评",4,tagList); return tagList; } List tagIds = tagList.stream().map(TEvaluationTagVO::getId).collect(Collectors.toList()); // 统计标签使用数量 List counts = orderEvaluateTagMapper.getCountByTagIds(tagIds); List ids = counts.stream().map(TEvaluationTagVO::getId).collect(Collectors.toList()); tagList.forEach(tag -> { if(ids.contains(tag.getId())){ counts.forEach(count -> { if (tag.getId().equals(count.getId())) { tag.setTagCount(count.getTagCount()); } }); }else{ tag.setTagCount(0); } }); tagList = tagList.stream().sorted(Comparator.comparing(TEvaluationTagVO::getTagCount).reversed()).collect(Collectors.toList()); // 统计有图,好评,中差评数量 long imgUrlCount = this.count(Wrappers.lambdaQuery(TOrderEvaluate.class) .isNotNull(TOrderEvaluate::getImgUrl) .ne(TOrderEvaluate::getImgUrl,"")); packageTagCount(imgUrlCount,"有图",2,tagList); long goodCount = this.count(Wrappers.lambdaQuery(TOrderEvaluate.class) .ge(TOrderEvaluate::getMark,4)); packageTagCount(goodCount,"好评",3,tagList); long badCount = this.count(Wrappers.lambdaQuery(TOrderEvaluate.class) .le(TOrderEvaluate::getMark,3)); packageTagCount(badCount,"中差评",4,tagList); return tagList; } @Override public PageInfo getTagList(TOrderEvaluateQuery query) { PageInfo pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); // 查询站点下的所有订单 List tChargingOrders = chargingOrderMapper.selectList(Wrappers.lambdaQuery(TChargingOrder.class) .eq(TChargingOrder::getSiteId, query.getSiteId())); if(CollectionUtils.isEmpty(tChargingOrders)){ return new PageInfo<>(); } List orderIds = tChargingOrders.stream().map(TChargingOrder::getId).collect(Collectors.toList()); query.setOrderIds(orderIds); List list = this.baseMapper.pageList(query,pageInfo); // 查询用户信息 List appUsers = appUserClient.getUserByIds(list.stream().map(TOrderEvaluateVO::getAppUserId).collect(Collectors.toList())).getData(); // 查询用户绑定车辆品牌 List appUserCars = appUserCarClient.getCarByIds(list.stream().map(TOrderEvaluateVO::getAppUserCarId).collect(Collectors.toList())).getData(); list.forEach(orderEvaluateVO -> { TAppUser appUser = appUsers.stream().filter(user -> user.getId().equals(orderEvaluateVO.getAppUserId())).findFirst().orElse(null); if(Objects.nonNull(appUser)){ orderEvaluateVO.setName(appUser.getName()); orderEvaluateVO.setAvatar(appUser.getAvatar()); } if(Objects.nonNull(orderEvaluateVO.getAppUserCarId())){ TAppUserCar appUserCar = appUserCars.stream().filter(car -> car.getId().equals(Long.parseLong(String.valueOf(orderEvaluateVO.getAppUserCarId())))).findFirst().orElse(null); if(Objects.nonNull(appUserCar)){ orderEvaluateVO.setCarName(appUserCar.getVehicleBrand()); } } }); pageInfo.setRecords(list); return pageInfo; } @Override public SiteDetailEvaluateVO getSiteDetailEveList(Integer siteId) { SiteDetailEvaluateVO siteDetailEvaluateVO = new SiteDetailEvaluateVO(); // 查询站点下的所有订单评价 List tChargingOrders = orderEvaluateMapper.getOrderEvaluateBySiteId(siteId); if(!CollectionUtils.isEmpty(tChargingOrders)){ siteDetailEvaluateVO.setOrderEvaluateVOS(tChargingOrders); // 统计好评率 long goodCount = tChargingOrders.stream().filter(orderEvaluateVO -> orderEvaluateVO.getMark()>=4).count(); BigDecimal reviewRate = new BigDecimal(goodCount).divide(new BigDecimal(tChargingOrders.size()),2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP); siteDetailEvaluateVO.setReviewRate(reviewRate); siteDetailEvaluateVO.setEvaluateCount(tChargingOrders.size()); List collect = tChargingOrders.stream().limit(3).collect(Collectors.toList()); // 查询评价下的标签 List orderIds = collect.stream().map(TOrderEvaluateVO::getId).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(orderIds)){ List tOrderEvaluateTags = orderEvaluateTagMapper.selectList(Wrappers.lambdaQuery(TOrderEvaluateTag.class) .in(TOrderEvaluateTag::getOrderEvaluateId, orderIds)); for (TOrderEvaluateVO tOrderEvaluateVO : collect) { List tOrderEvaluateTagList = tOrderEvaluateTags.stream().filter(e -> e.getOrderEvaluateId().equals(tOrderEvaluateVO.getId())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(tOrderEvaluateTagList)){ List tagIds = tOrderEvaluateTagList.stream().map(TOrderEvaluateTag::getEvaluationTagId).collect(Collectors.toList()); List data = evaluationTagClient.getListByIds(tagIds).getData(); tOrderEvaluateVO.setOrderEvaluateTags(data); } TAppUser data = appUserClient.getUserById(tOrderEvaluateVO.getAppUserId()).getData(); if(Objects.nonNull(data)){ tOrderEvaluateVO.setName(data.getName()); tOrderEvaluateVO.setAvatar(data.getAvatar()); } } } siteDetailEvaluateVO.setOrderEvaluateVOS(collect); } return siteDetailEvaluateVO; } /** * 统计有图,好评,中差评数量 * @param count * @param name * @param tagList */ private void packageTagCount(Long count,String name,Integer type,List tagList){ if(count>0){ TEvaluationTagVO evaluationTagVO = new TEvaluationTagVO(); evaluationTagVO.setName(name); evaluationTagVO.setTagCount(Integer.parseInt(String.valueOf(count))); evaluationTagVO.setType(type); tagList.add(evaluationTagVO); } } @Resource private PartnerClient partnerClient; /** * 获取充电评价列表 * @param pageList * @return */ @Override public PageInfo getPageList(GetOrderEvaluatePageList pageList) { PageInfo pageInfo = new PageInfo<>(pageList.getPageCurr(), pageList.getPageSize()); List evaluationTagIds = null; if(null != pageList.getEvaluateType()){ List data = evaluationTagClient.getTagList(pageList.getEvaluateType()).getData(); evaluationTagIds = data.stream().map(TEvaluationTagVO::getId).collect(Collectors.toList()); } //校验合作商权限 List siteIds = new ArrayList<>(); SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); Integer roleType = sysUser.getRoleType(); Integer objectId = sysUser.getObjectId(); if(null == pageList.getSiteId() || 0 == pageList.getSiteId()){ //合作商 if(roleType == 2){ Set data = partnerService.authSite(objectId, SiteMenu.CHARGE_EVALUATION.getValue()).getData(); siteIds = new ArrayList<>(data); }else{ //非管理员需要根据角色和用户配置查询允许的站点数据 if(!SecurityUtils.isAdmin(tokenService.getLoginUser().getUserid())){ List data = userSiteClient.getSiteIds(sysUser.getUserId()).getData(); List data2 = sysUserRoleClient.getRoleByUserId(sysUser.getUserId()).getData(); List data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData(); data.addAll(data1); siteIds = data; } } } List list = this.baseMapper.getPageList(pageList, evaluationTagIds, siteIds, pageInfo); for (GetOrderEvaluatePageListDTO dto : list) { TAppUser appUser = appUserClient.getUserById(dto.getAppUserId()).getData(); if(null != appUser){ dto.setAvatar(appUser.getAvatar()); String phone = appUser.getPhone(); dto.setPhone(phone.substring(0, 3) + "****" + phone.substring(6)); } List data1 = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData(); if(null != data1 && data1.size() > 0){ Site site = data1.get(0); dto.setSiteName(site.getName()); } List tOrderEvaluateTags = orderEvaluateTagMapper.selectList(new LambdaQueryWrapper().eq(TOrderEvaluateTag::getOrderEvaluateId, dto.getId())); List tagIds = tOrderEvaluateTags.stream().map(TOrderEvaluateTag::getEvaluationTagId).collect(Collectors.toList()); if(tagIds.size() > 0){ List data = evaluationTagClient.getListByIds(tagIds).getData(); List collect = data.stream().map(TEvaluationTag::getName).collect(Collectors.toList()); dto.setTags(collect); } dto.setAuthReply(roleType == 1 ? true : partnerService.authMenu(objectId, dto.getSiteId(), SiteMenu.CHARGE_EVALUATION_ANSWER.getValue())); dto.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, dto.getSiteId(), SiteMenu.CHARGE_EVALUATION_DEL.getValue())); } return pageInfo.setRecords(list); } /** * 评价订单 * @param query * @return */ @Override public AjaxResult addOrderEvaluate(OrderEvaluateVo query) { TOrderEvaluate orderEvaluate = this.getOne(new LambdaQueryWrapper().eq(TOrderEvaluate::getOrderId, query.getOrderId()) .eq(TOrderEvaluate::getOrderType, query.getOrderType()).eq(TOrderEvaluate::getDelFlag, 0)); if(null != orderEvaluate){ return AjaxResult.error("不能重复评价"); } orderEvaluate = new TOrderEvaluate(); BeanUtils.copyProperties(query, orderEvaluate); Long userid = tokenService.getLoginUserApplet().getUserId(); orderEvaluate.setAppUserId(userid); if(query.getOrderType() == 1){ TChargingOrder chargingOrder = chargingOrderService.getById(query.getOrderId()); orderEvaluate.setAppUserCarId(chargingOrder.getAppUserCarId()); } TAppUser appUser = appUserClient.getUserById(userid).getData(); //检测敏感词 String content = orderEvaluate.getContent(); if(StringUtils.isNotEmpty(content)){ Boolean data = appUserClient.sensitiveWordDetection(content, appUser.getWxOpenid()).getData(); if(Boolean.TRUE.equals(data)){ return AjaxResult.error("评价包含违规内容,请重新评价!"); } } orderEvaluate.setContent(content); this.save(orderEvaluate); applyAutoReply(orderEvaluate); List tagIds = query.getTagIds(); if(null != tagIds){ for (Integer tagId : tagIds) { TOrderEvaluateTag orderEvaluateTag = new TOrderEvaluateTag(); orderEvaluateTag.setOrderEvaluateId(orderEvaluate.getId()); orderEvaluateTag.setEvaluationTagId(tagId); orderEvaluateTagMapper.insert(orderEvaluateTag); } } //判断发放积分 文字+图片+5星好评 if(StringUtils.isNotEmpty(query.getContent()) && StringUtils.isNotEmpty(query.getImgUrl()) && 5 == query.getMark()){ TIntegralRule data = integralRuleClient.getSet().getData(); String credit = data.getCredit(); //积分 Integer num1 = JSON.parseObject(credit).getInteger("num1"); if(null != num1 && 0 < num1){ if(null != appUser.getVipId()){ TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); Integer doubleIntegration = vip.getDoubleIntegration(); //双倍积分 if(1 == doubleIntegration){ num1 *= 2; } } Integer points = appUser.getPoints(); appUser.setPoints(appUser.getPoints() + num1); appUserClient.updateAppUser(appUser); TChargingOrder chargingOrder = chargingOrderService.getById(orderEvaluate.getOrderId()); //积分变动明细 TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); appUserIntegralChange.setAppUserId(appUser.getId()); appUserIntegralChange.setChangeType(3); appUserIntegralChange.setHistoricalIntegral(points); appUserIntegralChange.setCurrentIntegral(points + num1); appUserIntegralChange.setCreateTime(LocalDateTime.now()); appUserIntegralChange.setOrderCode(chargingOrder.getCode()); appUserIntegralChange.setExtension(orderEvaluate.getOrderId().toString()); appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); } } return AjaxResult.success(); } private void applyAutoReply(TOrderEvaluate orderEvaluate) { TEvaluationAutoReply rule = evaluationAutoReplyService.matchRule(orderEvaluate.getContent(), orderEvaluate.getMark()); if (rule == null || StringUtils.isEmpty(rule.getReplyContent())) { return; } orderEvaluate.setEvaluationResponse(rule.getReplyContent()); orderEvaluate.setResponseTime(LocalDateTime.now()); this.updateById(orderEvaluate); } /** * 获取订单评价 * @param orderId 订单id * @param orderType 订单类型 * @return */ @Override public OrderEvaluateVo getOrderEvaluate(String orderId, Integer orderType) { TOrderEvaluate orderEvaluate = this.getOne(new LambdaQueryWrapper().eq(TOrderEvaluate::getOrderId, orderId).eq(TOrderEvaluate::getOrderType, orderType)); if(null != orderEvaluate){ Long userId = tokenService.getLoginUserApplet().getUserId(); if(!orderEvaluate.getAppUserId().equals(userId)){ throw new RuntimeException("权限不足"); } OrderEvaluateVo orderEvaluateVo = new OrderEvaluateVo(); BeanUtils.copyProperties(orderEvaluate, orderEvaluateVo); List tOrderEvaluateTags = orderEvaluateTagMapper.selectList(new LambdaQueryWrapper().eq(TOrderEvaluateTag::getOrderEvaluateId, orderEvaluate.getId())); List tagId = tOrderEvaluateTags.stream().map(TOrderEvaluateTag::getEvaluationTagId).collect(Collectors.toList()); if(tagId.size() > 0){ List data = evaluationTagClient.getListByIds(tagId).getData(); List collect = data.stream().map(TEvaluationTag::getName).collect(Collectors.toList()); orderEvaluateVo.setTagName(collect); } return orderEvaluateVo; } return null; } @Override public List> goodTop(List siteIds) { return this.baseMapper.goodTop(siteIds); } @Override public List> badTop(List siteIds) { return this.baseMapper.badTop(siteIds); } }