package com.xiaopeng.order.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.dto.account.UcUserInfo;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.api.feignClient.account.XpAppUserClient;
import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpOrderEvaluate;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.mapper.XpOrderEvaluateMapper;
import com.xiaopeng.order.model.query.OrderEvaluateManagementPageListQuery;
import com.xiaopeng.order.model.query.OrderEvaluatePageQuery;
import com.xiaopeng.order.model.vo.OrderEvaluateManagementPageListVO;
import com.xiaopeng.order.model.vo.OrderEvaluatePageVO;
import com.xiaopeng.order.service.IXpOrderEvaluateService;
import com.xiaopeng.order.service.IXpOrderService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
* 订单评价 服务实现类
*
*
* @author mitao
* @since 2026-02-03
*/
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpOrderEvaluateServiceImpl extends ServiceImpl implements IXpOrderEvaluateService {
private final XpAppUserClient xpAppUserClient;
private final XpVehicleClient xpVehicleClient;
private final IXpOrderService xpOrderService;
private final UserResourcesClient userResourcesClient;
private final XpSystemSettingClient systemSettingClient;
@Override
public PageInfo pageList(OrderEvaluatePageQuery query) {
// 1. 构建查询条件
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
// 时间范围查询
if (Objects.nonNull(query.getStartTime())) {
wrapper.ge(XpOrderEvaluate::getEvaluateTime, LocalDateTime.of(query.getStartTime(), LocalTime.MIN));
}
if (Objects.nonNull(query.getEndTime())) {
wrapper.le(XpOrderEvaluate::getEvaluateTime, LocalDateTime.of(query.getEndTime(), LocalTime.MAX));
}
// 评价分数查询(可选)
if (Objects.nonNull(query.getOrderRating())) {
wrapper.eq(XpOrderEvaluate::getOrderRating, query.getOrderRating());
}
// 排序:按评价时间降序
wrapper.orderByDesc(XpOrderEvaluate::getEvaluateTime);
// 2. 分页查询
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
PageInfo evaluatePage = this.page(pageInfo, wrapper);
if (CollectionUtils.isEmpty(evaluatePage.getRecords())) {
PageInfo resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize());
resultPage.setTotal(0L);
resultPage.setRecords(new ArrayList<>());
return resultPage;
}
// 3. 收集关联ID
Set userIds = new HashSet<>();
Set vehicleIds = new HashSet<>();
Set orderIds = new HashSet<>();
for (XpOrderEvaluate evaluate : evaluatePage.getRecords()) {
if (Objects.nonNull(evaluate.getAppUserId())) {
userIds.add(evaluate.getAppUserId());
}
if (Objects.nonNull(evaluate.getVehicleId())) {
vehicleIds.add(evaluate.getVehicleId());
}
if (Objects.nonNull(evaluate.getOrderId())) {
orderIds.add(evaluate.getOrderId());
}
}
// 4. 批量查询关联数据
Map userInfoMap = batchGetUsers(userIds);
Map vehicleMap = batchGetVehicles(vehicleIds);
Map orderMap = batchGetOrders(orderIds);
// 5. 根据查询条件过滤(手机号、车牌号)
List voList = evaluatePage.getRecords().stream()
.map(evaluate -> convertToPageVO(evaluate, userInfoMap, vehicleMap, orderMap))
.filter(vo -> filterByQuery(vo, query))
.collect(Collectors.toList());
// 6. 返回分页结果
PageInfo resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize());
resultPage.setTotal(evaluatePage.getTotal());
resultPage.setRecords(voList);
return resultPage;
}
@Override
public PageInfo managementPageList(OrderEvaluateManagementPageListQuery query) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.managementPageList(pageInfo, query);
if (list.isEmpty()) {
return new PageInfo<>();
}
List userIds = list.stream().map(OrderEvaluateManagementPageListVO::getUserId).collect(Collectors.toList());
Map userInfoMap = userResourcesClient.getUserListByUids(userIds, false);
for (OrderEvaluateManagementPageListVO orderEvaluateManagementPageListVO : list) {
if (userInfoMap != null && !userInfoMap.isEmpty()) {
UcUserInfo userInfo = userInfoMap.get(orderEvaluateManagementPageListVO.getUserId().toString());
if (userInfo != null) {
orderEvaluateManagementPageListVO.setPhoneNumber(userInfo.getMobile());
orderEvaluateManagementPageListVO.setNickName(userInfo.getNickName());
orderEvaluateManagementPageListVO.setHeadImage(userInfo.getHeadImg());
}
} else {
orderEvaluateManagementPageListVO.setPhoneNumber("19983174515");
orderEvaluateManagementPageListVO.setNickName("默认用户");
orderEvaluateManagementPageListVO.setHeadImage("[]");
}
systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId());
}
pageInfo.setRecords(list);
return pageInfo;
}
/**
* 批量获取用户信息
*/
private Map batchGetUsers(Set userIds) {
if (CollectionUtils.isEmpty(userIds)) {
return new HashMap<>();
}
return userResourcesClient.getUserListByUids(new ArrayList<>(userIds), false);
}
/**
* 批量获取车辆信息
*/
private Map batchGetVehicles(Set vehicleIds) {
if (CollectionUtils.isEmpty(vehicleIds)) {
return new HashMap<>();
}
try {
R> result = xpVehicleClient.listByIds(new ArrayList<>(vehicleIds));
if (Objects.nonNull(result) && Objects.nonNull(result.getData())) {
return result.getData().stream()
.collect(Collectors.toMap(XpVehicle::getId, Function.identity(), (a, b) -> a));
}
} catch (Exception e) {
log.error("批量获取车辆信息失败: {}", e.getMessage());
}
return new HashMap<>();
}
/**
* 批量获取订单信息
*/
private Map batchGetOrders(Set orderIds) {
if (CollectionUtils.isEmpty(orderIds)) {
return new HashMap<>();
}
List orders = xpOrderService.listByIds(new ArrayList<>(orderIds));
return orders.stream()
.collect(Collectors.toMap(XpOrder::getId, Function.identity(), (a, b) -> a));
}
/**
* VO转换
*/
private OrderEvaluatePageVO convertToPageVO(XpOrderEvaluate evaluate,
Map userInfoMap,
Map vehicleMap,
Map orderMap) {
OrderEvaluatePageVO vo = new OrderEvaluatePageVO();
vo.setId(evaluate.getId());
vo.setOrderId(evaluate.getOrderId());
vo.setVehicleId(evaluate.getVehicleId());
vo.setAppUserId(evaluate.getAppUserId());
vo.setOrderRating(evaluate.getOrderRating());
vo.setEvaluateTime(evaluate.getEvaluateTime());
// 用户信息
if (Objects.nonNull(evaluate.getAppUserId()) && userInfoMap != null && userInfoMap.containsKey(evaluate.getAppUserId().toString())) {
UcUserInfo userInfo = userInfoMap.get(evaluate.getAppUserId().toString());
vo.setNickName(userInfo.getNickName());
vo.setPhoneNumber(userInfo.getMobile());
}
// 车辆信息
if (Objects.nonNull(evaluate.getVehicleId()) && vehicleMap.containsKey(evaluate.getVehicleId())) {
XpVehicle vehicle = vehicleMap.get(evaluate.getVehicleId());
vo.setPlateNumber(vehicle.getPlateNumber());
}
// 订单信息
if (Objects.nonNull(evaluate.getOrderId()) && orderMap.containsKey(evaluate.getOrderId())) {
XpOrder order = orderMap.get(evaluate.getOrderId());
vo.setOrderNumber(order.getOrderNumber());
}
return vo;
}
/**
* 根据查询条件过滤
*/
private boolean filterByQuery(OrderEvaluatePageVO vo, OrderEvaluatePageQuery query) {
// 手机号过滤
if (StringUtils.isNotBlank(query.getPhoneNumber())) {
if (StringUtils.isBlank(vo.getPhoneNumber()) ||
!vo.getPhoneNumber().contains(query.getPhoneNumber())) {
return false;
}
}
// 车牌号过滤
if (StringUtils.isNotBlank(query.getPlateNumber())) {
if (StringUtils.isBlank(vo.getPlateNumber()) ||
!vo.getPlateNumber().contains(query.getPlateNumber())) {
return false;
}
}
return true;
}
}