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-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml
@@ -32,7 +32,7 @@ xou.id_card_front, xou.id_card_back, xou.driver_license, xou.certificate_of_no_criminal_record, xou.training_graduation_certificate, xou.is_deleted, xou.create_time, xou.update_time, xou.create_by from xp_operations_user xou left join xp_operations_role xor on xou.id = xor.operations_user_id left join xp_operations_role xore on xou.id = xore.operations_user_id where xou.is_deleted = 0 <if test="query.nickName != null and query.nickName != ''"> and xou.nick_name like concat('%',#{query.nickName},'%') @@ -41,7 +41,7 @@ and xou.phone_number like concat('%',#{query.phoneNumber},'%') </if> <if test="query.roleId != null"> and xor.role_id = #{query.roleId} and xore.role_id = #{query.roleId} </if> <if test="query.status != null"> and xou.status = #{query.status} 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-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
@@ -51,8 +51,7 @@ @ApiModelProperty(value = "任务描述图片") private String taskImage; @ApiModelProperty(value = "任务描述图片") private String belongUserIds; @ApiModelProperty(value = "车辆id") xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -55,6 +55,8 @@ public class XpTaskServiceImpl extends ServiceImpl<XpTaskMapper, XpTask> implements XpTaskService { @Autowired private RedissonClient redissonClient; @Autowired private XpErrorTypeMapper errorTypeMapper; /** * 常规任务类型映射 */ @@ -82,8 +84,7 @@ private XpVehiclePreparationMapper vehiclePreparationMapper; @Autowired private XpVehicleDetectionMapper vehicleDetectionMapper; @Autowired private XpErrorTypeMapper errorTypeMapper; @Autowired private XpVehicleCleanMapper vehicleCleanMapper; @Autowired @@ -774,6 +775,62 @@ public PageInfo<TaskManagementPageListVO> pageListManagement(TaskManagementPageListQuery query) { PageInfo<TaskManagementPageListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); List<TaskManagementPageListVO> list = this.baseMapper.pageListManagement(pageInfo, query); for (TaskManagementPageListVO taskManagementPageListVO : list) { if (taskManagementPageListVO.getTaskCategory() == 1) { switch (taskManagementPageListVO.getTaskTypeId()) { case "1": taskManagementPageListVO.setTaskTypeName("车辆检查"); break; case "2": taskManagementPageListVO.setTaskTypeName("车辆充电"); break; case "3": taskManagementPageListVO.setTaskTypeName("车辆整备"); break; case "4": taskManagementPageListVO.setTaskTypeName("整备洗车"); break; case "5": taskManagementPageListVO.setTaskTypeName("车辆维修"); break; case "6": taskManagementPageListVO.setTaskTypeName("车辆保养"); break; case "7": taskManagementPageListVO.setTaskTypeName("车辆保险到期"); break; case "8": taskManagementPageListVO.setTaskTypeName("车辆年检到期"); break; case "9": taskManagementPageListVO.setTaskTypeName("车辆运营资质到期"); break; default: taskManagementPageListVO.setTaskTypeName(""); break; } }else{ StringBuilder taskTypeName = new StringBuilder(); String[] typeIds = taskManagementPageListVO.getTaskTypeId().split(","); List<XpErrorType> xpErrorTypes = errorTypeMapper.selectList(new LambdaQueryWrapper<XpErrorType>() .in(XpErrorType::getId, Arrays.asList(typeIds)).orderByAsc(XpErrorType::getParentId)); List<XpErrorType> parents = new ArrayList<>(); for (XpErrorType xpErrorType : xpErrorTypes) { if (xpErrorType.getParentId() == 0) { parents.add(xpErrorType); } } for (XpErrorType parent : parents) { List<XpErrorType> children = xpErrorTypes.stream().filter(e -> e.getParentId().equals(parent.getId())).collect(Collectors.toList()); taskTypeName.append(parent.getErrorName()).append(">"); for (XpErrorType child : children) { taskTypeName.append(child.getErrorName()).append(";"); } } taskManagementPageListVO.setTaskTypeName(taskTypeName.substring(0, taskTypeName.length() - 1)); } } pageInfo.setRecords(list); return pageInfo; } @@ -794,6 +851,7 @@ XpTask task = this.getById(id); task.setAssigneeTime(LocalDateTime.now()); task.setHandleUserId(handlerUserId.toString()); task.setVehicleId(null); task.setAssigneeUserId(assigneeUserId); this.updateById(task); return R.ok(); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointManagementController.java
@@ -134,6 +134,7 @@ public R enableDisable(@RequestBody XpPointEnableDisableDto dto) { XpPoint xpPoint = xpPointService.getById(dto.getId()); xpPoint.setOperationStatus(dto.getOperationStatus()); xpPoint.setElectronicAreaId(null); xpPointService.updateById(xpPoint); return R.ok(); } xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPointMapper.xml
@@ -107,6 +107,7 @@ </select> <select id="pageList" resultType="com.xiaopeng.api.model.operation.XpPoint"> select xp.id,xp.point_number as pointNumber,xp.point_name as pointName,xp.point_poi as pointPoi, xp.point_address as pointAddress, xp.point_lon as pointLon,xp.point_lat as pointLat,xp.create_time as createTime,xp.create_by as createBy ,xp.parking_time_limit as parkingTimeLimit,xp.verification_status as verificationStatus,xp.operation_status as operationStatus from xp_point xp xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -950,16 +950,7 @@ throw new RuntimeException("订单状态错误"); } order.setStatus(8); // 计算完价格后 挑选优惠券 GetUserCouponDto getUserCouponDto = new GetUserCouponDto(); getUserCouponDto.setUserId(Long.valueOf(uid)); getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue()); R<UserCouponVo> userCouponVoR = xpAppUserCouponClient.getUserCoupon(getUserCouponDto); UserCouponVo userCouponVo = userCouponVoR.getData(); if (userCouponVo != null) { order.setCouponId(userCouponVo.getId()); order.setCouponMoney(BigDecimal.valueOf(userCouponVo.getMoney())); } order.setAppUserId(null); order.setTripEnd(LocalDateTime.now()); baseMapper.updateById(order); // 解绑用户与车辆关系 @@ -1201,6 +1192,7 @@ .add(order.getLongDistancemoney() != null ? order.getLongDistancemoney() : BigDecimal.ZERO) .add(order.getWaitMoney()!=null?order.getWaitMoney():BigDecimal.ZERO); order.setOrderMoney(orderMoney); order.setAppUserId(null); baseMapper.updateById(order); if (order.getCouponId() != null) { UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); @@ -1211,10 +1203,18 @@ useUserCouponDto.setUserCouponId(order.getCouponId()); xpAppUserCouponClient.useUserCoupon(useUserCouponDto); } // 计算完价格后 挑选优惠券 GetUserCouponDto getUserCouponDto = new GetUserCouponDto(); getUserCouponDto.setUserId(Long.valueOf(uid)); getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue()); R<UserCouponVo> userCouponVoR = xpAppUserCouponClient.getUserCoupon(getUserCouponDto); UserCouponVo userCouponVo = userCouponVoR.getData(); if (userCouponVo != null) { order.setCouponId(userCouponVo.getId()); order.setCouponMoney(BigDecimal.valueOf(userCouponVo.getMoney())); } order.setAppUserId(null); baseMapper.updateById(order); // 结束后的车辆操作 if(vehicle!=null){ // 生成新的巡游单子 回到最新巡游的初始起点位置 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档