package com.xiaopeng.order.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; 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.UserResourcesDto; 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.account.XpAppUser; import com.xiaopeng.api.model.operation.XpInvitationCode; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.order.XpOrderEvaluate; import com.xiaopeng.api.vo.account.GetUserListByUidsVo; import com.xiaopeng.common.core.constant.HttpStatus; 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 javax.annotation.Resource; 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. 批量查询关联数据 JSONObject jsonObject = batchGetUsers(userIds); Map vehicleMap = batchGetVehicles(vehicleIds); Map orderMap = batchGetOrders(orderIds); // 5. 根据查询条件过滤(手机号、车牌号) List voList = evaluatePage.getRecords().stream() .map(evaluate -> convertToPageVO(evaluate, jsonObject, 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()); GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo(); getUserListByUidsVo.setUids(userIds); getUserListByUidsVo.setGetPreCarOwner(false); UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo); for (OrderEvaluateManagementPageListVO orderEvaluateManagementPageListVO : list) { Object data = userListByUids.getData(); // 转化为jsonArray JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data)); for (Object o : jsonArray) { // 转化为JsonObject JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o)); String mobile = jsonObject.getString("mobile"); String nickName = jsonObject.getString("nickName"); String headImage = jsonObject.getString("headImage"); orderEvaluateManagementPageListVO.setPhoneNumber(mobile); orderEvaluateManagementPageListVO.setNickName(nickName); orderEvaluateManagementPageListVO.setHeadImage(headImage); } systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId()); } pageInfo.setRecords(list); return pageInfo; } /** * 批量获取用户信息 */ private JSONObject batchGetUsers(Set userIds) { if (CollectionUtils.isEmpty(userIds)) { return new JSONObject(); } try { GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo(); getUserListByUidsVo.setUids(new ArrayList<>(userIds)); getUserListByUidsVo.setGetPreCarOwner(Boolean.TRUE); UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo); if (userListByUids.getCode().equals(HttpStatus.SUCCESS)) { return JSONObject.parseObject(userListByUids.getData().toString()); } } catch (Exception e) { log.error("批量获取用户信息失败: {}", e.getMessage()); } return new JSONObject(); } /** * 批量获取车辆信息 */ 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, JSONObject jsonObject, 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()) && jsonObject.containsKey(evaluate.getAppUserId().toString())) { JSONObject userInfo = jsonObject.getJSONObject(evaluate.getAppUserId().toString()); vo.setNickName(userInfo.getString("nickName")); vo.setPhoneNumber(userInfo.getString("mobile")); } // 车辆信息 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; } }