xp-robotaxi-account-boot/src/main/resources/mapper/account/SysUserMapper.xml
@@ -34,7 +34,7 @@ </resultMap> <resultMap id="RoleResult" type="com.xiaopeng.api.model.account.SysRole"> <id property="id" column="role_id" /> <id property="id" column="id" /> <result property="roleName" column="role_name" /> <result property="groupId" column="group_id" /> <result property="remarks" column="remarks" /> xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/AliPushMessageDTO.java
New file @@ -0,0 +1,25 @@ package com.xiaopeng.api.dto.pushMessage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @Data @ApiModel(value = "ali推送消息AliPushMessageDTO") public class AliPushMessageDTO implements Serializable { @ApiModelProperty(value = "设备类型") private Integer deviceType; @ApiModelProperty(value = "运维手机号") private String account; @ApiModelProperty(value = "标题") private String title; @ApiModelProperty(value = "消息内容") private String body; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/XpAliPushMessageClientFallbackFactory.java
New file @@ -0,0 +1,32 @@ package com.xiaopeng.api.factory.pushMessage; import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO; import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient; import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; /** * 消息Feign客户端降级工厂 * * @author mitao */ @Slf4j @Component public class XpAliPushMessageClientFallbackFactory implements FallbackFactory<XpAliPushMessageClient> { @Override public XpAliPushMessageClient create(Throwable cause) { log.error("阿里消息服务调用失败: {}", cause.getMessage()); return new XpAliPushMessageClient() { @Override public R<String> pushMessage(AliPushMessageDTO dto) { return R.fail("运维APP消息推送失败,"+cause.getMessage()); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/XpAliPushMessageClient.java
New file @@ -0,0 +1,33 @@ package com.xiaopeng.api.feignClient.pushMessage; import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO; import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.factory.pushMessage.XpAliPushMessageClientFallbackFactory; import com.xiaopeng.api.factory.pushMessage.XpPushMessageClientFallbackFactory; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * 消息Feign客户端 * * @author xiaochen */ @FeignClient(contextId = "XpAliPushMessageClient", value = ServiceNameConstantsEnum.XP_PUSH_MESSAGE_SERVICE, fallbackFactory = XpAliPushMessageClientFallbackFactory.class) public interface XpAliPushMessageClient { /** * 订单状态推送 * * @param dto 消息实体 * @return 订单状态推送 */ @PostMapping("/inner/v1/aliPush/pushMessage") R<String> pushMessage(@RequestBody AliPushMessageDTO dto); } xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -98,6 +98,11 @@ @GetMapping("/base/v1/mini-program/order/testOrder") public R testOrder(Long orderId, Integer status){ xpPricingService.testOrder(orderId, status); return R.ok(); } } xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/XpPricingService.java
@@ -45,6 +45,6 @@ */ Long saveOrder(XpOrderDto dto, String uid); void testOrder(Long orderId, Integer status); } xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -554,7 +554,7 @@ // 静默处理 不推单 if (isSilent) { // todo 用于测试流程,正式联调需要删除此代码 testOrder(orderId); // testOrder(orderId); return orderId; } @@ -677,25 +677,20 @@ * 测试阶段用于自动完成小程序的整个流程数据状态流转 * @param orderId */ private void testOrder(Long orderId){ ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10000)); poolExecutor.execute(()->{ XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData(); public void testOrder(Long orderId, Integer status){ XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData(); Long appUserId = xpOrder.getAppUserId(); if(2 == status){ if(xpOrder.getStatus() == 0){ return; } Long appUserId = xpOrder.getAppUserId(); xpOrder.setAppUserId(null); xpOrder.setStatus(2); xpOrder.setVehicleId(1L); xpOrder.setFleetId(2L); xpOrderClient.updateOrder(xpOrder); //等待5秒钟 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } } if(3 == status){ //修改状态为接驾中 xpOrder = xpOrderClient.queryOrderById(orderId).getData(); if(xpOrder.getStatus() == 0){ @@ -710,6 +705,7 @@ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":3}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); //推送车辆位置 dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":113.385848,\\\"lat\\\":23.156841}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendVehicleLocation(dto); //发送车辆到达起点的轨迹 @@ -749,13 +745,8 @@ messageDTO.setAppUserId(appUserId.toString()); messageDTO.setMessage(jsonObject.toJSONString()); xpPushMessageClient.sendRoute(messageDTO); //等待10秒钟 try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } } if(4 == status){ //司机到达起点 xpOrder = xpOrderClient.queryOrderById(orderId).getData(); if(xpOrder.getStatus() == 0){ @@ -764,18 +755,16 @@ xpOrder.setAppUserId(null); xpOrder.setStatus(4); xpOrderClient.updateOrder(xpOrder); SendMessageDTO dto = new SendMessageDTO(); dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":4}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); //推送车辆位置到起点 dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getStartLon() + ",\\\"lat\\\":" + xpOrder.getStartLat() + "}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendVehicleLocation(dto); //等待5秒钟 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } } if(5 == status){ //乘客上车 xpOrder = xpOrderClient.queryOrderById(orderId).getData(); if(xpOrder.getStatus() == 0){ @@ -788,38 +777,28 @@ xpOrder.setBoardingLon(xpOrder.getStartLon()); xpOrder.setBoardingAddress(xpOrder.getStartAddress()); xpOrderClient.updateOrder(xpOrder); SendMessageDTO dto = new SendMessageDTO(); dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":5}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); //等待5秒钟 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } //开始服务中 xpOrder.setStatus(6); xpOrder.setTripBegin(LocalDateTime.now()); xpOrderClient.updateOrder(xpOrder); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":6}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); //推送起点到终点的行驶轨迹 RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); routeAndFareDto = new RouteAndFareDto(); routeAndFareDto.setDestination(new LonLatDto(xpOrder.getEndLon(), xpOrder.getEndLat())); routeAndFareDto.setOrigin(new LonLatDto(xpOrder.getStartLon(), xpOrder.getStartLat())); routeAndFareDto.setOpenCityId(2L); routeVo = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData(); jsonObject = new com.alibaba.fastjson2.JSONObject(); RouteVo routeVo = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData(); com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject(); jsonObject.put("type", "ORDER_ROUTE"); jsonObject.put("timestamp", System.currentTimeMillis()); content = new com.alibaba.fastjson2.JSONObject(); com.alibaba.fastjson2.JSONObject content = new com.alibaba.fastjson2.JSONObject(); content.put("orderId", orderId); content.put("routeType", 2); route = new com.alibaba.fastjson2.JSONObject(); com.alibaba.fastjson2.JSONObject route = new com.alibaba.fastjson2.JSONObject(); route.put("distance", routeVo.getDistance()); route.put("duration", routeVo.getDuration()); route.put("routeID", routeVo.getRouteID()); collect = routeVo.getPolyline().stream().map(item->{ List<com.alibaba.fastjson2.JSONObject> collect = routeVo.getPolyline().stream().map(item->{ com.alibaba.fastjson2.JSONObject point = new com.alibaba.fastjson2.JSONObject(); point.put("latitude", item.getLatitude()); point.put("longitude", item.getLongitude()); @@ -828,18 +807,26 @@ route.put("polyline", collect); content.put("route", route.toJSONString()); jsonObject.put("content", content.toJSONString()); messageDTO = new SendMessageDTO(); SendMessageDTO messageDTO = new SendMessageDTO(); messageDTO.setAppUserId(appUserId.toString()); messageDTO.setMessage(jsonObject.toJSONString()); xpPushMessageClient.sendRoute(messageDTO); } if(6 == status){ //开始服务中 xpOrder.setAppUserId(null); xpOrder.setStatus(6); xpOrder.setTripBegin(LocalDateTime.now()); xpOrderClient.updateOrder(xpOrder); SendMessageDTO dto = new SendMessageDTO(); dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":6}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); } //等到10秒钟 try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } if(7 == status){ //乘客待下车 xpOrder.setAppUserId(null); xpOrder.setStatus(7); xpOrder.setTripEnd(LocalDateTime.now()); xpOrder.setGetoffLat(xpOrder.getEndLat()); @@ -859,7 +846,16 @@ xpOrder.setLongDistanceType(1); xpOrder.setLongDistancemoney(new BigDecimal(10)); xpOrderClient.updateOrder(xpOrder); //添加费用明细 //推送车辆位置到起点 SendMessageDTO dto = new SendMessageDTO(); dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getEndLon() + ",\\\"lat\\\":" + xpOrder.getEndLat() + "}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendVehicleLocation(dto); dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":7}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); } //添加费用明细 // XpOrderDetail detail = new XpOrderDetail(); // detail.setDetailType(1); // detail.setOrderId(orderId); @@ -874,36 +870,26 @@ // xpOrder //推送车辆位置到起点 dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getEndLon() + ",\\\"lat\\\":" + xpOrder.getEndLat() + "}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendVehicleLocation(dto); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":7}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); //等到5秒钟 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } if(8 == status){ //乘客待支付 xpOrder.setAppUserId(null); xpOrder.setStatus(8); xpOrderClient.updateOrder(xpOrder); SendMessageDTO dto = new SendMessageDTO(); dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":8}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); } //等到5秒钟 try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } if(9 == status){ //乘客支付成功 xpOrder.setAppUserId(null); xpOrder.setStatus(9); xpOrderClient.updateOrder(xpOrder); SendMessageDTO dto = new SendMessageDTO(); dto.setAppUserId(appUserId.toString()); dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":9}\",\"timestamp\":\"176569945845456\"}"); xpPushMessageClient.sendStatus(dto); }); } } } xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
@@ -127,10 +127,10 @@ Double startPrice = rule.getDouble("num1"); // 超出公里数价格 Double distancePrice = rule.getDouble("num4") * exceedDistance; Double distancePrice = new BigDecimal(rule.getDouble("num4") * exceedDistance).setScale(2,RoundingMode.HALF_UP).doubleValue(); // 超出时间价格 Double durationPrice = rule.getDouble("num5") * exceedTime; Double durationPrice = new BigDecimal(rule.getDouble("num5") * exceedTime).setScale(2,RoundingMode.HALF_UP).doubleValue(); startPrice = new BigDecimal(startPrice).multiply(BigDecimal.valueOf(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue(); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -706,7 +706,9 @@ List<XpOrderHistoryDateVO> dateVOS = map.entrySet().stream().map(entry -> { XpOrderHistoryDateVO xpOrderHistoryDateVO = new XpOrderHistoryDateVO(); xpOrderHistoryDateVO.setDateLabel(entry.getKey().toString()); xpOrderHistoryDateVO.setOrders(entry.getValue()); List<XpOrderHistoryListVO> value = entry.getValue(); value = value.stream().sorted(Comparator.comparing(XpOrderHistoryListVO::getTime).reversed()).collect(Collectors.toList()); xpOrderHistoryDateVO.setOrders(value); return xpOrderHistoryDateVO; }).collect(Collectors.toList()); xpOrderHistoryVO.setList(dateVOS); xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/AliPushController.java
New file @@ -0,0 +1,41 @@ package com.xiaopeng.pushMessage.controller; import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.pushMessage.utils.AliPushUtil; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @Api(tags = "阿里消息接口") @RestController @RequestMapping("") public class AliPushController { @Autowired private RedisService redisService; @Autowired private AliPushUtil aliPushUtil; /** * 运维端消息推送测试 * @return */ @GetMapping("/base/v1/aliPush/test") public R<String> test() throws Exception { String s = aliPushUtil.pushMessage(1, "13540694412", "测试", "{\"content\":\"测试消息\",\"strategy\":1\"type\":1,\"id\":1}"); return R.ok(s); } /** * 运维端消息推送 * @return */ @PostMapping("/inner/v1/aliPush/pushMessage") public R<String> pushMessage(@RequestBody AliPushMessageDTO dto) { String result = aliPushUtil.pushMessage(dto.getDeviceType(), dto.getAccount(), dto.getTitle(), dto.getBody()); return R.ok(result); } } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/AliPushUtil.java
@@ -9,12 +9,14 @@ import darabonba.core.client.ClientOverrideConfiguration; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //import javax.net.ssl.KeyManager; //import javax.net.ssl.X509TrustManager; import java.util.concurrent.CompletableFuture; @Slf4j @Component public class AliPushUtil { @Value("${ali.push.accessKeyId}") @@ -27,6 +29,10 @@ private Long appKey; @Value("${ali.push.iosAppKey}") private Long iosAppKey; @Value("${ali.push.channelId}") private String channelId; @Value("${ali.push.iosChannelId}") private String iosChannelId; /** * 消息类型 MESSAGE 消息 NOTICE 通知 */ @@ -50,62 +56,74 @@ /** * * 消息推送方法 * @param account 运维手机号 * @param title 标题 * @param body 消息内容 * @throws Exception */ public String pushMessage(Integer deviceType,String account, String title, String body) throws Exception { public String pushMessage(Integer deviceType,String account, String title, String body){ StaticCredentialProvider credentialProvider = StaticCredentialProvider.create( Credential.builder() .accessKeyId(accessKeyId) .accessKeySecret(accessKeySecret) .build() ); try { StaticCredentialProvider credentialProvider = StaticCredentialProvider.create( Credential.builder() .accessKeyId(accessKeyId) .accessKeySecret(accessKeySecret) .build() ); // Configure the Client try (AsyncClient client = AsyncClient.builder() .region(regionId) // Region ID .credentialsProvider(credentialProvider) .overrideConfiguration( ClientOverrideConfiguration.create() .setEndpointOverride("cloudpush.aliyuncs.com") ) .build()) { // Configure the Client try (AsyncClient client = AsyncClient.builder() .region(regionId) // Region ID .credentialsProvider(credentialProvider) .overrideConfiguration( ClientOverrideConfiguration.create() .setEndpointOverride("cloudpush.aliyuncs.com") ) .build()) { // 判断账号类型 Long appKeys = appKey; if(deviceType == 2){ appKeys = iosAppKey; // 判断账号类型 Long appKeys = appKey; if(deviceType == 2){ appKeys = iosAppKey; } String channelIds = channelId; if(deviceType == 2){ channelIds = iosChannelId; } PushRequest pushRequest = PushRequest.builder() .appKey(appKeys) .pushType(PUSH_TYPE) .deviceType(DEVICE_TYPE_ALL) .target(TARGET) .targetValue(account) .title(title) .body(body) .androidNotificationChannel(channelIds) .build(); CompletableFuture<PushResponse> response = client.push(pushRequest); PushResponse resp = response.get(); String json = new Gson().toJson(resp); log.info("运维APP-消息推送:{}",json); JSONObject jsonObject = JSONObject.parseObject(json); Integer statusCode = jsonObject.getInteger("statusCode"); if(statusCode == 200){ log.info("运维APP-消息推送成功"); JSONObject resultBody = jsonObject.getJSONObject("body"); return resultBody.getString("messageId"); }else{ log.info("运维APP-消息推送失败"); return null; } } PushRequest pushRequest = PushRequest.builder() .appKey(appKeys) .pushType(PUSH_TYPE) .deviceType(DEVICE_TYPE_ALL) .target(TARGET) .targetValue(account) .title(title) .body(body) .build(); CompletableFuture<PushResponse> response = client.push(pushRequest); PushResponse resp = response.get(); String json = new Gson().toJson(resp); log.info("运维APP-消息推送:{}",json); JSONObject jsonObject = JSONObject.parseObject(json); Integer statusCode = jsonObject.getInteger("statusCode"); if(statusCode == 200){ log.info("运维APP-消息推送成功"); JSONObject resultBody = jsonObject.getJSONObject("body"); return resultBody.getString("messageId"); }else{ log.info("运维APP-消息推送失败"); return null; } } catch (Exception e) { log.info("运维APP-消息推送失败-异常"); e.printStackTrace(); return null; } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -150,6 +150,11 @@ vehiclesCommandVo.setUid(xpOrder.getAppUserId()); vehiclesCommandVo.setVin(xpVehicle.getVehicleVin()); if("door".equals(dto.getDoorType())){ // 开启车门 判断是否为P档 Integer gearLevel = redisService.getCacheObject(CacheConstants.GEAR_LEVEL + xpVehicle.getVehicleVin()); if(gearLevel == null || gearLevel != 4){ throw new ServiceException("车辆非P档,无法开启车门", I18nKeyConstant.VEHICLE_NOT_P_GEAR); } vehiclesCommandVo.setCommandCode(VehiclesCommandEnum.DOOR_UNLOCK); }else { // 开启后备箱 判断是否为P档