yyy
2026-05-11 b8def0e108af17b7ffe3bcfc65f5ffc7f999efb0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
package com.xiaopeng.order.service.impl;
 
import cn.hutool.core.util.StrUtil;
import com.xiaopeng.api.feignClient.operation.XpPricingClient;
import com.xiaopeng.api.feignClient.pushMessage.SubscribeMessageClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.operation.XpPricing;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.pushMessage.SendSubscribeMessageVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.MessageTemplateEnum;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.order.service.IXpOrderService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
 
@Service
@Component
public class BootCommonService   {
 
    @Resource
    private  XpPricingClient xpPricingClient;
    @Resource
    private  XpVehicleClient xpVehicleClient;
    @Resource
    private IXpOrderService xpOrderService;
    @Resource
    private  RedisService redisService;
    @Resource
    private SubscribeMessageClient subscribeMessageClient;
 
 
    public XpOrder getXpOrder(Long orderId) {
 
        XpOrder xpOrder = xpOrderService.getById(orderId);
        if (xpOrder == null) {
            throw new ServiceException("订单不存在");
        }
        return xpOrder;
    }
    public XpVehicle getXpVehicle(Long vehicleId) {
 
        R<XpVehicle>  xpVehicleR = xpVehicleClient.queryById(vehicleId);
        if (xpVehicleR.getCode() != R.SUCCESS || xpVehicleR.getData() == null) {
            throw new ServiceException("车型不存在");
        }
        return xpVehicleR.getData();
    }
    public String getVehicleModelId(Long orderId) {
        if(orderId!= null){
            XpOrder xpOrder = getXpOrder(orderId);
            XpVehicle xpVehicle = getXpVehicle(xpOrder.getVehicleId());
            return xpVehicle.getVehicleModel();
        }
        return null;
    }
 
    public XpPricing getPricingByCid(Long cityId, String vehicleModelId) {
        R<XpPricing> xpPricingR = xpPricingClient.getPricingByCid(cityId,vehicleModelId);
        if (xpPricingR.getCode() != R.SUCCESS || xpPricingR.getData() == null) {
            throw new ServiceException("当前城市未配置定价规则");
//            throw new ServiceException("当前区域未开通服务");
        }
        return xpPricingR.getData();
    }
    public XpPricing getXpPricing(Long orderId) {
        if(orderId != null){
            XpOrder xpOrder = getXpOrder(orderId);
            return getXpPricing(xpOrder.getCityId(),xpOrder.getVehicleId());
        }
        return null;
    }
    public XpPricing getXpPricing(Long cityId, Long vehicleId) {
        String vehicleModelId = null;
        if(vehicleId != null){
            XpVehicle xpVehicle = getXpVehicle(vehicleId);
            vehicleModelId = xpVehicle.getVehicleModel();
        }
        return getPricingByCid(cityId, vehicleModelId);
    }
    public XpPricing getXpPricing(Long cityId, Long orderId, Long vehicleId) {
        String vehicleModelId = null;
        if(vehicleId != null ){
            XpVehicle xpVehicle = getXpVehicle(vehicleId);
            vehicleModelId = xpVehicle.getVehicleModel();
        }
        if(vehicleModelId != null){
            if(orderId != null ){
                vehicleModelId = getVehicleModelId(orderId);
            }
        }
        return getPricingByCid(cityId, vehicleModelId);
    }
 
 
    /**
     * 设置缓存订单状态
     * 并发送微信通知
     * @param xpOrderId 订单id
     * @param order OrderStatusEnum 订单状态
     *  oldStatus 订单旧状态
     */
    public void setCache_orderStatus(Long xpOrderId, XpOrder order ,OrderStatusEnum status) {
        if(order == null){
            order = xpOrderService.getById(xpOrderId);
        }
        redisService.setCacheObject("ORDER_STATUS:" + xpOrderId, order.getStatus(), 24L, TimeUnit.HOURS);
 
        SendSubscribeMessageVo vo = new SendSubscribeMessageVo();
        vo.setUserId(order.getAppUserId());
        String json = null;
//        status = 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成
        if(order.getStatus() == OrderStatusEnum.PICK_UP.getCode()){//车辆接单/改派通知
            String plateNumber = null;
                // 查询车辆
            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
            if(xpVehicle != null){
                plateNumber = xpVehicle.getPlateNumber();
            }
            if(StrUtil.isNotBlank(plateNumber)){
                vo.setTemplateId(MessageTemplateEnum.E.getTemplateId());
                json = MessageTemplateEnum.E.getRemarks();
                json = json.replace("车牌号", plateNumber);
                json = json.replace("预计到达时间", LocalDateTime.now().toString());
            }
        }else if(order.getStatus() == OrderStatusEnum.PICK_UP_GUESTS.getCode()) { //车辆到达上车点通知
            String plateNumber = null;
            // 查询车辆
            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
            if(xpVehicle != null){
                plateNumber = xpVehicle.getPlateNumber();
            }
            if(StrUtil.isNotBlank(plateNumber)){
                vo.setTemplateId(MessageTemplateEnum.E.getTemplateId());
                json = MessageTemplateEnum.E.getRemarks();
                json = json.replace("车牌号", plateNumber);
                json = json.replace("预计驶离时间", LocalDateTime.now().toString());
            }
 
        }else{
//        status = 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成
            List<Integer> statusList = Arrays.asList(OrderStatusEnum.CANCELED.getCode(),OrderStatusEnum.PASSENGER_BOARDED.getCode(),
                    OrderStatusEnum.SEE_OFF_GUESTS.getCode(),OrderStatusEnum.APPROVAL_REJECTION.getCode(),OrderStatusEnum.PENDING_PAYMENT.getCode(),
                    OrderStatusEnum.COMPLETED.getCode()) ;
            if(statusList.contains(order.getStatus())){
                String bz = getBz(order);
                vo.setTemplateId(MessageTemplateEnum.A.getTemplateId());
                json = MessageTemplateEnum.A.getRemarks();
                json = json.replace("订单编号", order.getOrderNumber());
                json = json.replace("订单状态", OrderStatusEnum.getDescByCode(order.getStatus()));
                json = json.replace("备注", bz);
                json = json.replace("时间", LocalDateTime.now().toString());
                vo.setPage("");
            }
 
        }
        if(StrUtil.isNotBlank(json)){
            vo.setJson(json);
            subscribeMessageClient.sendSubscribeMessage(vo);
        }
    }
 
    private static String getBz(XpOrder order) {
        String bz = "";
        if(order.getStatus() == OrderStatusEnum.CANCELED.getCode()){
            bz = "订单已"+OrderStatusEnum.CANCELED.getDesc();
        }else if(order.getStatus() == OrderStatusEnum.PASSENGER_BOARDED.getCode()){
            bz = OrderStatusEnum.PASSENGER_BOARDED.getDesc();
        }else if(order.getStatus() == OrderStatusEnum.SEE_OFF_GUESTS.getCode()){
            bz = OrderStatusEnum.SEE_OFF_GUESTS.getDesc();
        }else if(order.getStatus() == OrderStatusEnum.APPROVAL_REJECTION.getCode()){
            bz = "订单"+OrderStatusEnum.APPROVAL_REJECTION.getDesc();
        }else if(order.getStatus() == OrderStatusEnum.PENDING_PAYMENT.getCode()){
            bz = "订单"+OrderStatusEnum.PENDING_PAYMENT.getDesc();
        }else if(order.getStatus() == OrderStatusEnum.COMPLETED.getCode()){
            bz = "订单"+OrderStatusEnum.COMPLETED.getDesc();
        }
        return bz;
    }
 
 
}