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