From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
---
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiProperties.java | 33
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpQualificationAuditService.java | 8
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/RequestResponseLoggingFilter.java | 14
xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/service/TokenService.java | 11
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/task/VehicleDocumentExpiryTask.java | 10
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/MinistryOfTransport.java | 124
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/GDMapGeocodingUtil.java | 29
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/FeignLoggingAspect.java | 6
xp-robotaxi-order-boot/src/main/resources/application-local.yml | 33
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpQualificationAuditMapper.java | 9
xp-robotaxi-vehicle-convoy-boot/src/main/resources/application-local.yml | 47
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/ConfigUtils.java | 16
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java | 30
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java | 11
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MinistryTransportProperties.java | 91 +
xp-robotaxi-map-boot/src/main/resources/application-local.yml | 24
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/util/UserCouponTask.java | 71
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketAuthHandler.java | 6
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java | 285 +-
xp-robotaxi-payment-boot/src/main/java/com/xiaopeng/payment/wx/utils/WxUtils.java | 5
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java | 5
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java | 11
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenResVo.java | 19
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/BootCommonService.java | 32
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/SubscribeMessageUtil.java | 9
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpVehicleModel.java | 16
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderMatchInfoDTO.java | 104 +
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java | 156 +
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/XpPricingUtil.java | 222 +-
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java | 168 +
xp-robotaxi-traffic-control-boot/src/main/resources/application-local.yml | 11
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/SSOClient.java | 9
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MinistryTransportProperties.java | 41
xp-robotaxi-maintenance-boot/src/main/resources/application-local.yml | 6
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java | 16
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/UserCouponVo.java | 3
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java | 40
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java | 97
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java | 279 +-
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpVehicleModelMapper.xml | 3
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/ActivityTask.java | 47
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/TokenConstants.java | 15
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/JwtUtils.java | 6
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java | 49
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/holiday/HolidayUtil.java | 10
xp-robotaxi-operation-boot/src/main/resources/application-local.yml | 13
xp-robotaxi-push-message-boot/src/main/resources/application-local.yml | 6
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java | 5
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpQualificationAuditController.java | 16
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleController.java | 7
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java | 12
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GaodeMapService.java | 25
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/holiday/HolidayUtil.java | 11
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiConfigHolder.java | 17
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java | 13
xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/MinistryTransportProperties.java | 19
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java | 1
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/HttpTestController.java | 52
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java | 31
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpTargetedServiceClientFallbackFactory.java | 7
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/holiday/HolidayUtil.java | 8
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpQualificationAuditMapper.xml | 14
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java | 247 +-
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java | 31
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java | 8
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/MinistryOfTransportOrderReporter.java | 164 +
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XtigerSSOController.java | 61
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java | 41
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderCreateInfoDTO.java | 98 +
xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/config/WebMvcConfig.java | 10
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml | 1
xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/AuthFilter.java | 16
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java | 4
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/SSOClientFallbackFactory.java | 3
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/AmapWalkingRouteUtil.java | 53
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java | 4
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java | 13
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/map/GDMapGeocodingUtil.java | 9
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/AsyncVehicleStateServiceImpl.java | 176 +
xp-robotaxi-account-boot/src/main/resources/application-local.yml | 4
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java | 206 +-
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpTestOrderServiceImpl.java | 12
xp-robotaxi-remote-driving-boot/src/main/resources/application-local.yml | 4
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/holiday/HolidayUtil.java | 8
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java | 271 ++
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java | 6
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenVo.java | 8
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java | 2
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java | 7
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpTargetedServiceClient.java | 10
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java | 8
xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/utils/MinistryOfTransport.java | 30
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/FareVo.java | 3
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java | 10
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/ActiveOrderServiceImpl.java | 19
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysPermissionServiceImpl.java | 2
xp-robotaxi-payment-boot/src/main/resources/application-local.yml | 4
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java | 2
xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java | 11
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTargetedServiceController.java | 14
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleListPage.java | 10
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/UserSubscribeMessageController.java | 24
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java | 694 ++++++-
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java | 2
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java | 373 ++++
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleBakController.java | 9
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java | 25
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/GDMapGeocodingUtil.java | 9
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/enums/MessageTemplateEnum.java | 24
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/impl/VehicleRtInfoServiceImpl.java | 19
xp-robotaxi-automatic-pilot-boot/src/main/resources/application-local.yml | 3
111 files changed, 3,838 insertions(+), 1,428 deletions(-)
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java
index 8a08e44..f8e2b11 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java
@@ -13,6 +13,8 @@
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
+import com.xiaopeng.common.security.annotation.Logical;
+import com.xiaopeng.common.security.annotation.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
@@ -41,6 +43,7 @@
@ApiOperation(value = "新增权限组", tags = {"管理后台-权限组管理"})
+ @RequiresPermissions(value = {"permissionGroup:add"}, logical = Logical.OR)
@PostMapping("/api/v1/group/add")
@AdminOperationLog(
businessType = AdminBusinessType.GROUP_MANAGEMENT,
@@ -54,6 +57,7 @@
}
@ApiOperation(value = "编辑权限组", tags = {"管理后台-权限组管理"})
+ @RequiresPermissions(value = {"permissionGroup:edit"}, logical = Logical.OR)
@PostMapping("/api/v1/group/edit")
@AdminOperationLog(
businessType = AdminBusinessType.GROUP_MANAGEMENT,
@@ -67,6 +71,7 @@
}
@ApiOperation(value = "权限组详情", tags = {"管理后台-权限组管理"})
+ @RequiresPermissions(value = {"permissionGroup:info"}, logical = Logical.OR)
@GetMapping("/api/v1/group/queryById")
public R<SysGroupDetailVO> queryById(@ApiParam(value = "权限组id", required = true) @RequestParam Long id) {
SysGroupDetailVO detail = sysGroupService.getGroupDetail(id);
@@ -74,6 +79,7 @@
}
@ApiOperation(value = "权限组分页列表", tags = {"管理后台-权限组管理"})
+ @RequiresPermissions(value = {"permissionGroup:list"}, logical = Logical.OR)
@PostMapping("/api/v1/group/pageList")
public R<PageInfo<SysGroupPageVO>> pageList(@Validated @RequestBody SysGroupPageQuery query) {
PageInfo<SysGroupPageVO> pageInfo = sysGroupService.pageList(query);
@@ -88,6 +94,7 @@
}
@ApiOperation(value = "删除权限组", tags = {"管理后台-权限组管理"})
+ @RequiresPermissions(value = {"permissionGroup:delete"}, logical = Logical.OR)
@DeleteMapping("/api/v1/group")
@ApiImplicitParam(name = "id", value = "权限组ID")
@AdminOperationLog(
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleBakController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleBakController.java
index a1eb1a3..b1293cd 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleBakController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleBakController.java
@@ -59,8 +59,6 @@
- @RequiresPermissions(value = {"/systemUserManagement", "/systemUserManagement/add", "/systemUserManagement/update", "/roleManagement", "/partners",
- "/partners/add", "/partners/seleete", "/partners/update"}, logical = Logical.OR)
@ApiOperation(value = "获取角色列表", tags = {"管理后台-系统用户管理"})
@GetMapping("/list")
public AjaxResult list() {
@@ -69,7 +67,6 @@
}
- @RequiresPermissions(value = {"/roleManagement"}, logical = Logical.OR)
@ResponseBody
@GetMapping("/listPage")
public AjaxResult listPage(String name, BasePage basePage) {
@@ -88,7 +85,6 @@
}
- @RequiresPermissions(value = {"/roleManagement/add"}, logical = Logical.OR)
@ResponseBody
@PostMapping("/roleAdd")
@ApiOperation(value = "添加角色", tags = {"管理后台-角色管理"})
@@ -115,7 +111,6 @@
}
- @RequiresPermissions(value = {"/roleManagement/info", "/roleManagement/update"}, logical = Logical.OR)
@GetMapping("/roleInfo")
public AjaxResult roleInfo(@RequestParam Long id) {
SysRoleBak role = roleService.selectRoleById(id);
@@ -151,7 +146,6 @@
}
- @RequiresPermissions(value = {"/roleManagement/update"}, logical = Logical.OR)
@PostMapping("/roleUpdate")
public AjaxResult roleUpdate(@Validated @RequestBody RoleUpdateDto dto) {
SysRoleBak role = new SysRoleBak();
@@ -196,7 +190,6 @@
/**
* 删除角色
*/
- @RequiresPermissions(value = {"/roleManagement/del"}, logical = Logical.OR)
@DeleteMapping("/{roleIds}")
public AjaxResult remove(@PathVariable Long[] roleIds) {
return toAjax(roleService.deleteRoleByIds(roleIds));
@@ -206,7 +199,6 @@
/**
* 查询已分配用户角色列表
*/
- @RequiresPermissions("/roleManagement")
@GetMapping("/authUser/allocatedList")
public TableDataInfo allocatedList(SysUser user) {
startPage();
@@ -217,7 +209,6 @@
/**
* 查询未分配用户角色列表
*/
- @RequiresPermissions("/roleManagement")
@GetMapping("/authUser/unallocatedList")
public TableDataInfo unallocatedList(SysUser user) {
startPage();
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleController.java
index 5c560b7..fd95979 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleController.java
@@ -13,6 +13,8 @@
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
+import com.xiaopeng.common.security.annotation.Logical;
+import com.xiaopeng.common.security.annotation.RequiresPermissions;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
@@ -39,6 +41,7 @@
@ApiOperation(value = "新增角色", tags = {"管理后台-角色管理"})
+ @RequiresPermissions(value = {"role:add"}, logical = Logical.OR)
@PostMapping("/api/v1/role/add")
@AdminOperationLog(
businessType = AdminBusinessType.ROLE_MANAGEMENT,
@@ -52,6 +55,7 @@
}
@ApiOperation(value = "编辑角色", tags = {"管理后台-角色管理"})
+ @RequiresPermissions(value = {"role:edit"}, logical = Logical.OR)
@PostMapping("/api/v1/role/edit")
@AdminOperationLog(
businessType = AdminBusinessType.ROLE_MANAGEMENT,
@@ -65,6 +69,7 @@
}
@ApiOperation(value = "角色详情", tags = {"管理后台-角色管理"})
+ @RequiresPermissions(value = {"role:info"}, logical = Logical.OR)
@GetMapping("/api/v1/role/queryById")
public R<SysRoleDetailVO> queryById(@ApiParam(value = "角色id", required = true) @RequestParam Long id) {
SysRoleDetailVO detail = sysRoleService.getRoleDetail(id);
@@ -72,6 +77,7 @@
}
@ApiOperation(value = "角色分页列表", tags = {"管理后台-角色管理"})
+ @RequiresPermissions(value = {"role:list"}, logical = Logical.OR)
@PostMapping("/api/v1/role/pageList")
public R<PageInfo<SysRolePageVO>> pageList(@Validated @RequestBody SysRolePageQuery query) {
PageInfo<SysRolePageVO> pageInfo = sysRoleService.pageList(query);
@@ -79,6 +85,7 @@
}
@ApiOperation(value = "删除角色", tags = {"管理后台-角色管理"})
+ @RequiresPermissions(value = {"role:delete"}, logical = Logical.OR)
@DeleteMapping("/api/v1/role/delete/{id}")
@AdminOperationLog(
businessType = AdminBusinessType.ROLE_MANAGEMENT,
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
index 8e6f9b9..f78e638 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
@@ -25,6 +25,8 @@
import com.xiaopeng.common.log.enums.AdminOperationType;
import com.xiaopeng.common.log.enums.BusinessType;
import com.xiaopeng.common.redis.service.RedisService;
+import com.xiaopeng.common.security.annotation.Logical;
+import com.xiaopeng.common.security.annotation.RequiresPermissions;
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.common.security.utils.SecurityUtils;
import io.swagger.annotations.ApiOperation;
@@ -87,6 +89,7 @@
/**
* 获取用户列表
*/
+ @RequiresPermissions(value = {"sysUser:list"}, logical = Logical.OR)
@GetMapping("/api/v1/sys-user/pageList")
@ApiOperation(value = "账号管理分页列表", tags = {"管理后台-账号管理"})
public AjaxResult<PageInfo<SysUser>> list(final SysUserListQuery sysUserListQuery) {
@@ -102,6 +105,9 @@
});
return AjaxResult.success(page);
}
+
+
+
/**
* 获取用户不分页列表
*/
@@ -124,7 +130,7 @@
/**
* 新增用户
*/
- @Log(title = "帐号管理", businessType = BusinessType.INSERT)
+ @RequiresPermissions(value = {"sysUser:add"}, logical = Logical.OR)
@PostMapping("/api/v1/sys-user/add")
@ApiOperation(value = "添加帐号", tags = {"管理后台-帐号管理"})
@AdminOperationLog(
@@ -234,6 +240,7 @@
/**
* 修改用户
*/
+ @RequiresPermissions(value = {"sysUser:edit"}, logical = Logical.OR)
@PutMapping("/api/v1/sys-user/edit")
@ApiOperation(value = "编辑帐号", tags = {"管理后台-帐号管理"})
@AdminOperationLog(
@@ -278,9 +285,12 @@
@Resource
private TokenService tokenService;
+
+
/**
* 删除用户
*/
+ @RequiresPermissions(value = {"sysUser:delete"}, logical = Logical.OR)
@DeleteMapping("/api/v1/sys-user/{userIds}")
@ApiOperation(value = "删除账号", tags = {"管理后台-帐号管理"})
@AdminOperationLog(
@@ -296,9 +306,10 @@
return toAjax(userService.deleteUserByIds(userIds));
}
-
+
+ @RequiresPermissions(value = {"sysUser:disable"}, logical = Logical.OR)
@PostMapping("/api/v1/sys-user/switchStatus/{id}")
@ApiOperation(value = "账号管理--禁用/启用", tags = {"管理后台-帐号管理"})
@AdminOperationLog(
@@ -380,6 +391,7 @@
/**
* 重置密码
*/
+ @RequiresPermissions(value = {"sysUser:resetPassword"}, logical = Logical.OR)
@PutMapping("/api/v1/sys-user/rePassword")
@ApiOperation(value = "重置密码", tags = {"管理后台-帐号管理"})
@AdminOperationLog(
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
index fa78e0f..fd94396 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
@@ -56,6 +56,7 @@
@Resource
private ISysUserService sysUserService;
+
@Resource
private IXpOperationsUserService xpOperationsUserService;
@@ -74,24 +75,24 @@
// private EncryptionDecryptionUtil encryptionDecryptionUtil;
- @ApiOperation(value = "用户登录", tags = "管理后台-用户登录")
- @PostMapping("/base/v1/login")
- public R<?> login(@RequestBody LoginBody form, HttpServletRequest request) {
- // 用户登录
- LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request);
- boolean phoneDesensitization = sysGroupService.getPhoneDesensitization();
- userInfo.setPhoneDesensitizationExempt(phoneDesensitization);
- HashMap<String, Object> map = new HashMap<>();
- map.put("token", tokenService.createToken(userInfo));
- List<SysRole> roles = userInfo.getSysUser().getRoles();
- // if (CollectionUtils.isEmpty(roles)) {
- // throw new ServiceException("请关联角色!", I18nKeyConstant.LOGIN_ROLE_NOT_BIND);
- // }
- // map.put("roleName",roles.get(0).getRoleName());
- map.put("info", userInfo);
- // 修改用户最后登录时间
- return R.ok(map);
- }
+// @ApiOperation(value = "用户登录", tags = "管理后台-用户登录")
+// @PostMapping("/base/v1/login")
+// public R<?> login(@RequestBody LoginBody form, HttpServletRequest request) {
+// // 用户登录
+// LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request);
+// boolean phoneDesensitization = sysGroupService.getPhoneDesensitization();
+// userInfo.setPhoneDesensitizationExempt(phoneDesensitization);
+// HashMap<String, Object> map = new HashMap<>();
+// map.put("token", tokenService.createToken(userInfo));
+// List<SysRole> roles = userInfo.getSysUser().getRoles();
+// // if (CollectionUtils.isEmpty(roles)) {
+// // throw new ServiceException("请关联角色!", I18nKeyConstant.LOGIN_ROLE_NOT_BIND);
+// // }
+// // map.put("roleName",roles.get(0).getRoleName());
+// map.put("info", userInfo);
+// // 修改用户最后登录时间
+// return R.ok(map);
+// }
/* @ApiOperation(value = "解密测试", tags = "管理后台-用户登录")
@PostMapping("/base/v1/decrypted")
public R<?> decrypted(@RequestBody LoginBody form, HttpServletRequest request) {
@@ -122,93 +123,96 @@
response.setHeader("xps", encrypt.getString("aes_key"));
return R.ok(encrypt.getString("content"));
}*/
- @ApiOperation(value = "账号密码登录", tags = {"运维APP登录"})
- @PostMapping("/maintenance-app/base/v1/operationPasswordLogin")
- public R<?> operationPasswordLogin(@RequestBody AppLoginPasswordDTO appLoginPasswordDTO, HttpServletRequest request) {
- // 用户登录
- LoginOperationUser userInfo = sysLoginService.operationPasswordLogin(appLoginPasswordDTO.getPhoneNumber(), appLoginPasswordDTO.getPassword(), appLoginPasswordDTO.getDeviceType(), request);
- HashMap<String, Object> map = new HashMap<>();
- map.put("token", tokenService.createOperationUserToken(userInfo));
-// List<SysRole> roles = userInfo.getXpOperationsUser().getRoles();
-// if (CollectionUtils.isEmpty(roles)) {
-// return R.fail("请关联角色!");
+// @ApiOperation(value = "账号密码登录", tags = {"运维APP登录"})
+// @PostMapping("/maintenance-app/base/v1/operationPasswordLogin")
+// public R<?> operationPasswordLogin(@RequestBody AppLoginPasswordDTO appLoginPasswordDTO, HttpServletRequest request) {
+// // 用户登录
+// LoginOperationUser userInfo = sysLoginService.operationPasswordLogin(appLoginPasswordDTO.getPhoneNumber(), appLoginPasswordDTO.getPassword(), appLoginPasswordDTO.getDeviceType(), request);
+// HashMap<String, Object> map = new HashMap<>();
+// map.put("token", tokenService.createOperationUserToken(userInfo));
+//// List<SysRole> roles = userInfo.getXpOperationsUser().getRoles();
+//// if (CollectionUtils.isEmpty(roles)) {
+//// return R.fail("请关联角色!");
+//// }
+//// map.put("roleName", roles.get(0).getRoleName());
+// map.put("info", userInfo);
+// return R.ok(map);
+// }
+
+// @ApiOperation(value = "手机验证码登录", tags = {"运维APP登录"})
+// @PostMapping("/maintenance-app/base/v1/verificationCodeLogin")
+// public R<?> verificationCodeLogin(@RequestBody AppLoginCodeDTO appLoginCodeDTO, HttpServletRequest request) {
+// // 用户登录
+// LoginOperationUser userInfo = sysLoginService.verificationCodeLogin(appLoginCodeDTO.getPhoneNumber(), appLoginCodeDTO.getVerificationCode(),appLoginCodeDTO.getDeviceType(), request);
+// HashMap<String, Object> map = new HashMap<>();
+// map.put("token", tokenService.createOperationUserToken(userInfo));
+//// List<SysRole> roles = userInfo.getXpOperationsUser().getRoles();
+//// if (CollectionUtils.isEmpty(roles)) {
+//// return R.fail("请关联角色!");
+//// }
+//// map.put("roleName", roles.get(0).getRoleName());
+// map.put("info", userInfo);
+// return R.ok(map);
+// }
+
+// @ApiOperation(value = "获取手机验证码", tags = {"运维APP登录"})
+// @PostMapping("/maintenance-app/base/v1/getVerificationCode")
+// public R<?> verificationCodeLogin(@RequestBody AppLoginGetCodeDTO appLoginPasswordDTO) {
+// if (StringUtils.isBlank(appLoginPasswordDTO.getPhoneNumber())) {
+// return R.fail("手机号不能为空!");
// }
-// map.put("roleName", roles.get(0).getRoleName());
- map.put("info", userInfo);
- return R.ok(map);
- }
-
- @ApiOperation(value = "手机验证码登录", tags = {"运维APP登录"})
- @PostMapping("/maintenance-app/base/v1/verificationCodeLogin")
- public R<?> verificationCodeLogin(@RequestBody AppLoginCodeDTO appLoginCodeDTO, HttpServletRequest request) {
- // 用户登录
- LoginOperationUser userInfo = sysLoginService.verificationCodeLogin(appLoginCodeDTO.getPhoneNumber(), appLoginCodeDTO.getVerificationCode(),appLoginCodeDTO.getDeviceType(), request);
- HashMap<String, Object> map = new HashMap<>();
- map.put("token", tokenService.createOperationUserToken(userInfo));
-// List<SysRole> roles = userInfo.getXpOperationsUser().getRoles();
-// if (CollectionUtils.isEmpty(roles)) {
-// return R.fail("请关联角色!");
+// XpOperationsUser xpOperationsUser = xpOperationsUserService.lambdaQuery()
+// .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(appLoginPasswordDTO.getPhoneNumber()))
+// .last("limit 1").one();
+// if (xpOperationsUser == null) {
+// return R.fail("账号不存在!");
// }
-// map.put("roleName", roles.get(0).getRoleName());
- map.put("info", userInfo);
- return R.ok(map);
- }
+// if (!xpOperationsUser.getStatus()) {
+// return R.fail("账号已禁用!");
+// }
+// // 生成6位数短信验证码
+// String code = String.valueOf((int) (Math.random() * 1000000));
+// String codeType = "";
+// switch (appLoginPasswordDTO.getCodeType()) {
+// case 1:
+// codeType = VerificationCodeConstants.LOGIN_CODE;
+// break;
+// case 2:
+// codeType = VerificationCodeConstants.FORGET_PASSWORD_CODE;
+//
+// break;
+// case 3:
+// codeType = VerificationCodeConstants.UPDATE_PASSWORD_CODE;
+// break;
+// }
+// SmsVo vo = new SmsVo();
+// vo.setAppId(sms_appid);
+// vo.setPushType(1);
+// vo.setReceivers(appLoginPasswordDTO.getPhoneNumber());
+// vo.setTemplateCode("RobotaxiVerifyCodeSmsTpl");
+// vo.setAppPushConfigCode("RobotaxiVerifyCodeSms");
+// vo.setParams(new HashMap<>());
+// vo.getParams().put("code", code);
+// SmsDto smsDto = smsClient.pushSms(vo);
+// if(null == smsDto || smsDto.getCode() != 200){
+// throw new ServiceException("短信发送失败", I18nKeyConstant.SMS_PUSH_FAILED);
+// }
+// redisService.setCacheObject(codeType+appLoginPasswordDTO.getPhoneNumber(), code, 60L, TimeUnit.SECONDS);
+// return R.ok();
+// }
- @ApiOperation(value = "获取手机验证码", tags = {"运维APP登录"})
- @PostMapping("/maintenance-app/base/v1/getVerificationCode")
- public R<?> verificationCodeLogin(@RequestBody AppLoginGetCodeDTO appLoginPasswordDTO) {
- if (StringUtils.isBlank(appLoginPasswordDTO.getPhoneNumber())) {
- return R.fail("手机号不能为空!");
- }
- XpOperationsUser xpOperationsUser = xpOperationsUserService.lambdaQuery()
- .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(appLoginPasswordDTO.getPhoneNumber()))
- .last("limit 1").one();
- if (xpOperationsUser == null) {
- return R.fail("账号不存在!");
- }
- if (!xpOperationsUser.getStatus()) {
- return R.fail("账号已禁用!");
- }
- // 生成6位数短信验证码
- String code = String.valueOf((int) (Math.random() * 1000000));
- String codeType = "";
- switch (appLoginPasswordDTO.getCodeType()) {
- case 1:
- codeType = VerificationCodeConstants.LOGIN_CODE;
- break;
- case 2:
- codeType = VerificationCodeConstants.FORGET_PASSWORD_CODE;
- break;
- case 3:
- codeType = VerificationCodeConstants.UPDATE_PASSWORD_CODE;
- break;
- }
- SmsVo vo = new SmsVo();
- vo.setAppId(sms_appid);
- vo.setPushType(1);
- vo.setReceivers(appLoginPasswordDTO.getPhoneNumber());
- vo.setTemplateCode("RobotaxiVerifyCodeSmsTpl");
- vo.setAppPushConfigCode("RobotaxiVerifyCodeSms");
- vo.setParams(new HashMap<>());
- vo.getParams().put("code", code);
- SmsDto smsDto = smsClient.pushSms(vo);
- if(null == smsDto || smsDto.getCode() != 200){
- throw new ServiceException("短信发送失败", I18nKeyConstant.SMS_PUSH_FAILED);
- }
- redisService.setCacheObject(codeType+appLoginPasswordDTO.getPhoneNumber(), code, 60L, TimeUnit.SECONDS);
- return R.ok();
- }
- @ApiOperation(value = "修改密码", tags = {"运维APP登录"})
- @PostMapping("/maintenance-app/base/v1/updatePassword")
- public R<?> updatePassword(@RequestBody UpdatePasswordDTO updatePasswordDTO, HttpServletRequest request) {
- // 用户登录
- if (sysLoginService.verificationCodeUpdate(updatePasswordDTO, request)){
- return R.ok("修改成功,请重新登录");
- }else{
- return R.fail("修改失败");
- }
- }
+
+// @ApiOperation(value = "修改密码", tags = {"运维APP登录"})
+// @PostMapping("/maintenance-app/base/v1/updatePassword")
+// public R<?> updatePassword(@RequestBody UpdatePasswordDTO updatePasswordDTO, HttpServletRequest request) {
+// // 用户登录
+// if (sysLoginService.verificationCodeUpdate(updatePasswordDTO, request)){
+// return R.ok("修改成功,请重新登录");
+// }else{
+// return R.fail("修改失败");
+// }
+// }
@DeleteMapping("/api/v1/logout")
public R<?> logout(HttpServletRequest request) {
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/UserSubscribeMessageController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/UserSubscribeMessageController.java
index ce16424..aa14881 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/UserSubscribeMessageController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/UserSubscribeMessageController.java
@@ -58,17 +58,19 @@
return R.fail("获取openid失败:{}", userResourcesDto.getMsg());
}
ThirdInfoVo thirdInfoVo = userResourcesDto.getData();
- List<String> templateIds = vo.getTemplateIds();
- userSubscribeMessageService.remove(new LambdaQueryWrapper<UserSubscribeMessage>()
- .eq(UserSubscribeMessage::getUserId, uid).in(UserSubscribeMessage::getTemplateId, templateIds));
- for (String templateId : templateIds) {
- UserSubscribeMessage userSubscribeMessage = new UserSubscribeMessage();
- userSubscribeMessage.setUserId(Long.valueOf(uid));
- userSubscribeMessage.setTemplateId(templateId);
- userSubscribeMessage.setStatus(1);
- userSubscribeMessage.setOpenId(thirdInfoVo.getThirdId());
- userSubscribeMessage.setDeleted(false);
- userSubscribeMessageService.save(userSubscribeMessage);
+ if(null != thirdInfoVo){
+ List<String> templateIds = vo.getTemplateIds();
+ userSubscribeMessageService.remove(new LambdaQueryWrapper<UserSubscribeMessage>()
+ .eq(UserSubscribeMessage::getUserId, uid).in(UserSubscribeMessage::getTemplateId, templateIds));
+ for (String templateId : templateIds) {
+ UserSubscribeMessage userSubscribeMessage = new UserSubscribeMessage();
+ userSubscribeMessage.setUserId(Long.valueOf(uid));
+ userSubscribeMessage.setTemplateId(templateId);
+ userSubscribeMessage.setStatus(1);
+ userSubscribeMessage.setOpenId(thirdInfoVo.getThirdId());
+ userSubscribeMessage.setDeleted(false);
+ userSubscribeMessageService.save(userSubscribeMessage);
+ }
}
return R.ok();
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
index 59618a6..d568e8f 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -150,18 +150,21 @@
if(dto.getUserCouponId()!=null){
XpAppUserCoupon coupon = couponList.get(0);
userCouponVo.setId(coupon.getId());
+ userCouponVo.setCouponType(coupon.getCouponType());
userCouponVo.setMoney(coupon.getMoney().doubleValue());
return R.ok(userCouponVo);
}else {
// 优先用满足条件且抵扣金额最大的
List<XpAppUserCoupon> discountUserCoupons = couponList.stream().filter(e -> e.getCouponType() == 1).sorted(Comparator.comparing(XpAppUserCoupon::getMoney).reversed()).collect(Collectors.toList());
if(!discountUserCoupons.isEmpty()){
+ userCouponVo.setCouponType(discountUserCoupons.get(0).getCouponType());
userCouponVo.setId(discountUserCoupons.get(0).getId());
userCouponVo.setMoney(discountUserCoupons.get(0).getMoney().doubleValue());
return R.ok(userCouponVo);
}
List<XpAppUserCoupon> fullUserCoupons = couponList.stream().filter(e -> e.getCouponType() == 2 && dto.getTotalAmount() >= e.getFullMoney().doubleValue()).sorted(Comparator.comparing(XpAppUserCoupon::getMoney).reversed()).collect(Collectors.toList());
if(!fullUserCoupons.isEmpty()){
+ userCouponVo.setCouponType(fullUserCoupons.get(0).getCouponType());
userCouponVo.setId(fullUserCoupons.get(0).getId());
userCouponVo.setMoney(fullUserCoupons.get(0).getMoney().doubleValue());
return R.ok(userCouponVo);
@@ -426,7 +429,7 @@
* @return
*/
@PostMapping("/logan/inner/appUserCoupon/calculateDiscountAmount")
- public R<BigDecimal> calculateDiscountAmount(@RequestParam CalculateDiscountAmountVo vo){
+ public R<BigDecimal> calculateDiscountAmount(@RequestBody CalculateDiscountAmountVo vo){
BigDecimal bigDecimal = xpAppUserCouponService.calculateDiscountAmount(vo);
return R.ok(bigDecimal);
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpQualificationAuditController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpQualificationAuditController.java
index 69a3f09..ad917a0 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpQualificationAuditController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpQualificationAuditController.java
@@ -84,4 +84,20 @@
return R.ok();
}
+
+ /**
+ * 管理后台-查询资质审核详情
+ */
+ @ApiOperation(value = "管理后台-查询资质审核详情", tags = {"管理后台-服务中心"})
+ @GetMapping("/api/v1/qualificationAudit/getQualificationAuditInfo/{id}")
+ public R<XpQualificationAuditVO> getQualificationAuditInfo(@PathVariable Long id){
+ XpQualificationAuditVO qualificationAuditInfo = null;
+ try {
+ qualificationAuditInfo = xpQualificationAuditService.getQualificationAuditInfo(id);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ return R.ok(qualificationAuditInfo);
+ }
+
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XtigerSSOController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XtigerSSOController.java
index be89750..13770db 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XtigerSSOController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XtigerSSOController.java
@@ -14,17 +14,18 @@
import com.xiaopeng.api.model.account.SysRole;
import com.xiaopeng.api.vo.account.LoginOperationUser;
import com.xiaopeng.api.vo.account.LoginUser;
+import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
+import com.xiaopeng.common.core.utils.JwtUtils;
+import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.common.security.service.TokenService;
+import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
@@ -32,6 +33,7 @@
import java.util.Date;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
@Slf4j
@RestController
@@ -44,6 +46,12 @@
@Value("${xiaopeng.xtiger.sso.appId}")
private String appId;
+ @Value("${ali.push.key:335666352}")
+ private String aliPushKey;
+
+ @Value("${ali.push.secret:0252ebde2dc84f63aebd41f757f213d7}")
+ private String aliPushSecret;
+
@Autowired
private TokenService tokenService;
@@ -52,6 +60,9 @@
@Autowired
private ISysGroupService sysGroupService;
+
+ @Autowired
+ private RedisService redisService;
/**
* 翼虎web登录重定向接口
@@ -87,16 +98,31 @@
*/
@GetMapping("/maintenance-app/ssoAuthSdk/appLogin")
public R<?> appLogin(Integer deviceType, HttpServletRequest request){
- String accessTokenHeader = request.getHeader("Authorization");
+ String accessTokenHeader = request.getHeader("XP-TOKEN");
log.info("运维APP登录, accessTokenHeader: {}", accessTokenHeader);
String accessToken = StringUtils.isEmpty(accessTokenHeader) ? null : accessTokenHeader.replace("Bearer ", "");
if(StringUtils.isEmpty(accessToken)){
throw new ServiceException("登录失败,请稍后重试。");
}
- OIDCAppUserInfoVo userInfo = getAppUserInfo(request);
+ OIDCAppUserInfoVo userInfo = getAppUserInfo(request, accessToken);
return appLogin(userInfo, deviceType, request);
}
+
+ /**
+ *翼虎app登录换取本系统token
+ * @return
+ */
+ @PostMapping("/maintenance-app/ssoAuthSdk/appLoginOut")
+ public R<?> appLoginOut(){
+ LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
+ if(null == loginOperationUser){
+ throw new ServiceException("操作失败,请稍后重试。");
+ }
+ String token = loginOperationUser.getToken();
+ redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + token);
+ return R.ok();
+ }
@@ -115,23 +141,24 @@
}
- public OIDCAppUserInfoVo getAppUserInfo(HttpServletRequest request) {
- log.info("翼虎登录使用token获取用户信息");
+ public OIDCAppUserInfoVo getAppUserInfo(HttpServletRequest request, String accessToken) {
+ log.info("APP翼虎登录使用token获取用户信息");
HttpRequest post = HttpUtil.createGet(issuer + "/xtiger/app/userinfo");
- post.header("Authorization", "Bearer " + request.getHeader("Authorization"));
+ post.header("Authorization", "Bearer " + accessToken);
post.header("Content-Type", "application/json");
post.header("XT-Client-Type", request.getHeader("XT-Client-Type"));
post.header("XT-DeviceId", request.getHeader("XT-DeviceId"));
post.header("XT-AppId", request.getHeader("XT-AppId"));
post.header("XT-Signature", request.getHeader("XT-Signature"));
post.header("XT-Nonce", request.getHeader("XT-Nonce"));
+ post.header("Client-Type", "PC");
log.info("请求参数:{}", post.headers());
HttpResponse execute = post.execute();
if(!execute.isOk()){
throw new ServiceException("登录失败,请稍后重试。");
}
String body = execute.body();
- log.info("翼虎登录使用token获取用户信息, 返回结果: {}", body);
+ log.info("APP翼虎登录使用token获取用户信息, 返回结果: {}", body);
JSONObject jsonObject = JSON.parseObject(body);
Integer code = jsonObject.getInteger("code");
if(null != code && 200 != code){
@@ -149,11 +176,6 @@
loginUser.setPhoneDesensitizationExempt(phoneDesensitization);
HashMap<String, Object> map = new HashMap<>();
map.put("token", tokenService.createToken(loginUser));
- List<SysRole> roles = loginUser.getSysUser().getRoles();
- // if (CollectionUtils.isEmpty(roles)) {
- // throw new ServiceException("请关联角色!", I18nKeyConstant.LOGIN_ROLE_NOT_BIND);
- // }
- // map.put("roleName",roles.get(0).getRoleName());
map.put("info", loginUser);
// 修改用户最后登录时间
return R.ok(map);
@@ -165,12 +187,11 @@
LoginOperationUser loginUser = sysLoginService.verificationCodeLogin(userInfo.getPhone(), deviceType, request);
HashMap<String, Object> map = new HashMap<>();
map.put("token", tokenService.createOperationUserToken(loginUser));
-// List<SysRole> roles = userInfo.getXpOperationsUser().getRoles();
-// if (CollectionUtils.isEmpty(roles)) {
-// return R.fail("请关联角色!");
-// }
-// map.put("roleName", roles.get(0).getRoleName());
map.put("info", loginUser);
+ Map<String, String> thirdInfo = new HashMap<>();
+ thirdInfo.put("pushKey", aliPushKey);
+ thirdInfo.put("pushSecret", aliPushSecret);
+ map.put("thirdInfo", thirdInfo);
return R.ok(map);
}
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpQualificationAuditMapper.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpQualificationAuditMapper.java
index 4239193..35dc0e4 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpQualificationAuditMapper.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpQualificationAuditMapper.java
@@ -28,4 +28,13 @@
* @return 分页数据
*/
List<XpQualificationAuditVO> pageList(@Param("pageInfo") PageInfo<XpQualificationAuditVO> pageInfo, @Param("query")XpQualificationAuditQuery query);
+
+
+
+ /**
+ * 获取资质审核详情
+ * @param id
+ * @return
+ */
+ XpQualificationAuditVO getQualificationAuditInfo(@Param("id") Long id);
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java
index 99dfc93..56da205 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java
@@ -24,10 +24,6 @@
@ApiModelProperty(value = "用户id 根据手机号获取")
private Long appUserId;
-
- @ApiModelProperty(value = "优惠券类型 1-满减 2-折扣 3-抹零")
- private Integer couponType;
-
@ApiModelProperty("条件金额")
private BigDecimal conditionAmount;
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpQualificationAuditService.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpQualificationAuditService.java
index 25840e1..7ac2948 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpQualificationAuditService.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpQualificationAuditService.java
@@ -35,4 +35,12 @@
*/
void audit(QualificationReviewDTO dto, Long userid);
+
+ /**
+ * 获取资质审核详情
+ * @param id
+ * @return
+ */
+ XpQualificationAuditVO getQualificationAuditInfo(Long id) throws UnsupportedEncodingException;
+
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
index 161ec99..c1cb87e 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
@@ -250,14 +250,11 @@
}
operationsUser.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(operationsUser.getPhoneNumber()));
String verificationCode = redisService.getCacheObject(VerificationCodeConstants.LOGIN_CODE + phoneNumber);
- if(!code.equals("070456")){
- //临时验证码
- if (StringUtils.isBlank(verificationCode)){
- throw new ServiceException("验证码已过期!");
- }
- if (!verificationCode.equals(code)){
- throw new ServiceException("验证码错误!");
- }
+ if (StringUtils.isBlank(verificationCode)){
+ throw new ServiceException("验证码已过期!");
+ }
+ if (!verificationCode.equals(code)){
+ throw new ServiceException("验证码错误!");
}
loginOperationUser.setXpOperationsUser(operationsUser);
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysPermissionServiceImpl.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysPermissionServiceImpl.java
index 63d6c26..204ddb9 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysPermissionServiceImpl.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysPermissionServiceImpl.java
@@ -118,7 +118,7 @@
// 4. 通过 Feign 调用 operation 服务,根据 menuId 列表获取菜单列表
R<List<SysMenu>> result = sysMenuClient.getMenusByMenuIds(menuIds);
if (R.isSuccess(result) && result.getData() != null) {
- perms = result.getData().stream().map(item -> item.getId().toString()).collect(Collectors.toSet());
+ perms = result.getData().stream().map(SysMenu::getRouterName).collect(Collectors.toSet());
} else {
log.error("调用菜单服务获取菜单列表失败: {}", result != null ? result.getMsg() : "返回结果为空");
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
index 7f14e24..585a639 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -135,7 +135,6 @@
XpCoupon data = xpCouponClient.getCouponById(record.getOperationCouponId()).getData();
if(null != data){
record.setConditionAmount(data.getConditionalAmount());
- record.setCouponType(data.getCouponType());
}
}
XpAppUserCouponVo vo = new XpAppUserCouponVo();
@@ -232,8 +231,6 @@
vo.setTemplateId(MessageTemplateEnum.B.getTemplateId());
String json = MessageTemplateEnum.B.getRemarks();
json = json.replace("活动名称", dto.getActivityName());
- json = json.replace("开始时间", dto.getActivityStartTime().toString() );
- json = json.replace("结束时间", dto.getActivityEndTime().toString() );
json = json.replace("温馨提示", dto.getActivityRemarks());
vo.setJson(json);
subscribeMessageClient.sendSubscribeMessage(vo);
@@ -299,7 +296,6 @@
vo.setTemplateId(MessageTemplateEnum.D.getTemplateId());
String json = MessageTemplateEnum.D.getRemarks();
json = json.replace("优惠券名称", xpCoupon.getCouponName());
- json = json.replace("券有效期", expirationTime.toString() );
json = json.replace("使用规则", xpCoupon.getCouponDescription());
vo.setJson(json);
subscribeMessageClient.sendSubscribeMessage(vo);
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java
index 952ef98..3bf3a0e 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java
@@ -98,54 +98,54 @@
for (XpQualificationAuditVO xpQualificationAuditVO : list) {
xpQualificationAuditVO.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(xpQualificationAuditVO.getPhoneNumber()));
xpQualificationAuditVO.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(xpQualificationAuditVO.getPhoneNumber()));
- if(!loginUser.getPhoneDesensitizationExempt()){
+ if (!loginUser.getPhoneDesensitizationExempt()) {
xpQualificationAuditVO.setPhoneNumber(DesensitizedUtil.mobilePhone(xpQualificationAuditVO.getPhoneNumber()));
}
- String certificateOfNoCriminalRecord = xpQualificationAuditVO.getCertificateOfNoCriminalRecord();
- if (certificateOfNoCriminalRecord != null) {
- JSONObject jsonObject = JSONObject.parseObject(certificateOfNoCriminalRecord);
- // 1
- String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
- jsonObject.put("url", downloadUrl);
- xpQualificationAuditVO.setCertificateOfNoCriminalRecord(jsonObject.toJSONString());
- }
-
- String driverLicense = xpQualificationAuditVO.getDriverLicense();
- if (driverLicense != null) {
- JSONObject jsonObject = JSONObject.parseObject(driverLicense);
- //1
- String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
- jsonObject.put("url", downloadUrl);
- xpQualificationAuditVO.setDriverLicense(jsonObject.toJSONString());
- }
-
-
- String trainingGraduationCertificate = xpQualificationAuditVO.getTrainingGraduationCertificate();
- if (trainingGraduationCertificate != null) {
- JSONObject jsonObject = JSONObject.parseObject(trainingGraduationCertificate);
- //1
- String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
- jsonObject.put("url", downloadUrl);
- xpQualificationAuditVO.setTrainingGraduationCertificate(jsonObject.toJSONString());
- }
-
- String idCardFront = xpQualificationAuditVO.getIdCardFront();
- if (idCardFront != null) {
- JSONObject jsonObject = JSONObject.parseObject(idCardFront);
- //1
- String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
- jsonObject.put("url", downloadUrl);
- xpQualificationAuditVO.setIdCardFront(jsonObject.toJSONString());
- }
-
- String idCardBack = xpQualificationAuditVO.getIdCardBack();
- if (idCardBack != null) {
- JSONObject jsonObject = JSONObject.parseObject(idCardBack);
- //1
- String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
- jsonObject.put("url", downloadUrl);
- xpQualificationAuditVO.setIdCardBack(jsonObject.toJSONString());
- }
+// String certificateOfNoCriminalRecord = xpQualificationAuditVO.getCertificateOfNoCriminalRecord();
+// if (certificateOfNoCriminalRecord != null) {
+// JSONObject jsonObject = JSONObject.parseObject(certificateOfNoCriminalRecord);
+// // 1
+// String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+// jsonObject.put("url", downloadUrl);
+// xpQualificationAuditVO.setCertificateOfNoCriminalRecord(jsonObject.toJSONString());
+// }
+//
+// String driverLicense = xpQualificationAuditVO.getDriverLicense();
+// if (driverLicense != null) {
+// JSONObject jsonObject = JSONObject.parseObject(driverLicense);
+// //1
+// String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+// jsonObject.put("url", downloadUrl);
+// xpQualificationAuditVO.setDriverLicense(jsonObject.toJSONString());
+// }
+//
+//
+// String trainingGraduationCertificate = xpQualificationAuditVO.getTrainingGraduationCertificate();
+// if (trainingGraduationCertificate != null) {
+// JSONObject jsonObject = JSONObject.parseObject(trainingGraduationCertificate);
+// //1
+// String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+// jsonObject.put("url", downloadUrl);
+// xpQualificationAuditVO.setTrainingGraduationCertificate(jsonObject.toJSONString());
+// }
+//
+// String idCardFront = xpQualificationAuditVO.getIdCardFront();
+// if (idCardFront != null) {
+// JSONObject jsonObject = JSONObject.parseObject(idCardFront);
+// //1
+// String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+// jsonObject.put("url", downloadUrl);
+// xpQualificationAuditVO.setIdCardFront(jsonObject.toJSONString());
+// }
+//
+// String idCardBack = xpQualificationAuditVO.getIdCardBack();
+// if (idCardBack != null) {
+// JSONObject jsonObject = JSONObject.parseObject(idCardBack);
+// //1
+// String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+// jsonObject.put("url", downloadUrl);
+// xpQualificationAuditVO.setIdCardBack(jsonObject.toJSONString());
+// }
}
@@ -164,4 +164,80 @@
}
this.updateBatchById(qualificationAudits);
}
+
+ @Override
+ public XpQualificationAuditVO getQualificationAuditInfo(Long id) {
+ XpQualificationAuditVO qualificationAuditInfo = this.baseMapper.getQualificationAuditInfo(id);
+ String certificateOfNoCriminalRecord = qualificationAuditInfo.getCertificateOfNoCriminalRecord();
+ if (certificateOfNoCriminalRecord != null) {
+ JSONObject jsonObject = JSONObject.parseObject(certificateOfNoCriminalRecord);
+ // 1
+ String downloadUrl = null;
+ try {
+ downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ jsonObject.put("url", downloadUrl);
+ qualificationAuditInfo.setCertificateOfNoCriminalRecord(jsonObject.toJSONString());
+ }
+
+ String driverLicense = qualificationAuditInfo.getDriverLicense();
+ if (driverLicense != null) {
+ JSONObject jsonObject = JSONObject.parseObject(driverLicense);
+ //1
+ String downloadUrl = null;
+ try {
+ downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ jsonObject.put("url", downloadUrl);
+ qualificationAuditInfo.setDriverLicense(jsonObject.toJSONString());
+ }
+
+
+ String trainingGraduationCertificate = qualificationAuditInfo.getTrainingGraduationCertificate();
+ if (trainingGraduationCertificate != null) {
+ JSONObject jsonObject = JSONObject.parseObject(trainingGraduationCertificate);
+ //1
+ String downloadUrl = null;
+ try {
+ downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ jsonObject.put("url", downloadUrl);
+ qualificationAuditInfo.setTrainingGraduationCertificate(jsonObject.toJSONString());
+ }
+
+ String idCardFront = qualificationAuditInfo.getIdCardFront();
+ if (idCardFront != null) {
+ JSONObject jsonObject = JSONObject.parseObject(idCardFront);
+ //1
+ String downloadUrl = null;
+ try {
+ downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ jsonObject.put("url", downloadUrl);
+ qualificationAuditInfo.setIdCardFront(jsonObject.toJSONString());
+ }
+
+ String idCardBack = qualificationAuditInfo.getIdCardBack();
+ if (idCardBack != null) {
+ JSONObject jsonObject = JSONObject.parseObject(idCardBack);
+ //1
+ String downloadUrl = null;
+ try {
+ downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ jsonObject.put("url", downloadUrl);
+ qualificationAuditInfo.setIdCardBack(jsonObject.toJSONString());
+ }
+ return qualificationAuditInfo;
+ }
}
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/util/UserCouponTask.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/util/UserCouponTask.java
index 90be668..813036e 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/util/UserCouponTask.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/util/UserCouponTask.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.xiaopeng.account.constant.I18nKeyConstant;
@@ -98,15 +99,16 @@
/**
* 定时任务发送优惠券通知
*/
- @Scheduled(cron = "0 0/1 * * * *")
+ @Scheduled(fixedDelay = 30000)
public void taskOrder() {
List<XpActivity> activityList = acticityClient.getAllEffectiveActivity().getData();
- List<XpActivity> collect1 = activityList.stream().filter(xpActivity -> xpActivity.getWechatNotification() == 1).collect(Collectors.toList());
+ List<XpActivity> collect1 = activityList.stream().filter(xpActivity -> null != xpActivity.getWechatNotification() && xpActivity.getWechatNotification() == 1).collect(Collectors.toList());
pushWxCouponMessage(collect1);
- List<XpActivity> collect2 = activityList.stream().filter(xpActivity -> xpActivity.getSmsNotification() == 1).collect(Collectors.toList());
+ List<XpActivity> collect2 = activityList.stream().filter(xpActivity -> null != xpActivity.getSmsNotification() && xpActivity.getSmsNotification() == 1).collect(Collectors.toList());
pushSmsCouponMessage(collect2);
- List<XpActivity> collect3 = activityList.stream().filter(xpActivity -> xpActivity.getMiniProgramNotification() == 1).collect(Collectors.toList());
+ List<XpActivity> collect3 = activityList.stream().filter(xpActivity -> null != xpActivity.getMiniProgramNotification() && xpActivity.getMiniProgramNotification() == 1).collect(Collectors.toList());
pushMiniProgramCouponMessage(collect3);
+ editUserCouponStatus();
}
@@ -118,12 +120,12 @@
for (XpActivity xpActivity : activityList) {
//微信通知活动开始提醒(0=否,1=是)
Integer wechatActicityStart = xpActivity.getWechatActicityStart();
- if(1 == wechatActicityStart){
+ if(null != wechatActicityStart && 1 == wechatActicityStart){
RETRY_EXECUTOR.execute(() -> {
//即将到期提前通知
Integer wechatActicityStartMinutes = xpActivity.getWechatActicityStartMinutes();
//获取满足微信通知的即将生效的优惠券
- long time = LocalDateTime.now().minusMinutes(wechatActicityStartMinutes).toEpochSecond(ZoneOffset.of("+8"));
+ long time = LocalDateTime.now().plusMinutes(wechatActicityStartMinutes).toEpochSecond(ZoneOffset.of("+8"));
List<XpAppUserCoupon> list = xpAppUserCouponService.list(new LambdaUpdateWrapper<XpAppUserCoupon>()
.eq(XpAppUserCoupon::getActivityId, xpActivity.getId()).eq(XpAppUserCoupon::getStatus, 1)
.last(" and UNIX_TIMESTAMP(effective_time) >= " + time + " and " + time + "> UNIX_TIMESTAMP(effective_time) - 100"));
@@ -137,8 +139,8 @@
vo.setUserId(xpAppUserCoupon.getAppUserId());
vo.setTemplateId(MessageTemplateEnum.C.getTemplateId());
String json = MessageTemplateEnum.C.getRemarks();
- json = json.replace("优惠券名称", xpAppUserCoupon.getCouponName());
- json = json.replace("今日出行最高立减XXX元,点击领取", coupon.getCouponDescription());
+ json = json.replace("活动名称", xpAppUserCoupon.getCouponName());
+ json = json.replace("温馨提示", coupon.getCouponDescription());
vo.setJson(json);
R<?> r = subscribeMessageClient.sendSubscribeMessage(vo);
}
@@ -147,12 +149,12 @@
//微信通知即将过期提醒(0=否,1=是)
Integer wechatAboutExpireReminder = xpActivity.getWechatAboutExpireReminder();
- if(1 == wechatAboutExpireReminder){
+ if(null != wechatAboutExpireReminder && 1 == wechatAboutExpireReminder){
RETRY_EXECUTOR.execute(() -> {
//即将到期提前通知
Integer wechatAboutExpireDays = xpActivity.getWechatAboutExpireDays();
//微信通知即将过期天数
- long time = LocalDateTime.now().minusDays(wechatAboutExpireDays).toEpochSecond(ZoneOffset.of("+8"));
+ long time = LocalDateTime.now().plusDays(wechatAboutExpireDays).toEpochSecond(ZoneOffset.of("+8"));
List<XpAppUserCoupon> list = xpAppUserCouponService.list(new LambdaUpdateWrapper<XpAppUserCoupon>()
.eq(XpAppUserCoupon::getActivityId, xpActivity.getId()).eq(XpAppUserCoupon::getStatus, 1)
.last(" and UNIX_TIMESTAMP(expiration_time) >= " + time + " and " + time + "> UNIX_TIMESTAMP(expiration_time) - 100"));
@@ -184,28 +186,31 @@
*/
private void pushSmsCouponMessage(List<XpActivity> activityList) {
log.info("开始执行优惠券短信提醒消息发送 {}", activityList.size());
- for (XpActivity xpActivity : activityList) {
+ aa: for (XpActivity xpActivity : activityList) {
Integer now = Integer.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HHmm")));
Integer smsAboutExpireReminder = xpActivity.getSmsAboutExpireReminder();
- String[] smsStartBlockingTime = xpActivity.getSmsStartBlockingTime().split(",");
- String[] smsEndBlockingTime = xpActivity.getSmsEndBlockingTime().split(",");
- for (int i = 0; i < smsStartBlockingTime.length; i++) {
- Integer start = Integer.valueOf(smsStartBlockingTime[i].replace(":", ""));
- Integer end = Integer.valueOf(smsEndBlockingTime[i].replace(":", ""));
- if(start <= now && now <= end){
- log.info("当前时间在短信发送时间区间内,不发送短信");
- return;
+ if(StringUtils.hasLength(xpActivity.getSmsStartBlockingTime())){
+ String[] smsStartBlockingTime = xpActivity.getSmsStartBlockingTime().split(",");
+ String[] smsEndBlockingTime = xpActivity.getSmsEndBlockingTime().split(",");
+ for (int i = 0; i < smsStartBlockingTime.length; i++) {
+ Integer start = Integer.valueOf(smsStartBlockingTime[i].replace(":", ""));
+ Integer end = Integer.valueOf(smsEndBlockingTime[i].replace(":", ""));
+ if(start <= now && now <= end){
+ log.info("当前时间在短信发送时间区间内,不发送短信");
+ continue aa;
+ }
}
}
+
//微信通知活动开始提醒(0=否,1=是)
Integer smsActicityStart = xpActivity.getSmsActicityStart();
- if(1 == smsActicityStart){
+ if(null != smsActicityStart && 1 == smsActicityStart){
RETRY_EXECUTOR.execute(() -> {
//短信通知临近券生效前X分钟通知
Integer smsActicityStartMinutes = xpActivity.getSmsActicityStartMinutes();
//获取满足微信通知的即将生效的优惠券
- long time = LocalDateTime.now().minusMinutes(smsActicityStartMinutes).toEpochSecond(ZoneOffset.of("+8"));
+ long time = LocalDateTime.now().plusMinutes(smsActicityStartMinutes).toEpochSecond(ZoneOffset.of("+8"));
List<XpAppUserCoupon> list = xpAppUserCouponService.list(new LambdaUpdateWrapper<XpAppUserCoupon>()
.eq(XpAppUserCoupon::getActivityId, xpActivity.getId()).eq(XpAppUserCoupon::getStatus, 1)
.last(" and UNIX_TIMESTAMP(effective_time) >= " + time + " and " + time + "> UNIX_TIMESTAMP(effective_time) - 100"));
@@ -237,12 +242,12 @@
}
//短信通知即将过期提醒(0=否,1=是)
- if(1 == smsAboutExpireReminder){
+ if(null != smsAboutExpireReminder && 1 == smsAboutExpireReminder){
RETRY_EXECUTOR.execute(() -> {
//即将到期提前通知
Integer smsAboutExpireDays = xpActivity.getSmsAboutExpireDays();
//微信通知即将过期天数
- long time = LocalDateTime.now().minusDays(smsAboutExpireDays).toEpochSecond(ZoneOffset.of("+8"));
+ long time = LocalDateTime.now().plusDays(smsAboutExpireDays).toEpochSecond(ZoneOffset.of("+8"));
List<XpAppUserCoupon> list = xpAppUserCouponService.list(new LambdaUpdateWrapper<XpAppUserCoupon>()
.eq(XpAppUserCoupon::getActivityId, xpActivity.getId()).eq(XpAppUserCoupon::getStatus, 1)
.last(" and UNIX_TIMESTAMP(expiration_time) >= " + time + " and " + time + "> UNIX_TIMESTAMP(expiration_time) - 100"));
@@ -287,12 +292,12 @@
//小程序弹窗券到账提醒(0=否,1=是)
Integer miniProgramReceivedReminder = xpActivity.getMiniProgramReceivedReminder();
String expireMinutesNotificationContent = xpActivity.getExpireMinutesNotificationContent();
- if(1 == miniProgramReceivedReminder){
+ if(null != miniProgramReceivedReminder && 1 == miniProgramReceivedReminder){
RETRY_EXECUTOR.execute(() -> {
//即将到期提前通知
Integer miniProgramAboutExpireMinutes = xpActivity.getMiniProgramAboutExpireMinutes();
//获取满足微信通知的即将生效的优惠券
- long time = LocalDateTime.now().minusMinutes(miniProgramAboutExpireMinutes).toEpochSecond(ZoneOffset.of("+8"));
+ long time = LocalDateTime.now().plusMinutes(miniProgramAboutExpireMinutes).toEpochSecond(ZoneOffset.of("+8"));
List<XpAppUserCoupon> list = xpAppUserCouponService.list(new LambdaUpdateWrapper<XpAppUserCoupon>()
.eq(XpAppUserCoupon::getActivityId, xpActivity.getId()).eq(XpAppUserCoupon::getStatus, 1)
.last(" and UNIX_TIMESTAMP(effective_time) >= " + time + " and " + time + "> UNIX_TIMESTAMP(effective_time) - 100"));
@@ -316,12 +321,12 @@
//小程序弹窗即将过期提醒(0=否,1=是)
Integer miniProgramAboutExpireReminder = xpActivity.getMiniProgramAboutExpireReminder();
String expireDaysNotificationContent = xpActivity.getExpireDaysNotificationContent();
- if(1 == miniProgramAboutExpireReminder){
+ if(null != miniProgramAboutExpireReminder && 1 == miniProgramAboutExpireReminder){
RETRY_EXECUTOR.execute(() -> {
//即将到期提前通知
Integer aboutExpireDays = xpActivity.getAboutExpireDays();
//微信通知即将过期天数
- long time = LocalDateTime.now().minusDays(aboutExpireDays).toEpochSecond(ZoneOffset.of("+8"));
+ long time = LocalDateTime.now().plusDays(aboutExpireDays).toEpochSecond(ZoneOffset.of("+8"));
List<XpAppUserCoupon> list = xpAppUserCouponService.list(new LambdaUpdateWrapper<XpAppUserCoupon>()
.eq(XpAppUserCoupon::getActivityId, xpActivity.getId()).eq(XpAppUserCoupon::getStatus, 1)
.last(" and UNIX_TIMESTAMP(expiration_time) >= " + time + " and " + time + "> UNIX_TIMESTAMP(expiration_time) - 100"));
@@ -343,4 +348,16 @@
}
}
}
+
+
+
+ private void editUserCouponStatus(){
+ log.info("开始执行编辑用户优惠券状态");
+ RETRY_EXECUTOR.execute(() -> {
+ xpAppUserCouponService.update(new LambdaUpdateWrapper<XpAppUserCoupon>()
+ .set(XpAppUserCoupon::getStatus, 3)
+ .eq(XpAppUserCoupon::getStatus, 1)
+ .le(XpAppUserCoupon::getExpirationTime, LocalDateTime.now()));
+ });
+ }
}
diff --git a/xp-robotaxi-account-boot/src/main/resources/application-local.yml b/xp-robotaxi-account-boot/src/main/resources/application-local.yml
index c984c34..1ae7387 100644
--- a/xp-robotaxi-account-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-account-boot/src/main/resources/application-local.yml
@@ -4,6 +4,10 @@
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
shardingsphere:
datasource:
names: xp0
diff --git a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
index ce318d4..6173e2f 100644
--- a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
+++ b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
@@ -41,7 +41,6 @@
use_time as useTime,
create_time as createTime,
expiration_time as expireTime,
- coupon_type as couponType,
case
when status = 1 and now() >= expiration_time then 3 -- 包含等于的情况
when status = 1 and expiration_time > now() then 1
diff --git a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpQualificationAuditMapper.xml b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpQualificationAuditMapper.xml
index 67cf110..ddc9f02 100644
--- a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpQualificationAuditMapper.xml
+++ b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpQualificationAuditMapper.xml
@@ -7,8 +7,7 @@
id, operations_user_id, id_card_front, id_card_back, driver_license, certificate_of_no_criminal_record, training_graduation_certificate, audit_user_id, audit_time, audit_status, is_deleted, create_time, update_time, create_by, update_by
</sql>
<select id="pageList" resultType="com.xiaopeng.api.vo.account.XpQualificationAuditVO">
- select xqa.id, xqa.operations_user_id, xqa.id_card_front, xqa.id_card_back, xqa.driver_license,
- xqa.certificate_of_no_criminal_record, xqa.training_graduation_certificate,
+ select xqa.id, xqa.operations_user_id,
xqa.audit_user_id, xqa.audit_time, xqa.audit_status, xqa.create_time,
xou.nick_name, xou.phone_number, xou.avatar,xou.unique_number
from xp_qualification_audit xqa
@@ -33,4 +32,15 @@
order by xqa.create_time desc
</select>
+
+ <select id="getQualificationAuditInfo" resultType="com.xiaopeng.api.vo.account.XpQualificationAuditVO">
+ select xqa.id, xqa.operations_user_id, xqa.id_card_front, xqa.id_card_back, xqa.driver_license,
+ xqa.certificate_of_no_criminal_record, xqa.training_graduation_certificate,
+ xqa.audit_user_id, xqa.audit_time, xqa.audit_status, xqa.create_time,
+ xou.nick_name, xou.phone_number, xou.avatar,xou.unique_number
+ from xp_qualification_audit xqa
+ left join xp_operations_user xou on xqa.operations_user_id = xou.id
+ left join xp_operations_role xore on xou.id = xore.operations_user_id
+ where xqa.id = #{id}
+ </select>
</mapper>
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/SSOClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/SSOClientFallbackFactory.java
index cf4bfd3..ff7c404 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/SSOClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/SSOClientFallbackFactory.java
@@ -2,6 +2,7 @@
import com.xiaopeng.api.dto.account.UserResourcesDto;
import com.xiaopeng.api.feignClient.account.SSOClient;
+import com.xiaopeng.api.vo.account.WechatAccessTokenResVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
@@ -15,7 +16,7 @@
return new SSOClient() {
@Override
- public UserResourcesDto getWechatAccessToken(String appId, String wxAppId, Boolean isRefresh) {
+ public WechatAccessTokenResVo getWechatAccessToken(String appId, String wxAppId, Boolean isRefresh) {
log.info("调用小鹏获取微信全局token服务失败, 异常: {}", cause.getMessage());
return null;
}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpTargetedServiceClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpTargetedServiceClientFallbackFactory.java
index fbf17f4..b846e9d 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpTargetedServiceClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpTargetedServiceClientFallbackFactory.java
@@ -1,6 +1,7 @@
package com.xiaopeng.api.factory.operation;
import com.xiaopeng.api.feignClient.operation.XpTargetedServiceClient;
+import com.xiaopeng.api.model.operation.XpTargetedServiceVehicle;
import com.xiaopeng.api.vo.operation.XpTargetedServiceVehicleVo;
import com.xiaopeng.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
@@ -34,6 +35,12 @@
log.error("获取定向服务所有车辆失败:" + cause.getMessage());
return R.fail("获取定向服务所有车辆失败");
}
+
+ @Override
+ public R<List<XpTargetedServiceVehicle>> getAllTargetedServiceVehicleByCityCode(String cityCode) {
+ log.error("获取定向服务所有车辆失败:" + cause.getMessage());
+ return R.fail("获取定向服务所有车辆失败");
+ }
};
}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/SSOClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/SSOClient.java
index f8e2c7e..9b7426e 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/SSOClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/SSOClient.java
@@ -2,6 +2,7 @@
import com.xiaopeng.api.dto.account.UserResourcesDto;
import com.xiaopeng.api.factory.account.SSOClientFallbackFactory;
+import com.xiaopeng.api.vo.account.WechatAccessTokenResVo;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@@ -23,8 +24,8 @@
* @param isRefresh
* @return
*/
- @GetMapping("/logan/third/thirdInfo")
- UserResourcesDto getWechatAccessToken(@RequestParam("appId") String appId,
- @RequestParam("wxAppId") String wxAppId,
- @RequestParam("isRefresh") Boolean isRefresh);
+ @GetMapping("/logan/sso/third/getWechatAccessToken")
+ WechatAccessTokenResVo getWechatAccessToken(@RequestParam("appId") String appId,
+ @RequestParam("wxAppId") String wxAppId,
+ @RequestParam("isRefresh") Boolean isRefresh);
}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
index c6457e9..af74680 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
@@ -78,7 +78,7 @@
* @return
*/
@PostMapping("/logan/inner/appUserCoupon/calculateDiscountAmount")
- R<BigDecimal> calculateDiscountAmount(@RequestParam CalculateDiscountAmountVo vo);
+ R<BigDecimal> calculateDiscountAmount(@RequestBody CalculateDiscountAmountVo vo);
/**
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpTargetedServiceClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpTargetedServiceClient.java
index 92cd168..624c4d1 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpTargetedServiceClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpTargetedServiceClient.java
@@ -1,6 +1,7 @@
package com.xiaopeng.api.feignClient.operation;
import com.xiaopeng.api.factory.operation.XpTargetedServiceClientFallbackFactory;
+import com.xiaopeng.api.model.operation.XpTargetedServiceVehicle;
import com.xiaopeng.api.vo.operation.XpTargetedServiceVehicleVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
@@ -41,4 +42,13 @@
*/
@GetMapping("/logan/inner/v1/targetedService/getAllTargetedServiceVehicle")
R<List<Long>> getAllTargetedServiceVehicle();
+
+
+
+ /**
+ * 获取定向服务所有车辆
+ * @return
+ */
+ @GetMapping("/logan/inner/v1/targetedService/getAllTargetedServiceVehicleByCityCode")
+ R<List<XpTargetedServiceVehicle>> getAllTargetedServiceVehicleByCityCode(@RequestParam("cityCode") String cityCode);
}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpVehicleModel.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpVehicleModel.java
index 209f88a..92fac62 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpVehicleModel.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpVehicleModel.java
@@ -1,6 +1,7 @@
package com.xiaopeng.api.model.maintenance;
import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xiaopeng.common.core.web.domain.BaseModel;
@@ -35,5 +36,20 @@
@NotBlank(message = "座位数不能为空")
private String seat;
+ @ApiModelProperty(value = "车长")
+ @TableField("vehicle_length")
+ @NotBlank(message = "车长不能为空")
+ private String vehicleLength;
+
+ @ApiModelProperty(value = "车宽")
+ @TableField("vehicle_width")
+ @NotBlank(message = "车宽不能为空")
+ private String vehicleWidth;
+
+ @ApiModelProperty(value = "车高")
+ @TableField("vehicle_height")
+ @NotBlank(message = "车高不能为空")
+ private String vehicleHeight;
+
}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
index 6a93b3c..176eb5e 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -247,6 +247,11 @@
@TableField("queue_name")
private String queueName;
+
+ @ApiModelProperty(value = "队列值")
+ @TableField("queue_value")
+ private String queueValue;
+
// 用于计数
@TableField(exist = false)
private Integer num;
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/UserCouponVo.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/UserCouponVo.java
index cab596c..633109d 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/UserCouponVo.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/UserCouponVo.java
@@ -10,6 +10,9 @@
@ApiModelProperty("优惠券ID")
private Long id;
+ @ApiModelProperty("类型 1=抵扣 2=满减 3=抹零")
+ private Integer couponType;
+
@ApiModelProperty("优惠券金额")
private Double money=0.0;
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenResVo.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenResVo.java
new file mode 100644
index 0000000..385259b
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenResVo.java
@@ -0,0 +1,19 @@
+package com.xiaopeng.api.vo.account;
+
+import lombok.Data;
+
+@Data
+public class WechatAccessTokenResVo {
+ /**
+ * 状态码
+ */
+ private Integer code;
+ /**
+ * 状态信息
+ */
+ private String msg;
+ /**
+ * 数据
+ */
+ private WechatAccessTokenVo data;
+}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenVo.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenVo.java
new file mode 100644
index 0000000..10eab61
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/WechatAccessTokenVo.java
@@ -0,0 +1,8 @@
+package com.xiaopeng.api.vo.account;
+
+import lombok.Data;
+
+@Data
+public class WechatAccessTokenVo {
+ private String accessToken;
+}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/FareVo.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/FareVo.java
index 8e11f01..0acc398 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/FareVo.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/FareVo.java
@@ -34,6 +34,9 @@
@ApiModelProperty(value = "优惠券id")
private Long couponId;
+ @ApiModelProperty(value = "类型 1=抵扣 2=满减 3=抹零")
+ private Integer couponType;
+
@ApiModelProperty("系统优惠金额")
private Double systemDiscount;
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/FeignLoggingAspect.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/FeignLoggingAspect.java
index 354eb01..f87c60c 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/FeignLoggingAspect.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/FeignLoggingAspect.java
@@ -53,7 +53,7 @@
String fullMethod = className + "#" + methodName;
Object[] args = pjp.getArgs();
- String argsJson = safeToJson(args);
+ String argsJson = isSensitiveFeignMethod(fullMethod) ? "[sensitive args masked]" : safeToJson(args);
String headerStr = extractCurrentHeaders();
if (headerStr != null) {
@@ -94,6 +94,10 @@
}
}
+ private boolean isSensitiveFeignMethod(String fullMethod) {
+ return "SmsClient#pushSms".equals(fullMethod);
+ }
+
/**
* 从当前请求上下文中提取请求头信息
*/
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/RequestResponseLoggingFilter.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/RequestResponseLoggingFilter.java
index 0df4aad..138102d 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/RequestResponseLoggingFilter.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/config/log/RequestResponseLoggingFilter.java
@@ -37,6 +37,11 @@
"/actuator", "/healthcheck", "/health", "/prometheus"
));
+ /** 不打印请求/响应 body 的敏感路径前缀 */
+ private static final Set<String> SENSITIVE_BODY_PATHS = new HashSet<>(Arrays.asList(
+ "/vehicle/v1/robotaxi/sms"
+ ));
+
/** 只对这些 Content-Type 打印 body(避免打印二进制流) */
private static final Set<String> LOGGABLE_CONTENT_TYPES = new HashSet<>(Arrays.asList(
MediaType.APPLICATION_JSON_VALUE,
@@ -101,7 +106,7 @@
String uri = request.getRequestURI();
String query = request.getQueryString();
String method = request.getMethod();
- String body = extractBody(request.getContentAsByteArray(), request.getContentType());
+ String body = isSensitiveBodyPath(uri) ? "[sensitive body masked]" : extractBody(request.getContentAsByteArray(), request.getContentType());
if (logHeaderProperties.isEnabled()) {
String headers = extractHeaders(request);
@@ -148,7 +153,8 @@
private void logResponse(ContentCachingResponseWrapper response, long cost) {
String traceId = MDC.get("traceId");
int status = response.getStatus();
- String body = extractBody(response.getContentAsByteArray(), response.getContentType());
+ String uri = MDC.get("requestUri");
+ String body = isSensitiveBodyPath(uri) ? "[sensitive body masked]" : extractBody(response.getContentAsByteArray(), response.getContentType());
log.info("<<< [{}] status={} cost={}ms | body={}",
traceId, status, cost, body);
@@ -173,4 +179,8 @@
String ct = contentType.toLowerCase();
return LOGGABLE_CONTENT_TYPES.stream().anyMatch(ct::contains);
}
+
+ private boolean isSensitiveBodyPath(String uri) {
+ return uri != null && SENSITIVE_BODY_PATHS.stream().anyMatch(uri::startsWith);
+ }
}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
index 1dd278f..dcd3acb 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -337,8 +337,10 @@
dto.setOrderType(orderType);
R<?> r = xpOrderClient.popOrder(dto);
if(200 != r.getCode()){
+ XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData();
//业务执行失败,给差车端发送取消任务报文,继续执行巡游任务
PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setEndTaskId(xpOrder.getXpuStartTaskId());
pushOrderDto.setOrderId(orderId);
pushOrderDto.setVin(vin);
pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
@@ -996,24 +998,28 @@
R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
- origin.setLongitude(xpCruiseOrder.getStartLon());
- origin.setLatitude(xpCruiseOrder.getStartLat());
- destination.setLongitude(xpCruiseOrder.getEndLon());
- destination.setLatitude(xpCruiseOrder.getEndLat());
+ Object cacheObject = redisService.getCacheObject("CRUISE_ROUTE:" + xpCruiseOrder.getVehicleId());
+ if(null != cacheObject){
+ RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+ routeID = routeVo.getRouteID();
+ }else{
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ destination.setLongitude(xpCruiseOrder.getEndLon());
+ destination.setLatitude(xpCruiseOrder.getEndLat());
- OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
- dto.setOrderId(Long.parseLong(orderId.substring(2)));
- dto.setOrigin(origin);
- dto.setDestination(destination);
- dto.setRouteType(3);
- R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
- if (200 != routeVoR.getCode()) {
- throw new RuntimeException("获取订单线路和运费失败");
+ OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+ dto.setOrderId(Long.parseLong(orderId.substring(2)));
+ dto.setOrigin(origin);
+ dto.setDestination(destination);
+ dto.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+ if (200 != routeVoR.getCode()) {
+ throw new RuntimeException("获取订单线路和运费失败");
+ }
+ RouteVo routeVo = routeVoR.getData();
+ routeID = routeVo.getRouteID();
}
- RouteVo routeVo = routeVoR.getData();
- routeID = routeVo.getRouteID();
-
-
vehicleId = xpCruiseOrder.getVehicleId();
}
} else if(orderId.contains("TEST")){
@@ -1608,7 +1614,7 @@
cruisePointDto.setPointId(newXpCruiseOrder.getStartPointId());
cruisePointDto.setOrderReverse(xpCruiseOrder.getOrderReverse());
R<XpCruiseOrder> cruisePoint = xpCruisePlanClient.getCruisePoint(cruisePointDto);
- if(cruisePoint!=null){
+ if(cruisePoint!=null && 200 == cruisePoint.getCode()){
XpCruiseOrder cruiseOrder1 = cruisePoint.getData();
//不停车替换新任务
cruiseOrder1.setLastOrderId1("XU" + xpCruiseOrder.getId());
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/impl/VehicleRtInfoServiceImpl.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/impl/VehicleRtInfoServiceImpl.java
index c7b8606..8488246 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/impl/VehicleRtInfoServiceImpl.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/impl/VehicleRtInfoServiceImpl.java
@@ -84,7 +84,7 @@
}
String code = MsgUtil.createCode();
- log.info("Robotaxi SMS code generated for mobile {}: {}", request.getMobile(), code);
+ log.info("Robotaxi SMS code generated for mobile {}", maskMobile(request.getMobile()));
// TODO: Call SMS interface to send code when available
// sendSms(request.getMobile(), code);
@@ -159,18 +159,14 @@
}
private XpCommonResponse<?> validateVehicleReadyIfNeeded(String smsType, String vin) {
- if (!SmsType.ACCEPT_RIDES.name().equals(smsType)) {
- return null;
- }
XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData();
if (vehicle == null) {
return XpCommonResponse.fail(RobotaxiErrorEnum.MOBILE_VIN_MISMATCH);
}
- Integer status = vehicle.getStatus();
Integer operatingStatus = vehicle.getOperatingStatus();
- if (smsType.equals(SmsType.ACCEPT_RIDES.name()) && operatingStatus != 1) {
- return XpCommonResponse.fail(RobotaxiErrorEnum.VEHICLE_NOT_READY);
- }
+// if (smsType.equals(SmsType.ACCEPT_RIDES.name()) && operatingStatus != 1) {
+// return XpCommonResponse.fail(RobotaxiErrorEnum.VEHICLE_NOT_READY);
+// }
if (smsType.equals(SmsType.STOP_ACCEPT_RIDES.name()) && operatingStatus != 3) {
return XpCommonResponse.fail(RobotaxiErrorEnum.VEHICLE_NOT_READY);
}
@@ -212,4 +208,11 @@
private String buildSmsCodeKey(String smsType, String vin, String mobile) {
return "ROBOTAXI_SMS_CODE:" + smsType + ":" + vin + ":" + mobile;
}
+
+ private String maskMobile(String mobile) {
+ if (StringUtils.isEmpty(mobile) || mobile.length() < 7) {
+ return "******";
+ }
+ return mobile.substring(0, 3) + "****" + mobile.substring(mobile.length() - 4);
+ }
}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/resources/application-local.yml b/xp-robotaxi-automatic-pilot-boot/src/main/resources/application-local.yml
index c98d0e0..f8d4b7e 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/resources/application-local.yml
@@ -4,7 +4,10 @@
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
diff --git a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/TokenConstants.java b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/TokenConstants.java
index 27cca2b..39792c2 100644
--- a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/TokenConstants.java
+++ b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/TokenConstants.java
@@ -20,7 +20,7 @@
/**
* 令牌秘钥
*/
- public final static String SECRET = "iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam";
+ public static String SECRET = "";
/**
* 参数签名
@@ -46,4 +46,17 @@
*/
public static final Long EXPIRATION_TIME = 5L;
+ public static String getSecret()
+ {
+ return SECRET;
+ }
+
+ public static void setSecret(String secret)
+ {
+ if (secret != null && !secret.trim().isEmpty())
+ {
+ SECRET = secret;
+ }
+ }
+
}
diff --git a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/enums/MessageTemplateEnum.java b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/enums/MessageTemplateEnum.java
index 6d0f13e..9232709 100644
--- a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/enums/MessageTemplateEnum.java
+++ b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/enums/MessageTemplateEnum.java
@@ -4,23 +4,23 @@
@Getter
public enum MessageTemplateEnum {
- A(1,"微信","NOi0ff4rpuTxcRnnZl0SJxg9SMbvrc8xB8VJgrwu3oo","订单状态更新通知",
- "{\"character_string1\":{\"value\":\"订单编号\"},\"phrase3\":{\"value\":\"订单状态\"},\"thing5\":{\"value\":\"备注\"},\"time8\":{\"value\":\"时间\"}}"),
+ A(1,"微信","9PFe1-lI0Gqm0LoNWVtUOW9Is2qEy9Lb8FfZ5iwq2fU","订单状态更新通知",
+ "{\"car_number3\":{\"value\":\"订单编号\"},\"phrase2\":{\"value\":\"订单状态\"},\"thing4\":{\"value\":\"备注\"}}"),
- B(1,"微信","S6gGP8jyuDTkW03h8LhOm2KVDdUtHr0OhL-Mt_PyRPU","运营活动通用模板",
- "{\"thing3\":{\"value\":\"活动名称\"},\"time1\":{\"value\":\"开始时间\"},\"time4\":{\"value\":\"结束时间\"},\"thing6\":{\"value\":\"温馨提示\"}}"),
+ B(1,"微信","Q4nE00g3ocbU1KuoqE2-OwFkfRx2U8mbzPwgLxJ1TDU","运营活动通用模板",
+ "{\"thing4\":{\"value\":\"活动名称\"},\"thing3\":{\"value\":\"温馨提示\"}}"),
- C(1,"微信","ANtToR63JPCV_ujV69gmO15xCa8O3elnLWB52HLdcHM","券效期通用模板",
- "{\"thing1\":{\"value\":\"优惠券名称\"},\"thing2\":{\"value\":\"今日出行最高立减XXX元,点击领取\"}}"),
+ C(1,"微信","Q4nE00g3ocbU1KuoqE2-OwFkfRx2U8mbzPwgLxJ1TDU","券效期通用模板",
+ "{\"thing4\":{\"value\":\"活动名称\"},\"thing3\":{\"value\":\"温馨提示\"}}"),
- D(1,"微信","P7z_ksdyzpiiOBO07EJ1AZ6WeHlWs4XveQYjmt9JRE8","券到账通用模板",
- "{\"thing1\":{\"value\":\"优惠券名称\"},\"time2\":{\"value\":\"券有效期\"},\"thing3\":{\"value\":\"使用规则\"}}"),
+ D(1,"微信","JLiufoz6pdmLFz8zFsmzoWGjJqlDHOgSu9rSCt2LPgk","券到账通用模板",
+ "{\"thing1\":{\"value\":\"优惠券名称\"},\"thing4\":{\"value\":\"使用规则\"}}"),
- E(1,"微信","elyV30kO0BZAD2OtihJ4Wdu7fwR3FdvCZYCM1BEbqWs","车辆接单/改派通知",
- "{\"car_number1\":{\"value\":\"车牌号\"},\"time3\":{\"value\":\"报警时间\"}}"),
+ E(1,"微信","M-EDbUro0gvJnMwjixoOumnD99wpJKFJeE4NIqAYLYE","车辆接单/改派通知",
+ "{\"car_number2\":{\"value\":\"车牌号\"},\"time3\":{\"value\":\"报警时间\"}}"),
- F(1,"微信","elyV30kO0BZAD2OtihJ4Wdu7fwR3FdvCZYCM1BEbqWs","券过期通用模板",
- "{\"thing1\":{\"value\":\"优惠券名称\"},\"time2\":{\"value\":\"券过期时间\"},\"thing3\":{\"value\":\"使用规则\"}}"),
+ F(1,"微信","ZNI5Z5pIdIyJVreKsSLNWurssc9b6euGNjIkXvfi4Ag","券过期通用模板",
+ "{\"thing1\":{\"value\":\"优惠券名称\"},\"date2\":{\"value\":\"券过期时间\"},\"thing3\":{\"value\":\"使用规则\"}}"),
;
diff --git a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/ConfigUtils.java b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/ConfigUtils.java
index b0b1f7f..0252e22 100644
--- a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/ConfigUtils.java
+++ b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/ConfigUtils.java
@@ -1,6 +1,7 @@
package com.xiaopeng.common.core.utils;
+import com.xiaopeng.common.core.constant.TokenConstants;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@@ -9,9 +10,7 @@
@Component
public class ConfigUtils {
-
- // 1. 正常注入非静态字段
- @Value("${token.secret}")
+ @Value("${token.secret:${spring.token.secret:}}")
private String secret;
@@ -19,23 +18,22 @@
@PostConstruct
public void init() {
- System.err.println("ConfigUtils init");
instance = this;
+ TokenConstants.setSecret(secret);
}
- // 3. 提供静态方法供外部调用
- public static String getMyConfigValue() {
+ public static String getTokenSecret() {
if (instance == null) {
- throw new IllegalStateException("ConfigUtils has not been initialized by Spring yet.");
+ return TokenConstants.getSecret();
}
return instance.secret;
}
- // 如果需要修改值,也可以提供静态 setter (视需求而定)
- public static void setMyConfigValue(String value) {
+ public static void setTokenSecret(String value) {
if (instance != null) {
instance.secret = value;
}
+ TokenConstants.setSecret(value);
}
}
diff --git a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/JwtUtils.java b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/JwtUtils.java
index 6af152c..60a78cb 100644
--- a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/JwtUtils.java
+++ b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/JwtUtils.java
@@ -15,8 +15,6 @@
*/
public class JwtUtils
{
- public static String secret = TokenConstants.SECRET;
-
/**
* 从数据声明生成令牌
*
@@ -25,7 +23,7 @@
*/
public static String createToken(Map<String, Object> claims)
{
- String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
+ String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, TokenConstants.getSecret()).compact();
return token;
}
@@ -37,7 +35,7 @@
*/
public static Claims parseToken(String token)
{
- return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
+ return Jwts.parser().setSigningKey(TokenConstants.getSecret()).parseClaimsJws(token).getBody();
}
/**
diff --git a/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/config/WebMvcConfig.java b/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/config/WebMvcConfig.java
index 2097cd4..9e480cd 100644
--- a/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/config/WebMvcConfig.java
+++ b/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/config/WebMvcConfig.java
@@ -19,11 +19,11 @@
"/register",
"/base/v1/login",
"/base/v1/captcha",
- "/base/v1/operationPasswordLogin",
- "/base/v1/verificationCodeLogin",
- "/base/v1/getVerificationCode",
- "/base/v1/updatePassword",
- "/maintenance-app/ssoAuthSdk/appLogin"
+// "/base/v1/operationPasswordLogin",
+// "/base/v1/verificationCodeLogin",
+// "/base/v1/getVerificationCode",
+// "/base/v1/updatePassword",
+// "/maintenance-app/ssoAuthSdk/appLogin"
};
@Override
diff --git a/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/service/TokenService.java b/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/service/TokenService.java
index 3164b66..4c3354f 100644
--- a/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/service/TokenService.java
+++ b/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/service/TokenService.java
@@ -22,6 +22,7 @@
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.common.security.config.TokenProperties;
import com.xiaopeng.common.security.utils.SecurityUtils;
+import io.jsonwebtoken.Claims;
/**
* token验证处理
@@ -261,8 +262,12 @@
*/
public void delLoginUser(String token) {
if (StringUtils.isNotEmpty(token)) {
- String userkey = JwtUtils.getUserKey(token);
- redisService.deleteObject(getTokenKey(userkey));
+ Claims claims = JwtUtils.parseToken(token);
+ String userType = JwtUtils.getUserType(claims);
+ String userKey = "system".equals(userType) ? JwtUtils.getUserKey(claims) : JwtUtils.getOperationUserKey(claims);
+ if (StringUtils.isNotBlank(userKey)) {
+ redisService.deleteObject(getTokenKey(userKey));
+ }
}
}
@@ -337,4 +342,4 @@
private String getUserKey(Long userid) {
return ACCESS_TOKEN + userid;
}
-}
\ No newline at end of file
+}
diff --git a/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/AuthFilter.java b/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/AuthFilter.java
index 5d4b50f..2217a1d 100644
--- a/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/AuthFilter.java
+++ b/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/AuthFilter.java
@@ -89,6 +89,9 @@
String username = JwtUtils.getUserName(claims);
String userType = JwtUtils.getUserType(claims);
String operationUserKey = JwtUtils.getOperationUserKey(claims);
+ if (!checkPathPermission(userType, url)) {
+ return unauthorizedResponse(exchange, "无权访问当前资源");
+ }
String redisKey = "";
if ("system".equals(userType)) {
redisKey = StringUtils.isNotBlank(userkey) ? getTokenKey(userkey) : "";
@@ -153,6 +156,17 @@
private String getTokenKey(String token) {
return CacheConstants.LOGIN_TOKEN_KEY + token;
}
+
+ private boolean checkPathPermission(String userType, String url) {
+ boolean appPath = StringUtils.isNotBlank(url) && url.contains("/maintenance-app");
+ if ("operation".equals(userType)) {
+ return appPath;
+ }
+ if ("system".equals(userType)) {
+ return !appPath;
+ }
+ return true;
+ }
/**
* 获取请求token
@@ -194,4 +208,4 @@
public int getOrder() {
return -300;
}
-}
\ No newline at end of file
+}
diff --git a/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java b/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java
index 2a5b378..967ae64 100644
--- a/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java
+++ b/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java
@@ -12,8 +12,6 @@
import com.xiaopeng.gateway.config.properties.SignProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
@@ -26,8 +24,6 @@
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebSession;
-import org.springframework.web.server.session.WebSessionManager;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -143,7 +139,6 @@
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
String bodyString = new String(bytes, StandardCharsets.UTF_8);
- log.info("请求参数:{}", bodyString);
if(!authSign(JSON.parseObject(bodyString), sign, nonce, timestamp)){
return unauthorizedResponse(exchange, "请求失败,请稍后重试!");
}
@@ -195,7 +190,6 @@
signUrl = sb.substring(0, sb.length() - 1);
}
signUrl = signUrl + (StringUtils.isNotEmpty(signUrl) ? "&" : "") + "timestamp=" + timestamp;
- log.info("签名串:" + signUrl);
return signUrlEncode(signUrl, key);
}
@@ -205,12 +199,9 @@
* @return
*/
private boolean authSign(JSONObject jsonStr, String sign, String nonce, String timestamp) {
- log.info("请求签名:" + sign);
String signUrlEncode = localSignUrl(jsonStr, nonce, timestamp);
signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(")
.replaceAll("& #41;", "\\)");
- log.info("签名key:{}", nonce);
- log.info("校验签名值:" + signUrlEncode);
if (sign.equals(signUrlEncode)) {
return true;
}
@@ -235,4 +226,4 @@
{
return -200;
}
-}
\ No newline at end of file
+}
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
index 6889215..a816bb0 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
@@ -63,7 +63,7 @@
* 1.重新确认路线
* 2.确认价格
*/
- @ApiOperation(value = "行程中 修改目的地 确认按钮", notes = "", tags = {"小程序-行程中修改目的地"})
+ @ApiOperation(value = "确认修改目的地", notes = "", tags = {"小程序-行程中修改目的地"})
@PostMapping("/api/v1/mini-program/order/orderChange")
@XpClientCheck(checkToken = false, checkOtpToken = true)
public R<?> orderChange(@RequestBody @Validated OrderChangeDto dto, HttpServletRequest request) {
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/ActiveOrderServiceImpl.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/ActiveOrderServiceImpl.java
index 5210bf8..f86ffc8 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/ActiveOrderServiceImpl.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/ActiveOrderServiceImpl.java
@@ -239,15 +239,16 @@
points.add(dto.getDistance()+"");
points.add(dto.getDuration()+"");
- String key = CacheConstants.QUEUE_POINT_ID + "-" + xpPoint.getId() + "-" + xpPoint.getPointLon() + "," + xpPoint.getPointLat();
- if (planRuleForQueue == null) {
- redisService.addToTail(key,points+"_"+null);
- } else {
- redisService.addToTail(key,points+"_"+planRuleForQueue);
- }
- log.info("订单推单:{} {}", key, redisService.getCacheList(key));
- xpOrder.setQueueName(key);
- xpOrderClient.updateOrder(xpOrder);
+ // todo 临时关闭,不知道这里修改队列数据干嘛
+// String key = CacheConstants.QUEUE_POINT_ID + "-" + xpPoint.getId() + "-" + xpPoint.getPointLon() + "," + xpPoint.getPointLat();
+// if (planRuleForQueue == null) {
+// redisService.addToTail(key,points+"_"+null);
+// } else {
+// redisService.addToTail(key,points+"_"+planRuleForQueue);
+// }
+// log.info("订单推单:{} {}", key, redisService.getCacheList(key));
+// xpOrder.setQueueName(key);
+// xpOrderClient.updateOrder(xpOrder);
//给车端推送修改目的地报文
String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
PushOrderDto pushOrderDto = new PushOrderDto();
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
index eecb099..f915b3c 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -306,7 +306,7 @@
routeVo.getDistance(), routeVo.getDuration(), 0, 0.0, xpPricing.getIsDynamicPrice(), routeAndFareDto.getOpenCityId(), xpPricing.getDynamicPricingJson()
);
}
-
+ log.info("计算费用明细 {}", JSON.toJSONString(xpPricingCardVo));
// 优惠券:null=自动最佳;0=不使用;>0=指定券
XpPricingCardVo finalXpPricingCardVo = xpPricingCardVo;
R<UserCouponVo> coupon = null;
@@ -404,13 +404,15 @@
// 9. 设置费用信息
fareVo.setOriginalFare(xpPricingCardVo.getTotalPrice());
- fareVo.setOriginalFareStr(new BigDecimal(fareVo.getOriginalFare()).setScale(2, RoundingMode.HALF_UP).toString());
+ fareVo.setOriginalFareStr(new BigDecimal(xpPricingCardVo.getTotalPrice()).setScale(2, RoundingMode.HALF_UP).toString());
if (userCouponVo != null) {
if(userCouponVo.getMoney()>fareVo.getOriginalFare()){
+ fareVo.setCouponType(userCouponVo.getCouponType());
fareVo.setDiscountAmount(fareVo.getOriginalFare());
fareVo.setFinalFare(0.00);
}else {
fareVo.setDiscountAmount(userCouponVo.getMoney());
+ fareVo.setCouponType(userCouponVo.getCouponType());
fareVo.setFinalFare(fareVo.getOriginalFare() - fareVo.getDiscountAmount());
}
// if(fareVo.getFinalFare()>0){
@@ -654,7 +656,7 @@
XpOrder xpOrder = new XpOrder();
xpOrder.setMileageKilometers(0.0);
xpOrder.setAppUserId(Long.valueOf(uid));
- xpOrder.setOrderNumber("XP" + System.currentTimeMillis());
+ xpOrder.setOrderNumber(getOrderNumber());
xpOrder.setPlacementLon(dto.getPlacementLon());
xpOrder.setPlacementLat(dto.getPlacementLat());
xpOrder.setPlacementAddress(dto.getPlacementAddress());
@@ -778,6 +780,11 @@
}
}
+ private String getOrderNumber(){
+ int random = Double.valueOf(Math.random() * 1000).intValue();
+ return "XP" + random + System.currentTimeMillis();
+ }
+
/**
* 构建普通订单推送数据
@@ -795,27 +802,57 @@
*/
private String addOrderPush(XpOrder xpOrder, XpPoint xpPoint, XpRoutePlan xpRoutePlan, double maxPushDistance,
Boolean isPriorityDispatch, Long orderId, String currentTimeSlot, Integer distance, Integer duration, String uid){
- // 找出现在所有的队列 通过计算距离 算出目前应该放在那个队列 如果没有符合的新增一个队列 符合后看是否白名单账号 是则直接放在队列前端
- Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.QUEUE_POINT_ID);
- log.info("当前队列:{}", quoteMatchName);
- for (String s : quoteMatchName) {
+ RLock lock = redissonClient.getLock("ADD_ORDER_PUSH");
+ try {
+ if(lock.tryLock(2, 5, TimeUnit.SECONDS)){
+ // 找出现在所有的队列 通过计算距离 算出目前应该放在那个队列 如果没有符合的新增一个队列 符合后看是否白名单账号 是则直接放在队列前端
+ Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.QUEUE_POINT_ID);
+ log.info("当前队列:{}", quoteMatchName);
+ for (String s : quoteMatchName) {
// QUEUE_POINT_ID-1-30.233,120.233
- String lonLat = s.split("-")[2];
- // 和上车点进行判断是否<maxPushDistance
- double v = FastDistanceCalculator.distanceFast(Double.parseDouble(lonLat.split(",")[1]), Double.parseDouble(lonLat.split(",")[0]), xpPoint.getPointLat(), xpPoint.getPointLon());
- if (v < maxPushDistance) {
- String value = orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule();
- if (isPriorityDispatch) {
- // 头部 value 订单_经纬度_状态_用户id_订单编号_距离_时间
- redisService.addToHead(s, value);
- log.info("添加到队列头部:{} {}", s, value);
- } else {
- // 尾部
- redisService.addToTail(s, value);
- log.info("添加到队列尾部:{} {}", s, value);
+ String lonLat = s.split("-")[2];
+ // 和上车点进行判断是否<maxPushDistance
+ double v = FastDistanceCalculator.distanceFast(Double.parseDouble(lonLat.split(",")[1]), Double.parseDouble(lonLat.split(",")[0]), xpPoint.getPointLat(), xpPoint.getPointLon());
+ if (v < maxPushDistance) {
+ String value = orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule();
+ if (isPriorityDispatch) {
+ // 头部 value 订单_经纬度_状态_用户id_订单编号_距离_时间
+ redisService.addToHead(s, value);
+ log.info("添加到队列头部:{} {}", s, value);
+ } else {
+ // 尾部
+ redisService.addToTail(s, value);
+ log.info("添加到队列尾部:{} {}", s, value);
+ }
+ xpOrder.setQueueName(s);
+ xpOrder.setQueueValue(value);
+ xpOrderClient.updateOrder(xpOrder);
+
+ // 存储mongodb 数据
+ XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
+ xpGeoQueryEntity.setOrderId(orderId.toString());
+ xpGeoQueryEntity.setLocation(new GeoJsonPoint(xpPoint.getPointLon(), xpPoint.getPointLat()));
+ // 计算2个时间的秒数
+ xpGeoQueryEntity.setTime(currentTimeSlot);
+ xpGeoQueryEntity.setStatus(0);
+ xpGeoQueryEntity.setTimestamp(System.currentTimeMillis());
+ geoQueryEntityService.save(xpGeoQueryEntity);
+
+ return orderId.toString();
+ }
}
- xpOrder.setQueueName(s);
+
+ String key = CacheConstants.QUEUE_POINT_ID + "-" + xpPoint.getId() + "-" + xpPoint.getPointLon() + "," + xpPoint.getPointLat();
+ if(xpRoutePlan==null){
+ redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + null));
+
+ }else {
+ redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule()));
+ }
+ log.info("订单推单:{} {}", key, redisService.getCacheList(key));
+ xpOrder.setQueueName(key);
xpOrderClient.updateOrder(xpOrder);
+
// 存储mongodb 数据
XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
@@ -826,33 +863,12 @@
xpGeoQueryEntity.setStatus(0);
xpGeoQueryEntity.setTimestamp(System.currentTimeMillis());
geoQueryEntityService.save(xpGeoQueryEntity);
-
- return orderId.toString();
}
+ }catch (Exception e){
+ e.printStackTrace();
+ }finally {
+ lock.unlock();
}
-
- String key = CacheConstants.QUEUE_POINT_ID + "-" + xpPoint.getId() + "-" + xpPoint.getPointLon() + "," + xpPoint.getPointLat();
- if(xpRoutePlan==null){
- redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + null));
-
- }else {
- redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule()));
- }
- log.info("订单推单:{} {}", key, redisService.getCacheList(key));
- xpOrder.setQueueName(key);
- xpOrderClient.updateOrder(xpOrder);
-
-
- // 存储mongodb 数据
- XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
- xpGeoQueryEntity.setOrderId(orderId.toString());
- xpGeoQueryEntity.setLocation(new GeoJsonPoint(xpPoint.getPointLon(), xpPoint.getPointLat()));
- // 计算2个时间的秒数
- xpGeoQueryEntity.setTime(currentTimeSlot);
- xpGeoQueryEntity.setStatus(0);
- xpGeoQueryEntity.setTimestamp(System.currentTimeMillis());
- geoQueryEntityService.save(xpGeoQueryEntity);
-
return orderId.toString();
}
@@ -872,56 +888,100 @@
*/
private String addSpOrderPush(XpOrder xpOrder, XpPoint xpPoint, XpRoutePlan xpRoutePlan, double maxPushDistance,
Integer weight, Long orderId, String currentTimeSlot, Integer distance, Integer duration, String uid){
- // 找出现在所有的队列 通过计算距离 算出目前应该放在那个队列 如果没有符合的新增一个队列 符合后看是否白名单账号 是则直接放在队列前端
- Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.SP_QUEUE_POINT_ID);
- log.info("当前队列(定向服务):{}", quoteMatchName);
+ RLock lock = redissonClient.getLock("ADD_SP_ORDER_PUSH");
+ try {
+ if(lock.tryLock(2, 5, TimeUnit.SECONDS)){
+ // 找出现在所有的队列 通过计算距离 算出目前应该放在那个队列 如果没有符合的新增一个队列 符合后看是否白名单账号 是则直接放在队列前端
+ Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.SP_QUEUE_POINT_ID);
+ log.info("当前队列(定向服务):{}", quoteMatchName);
- for (String s : quoteMatchName) {
-// QUEUE_POINT_ID-1-30.233,120.233
- String lonLat = s.split("-")[2];
- // 和上车点进行判断是否<maxPushDistance
- double v = FastDistanceCalculator.distanceFast(Double.parseDouble(lonLat.split(",")[1]), Double.parseDouble(lonLat.split(",")[0]), xpPoint.getPointLat(), xpPoint.getPointLon());
- if (v < maxPushDistance) {
- //在范围内,将队列中的数据转换成对象进行排序
- List<String> cacheList = redisService.getCacheList(s);
- List<RedisQueuePointIdVo> ll = new ArrayList<>();
- for (String string : cacheList) {
- String[] split = string.split("_");
- RedisQueuePointIdVo redisQueuePointIdVo = new RedisQueuePointIdVo();
- redisQueuePointIdVo.setOrderId(split[0]);
- redisQueuePointIdVo.setPointLonLat(split[1]);
- redisQueuePointIdVo.setPushStatus(split[2]);
- redisQueuePointIdVo.setUid(split[3]);
- redisQueuePointIdVo.setOrderNumber(split[4]);
- redisQueuePointIdVo.setDistance(split[5]);
- redisQueuePointIdVo.setDuration(split[6]);
- redisQueuePointIdVo.setPlanRuleForQueue(split[7]);
- redisQueuePointIdVo.setTargetedVal(Integer.valueOf(split[8]));
- ll.add(redisQueuePointIdVo);
+ for (String s : quoteMatchName) {
+ String lonLat = s.split("-")[2];
+ // 和上车点进行判断是否<maxPushDistance
+ double v = FastDistanceCalculator.distanceFast(Double.parseDouble(lonLat.split(",")[1]), Double.parseDouble(lonLat.split(",")[0]), xpPoint.getPointLat(), xpPoint.getPointLon());
+ if (v < maxPushDistance) {
+ //在范围内,将队列中的数据转换成对象进行排序
+ List<String> cacheList = redisService.getCacheList(s);
+ List<RedisQueuePointIdVo> ll = new ArrayList<>();
+ //正在派单的数据,不参与权重排序
+ String pushOrder = null;
+ for (String string : cacheList) {
+ String[] split = string.split("_");
+ if(split[2].equals("0")){
+ RedisQueuePointIdVo redisQueuePointIdVo = new RedisQueuePointIdVo();
+ redisQueuePointIdVo.setOrderId(split[0]);
+ redisQueuePointIdVo.setPointLonLat(split[1]);
+ redisQueuePointIdVo.setPushStatus(split[2]);
+ redisQueuePointIdVo.setUid(split[3]);
+ redisQueuePointIdVo.setOrderNumber(split[4]);
+ redisQueuePointIdVo.setDistance(split[5]);
+ redisQueuePointIdVo.setDuration(split[6]);
+ redisQueuePointIdVo.setPlanRuleForQueue(split[7]);
+ redisQueuePointIdVo.setTargetedVal(Integer.valueOf(split[8]));
+ ll.add(redisQueuePointIdVo);
+ }else{
+ pushOrder = string;
+ }
+ }
+
+ RedisQueuePointIdVo redisQueuePointIdVo = new RedisQueuePointIdVo();
+ redisQueuePointIdVo.setOrderId(orderId.toString());
+ redisQueuePointIdVo.setPointLonLat(xpPoint.getPointLon() + "," + xpPoint.getPointLat());
+ redisQueuePointIdVo.setPushStatus("0");
+ redisQueuePointIdVo.setUid(uid);
+ redisQueuePointIdVo.setOrderNumber(xpOrder.getOrderNumber());
+ redisQueuePointIdVo.setDistance(distance.toString());
+ redisQueuePointIdVo.setDuration(duration.toString());
+ redisQueuePointIdVo.setPlanRuleForQueue(xpRoutePlan.getRoutePlanRule().toString());
+ redisQueuePointIdVo.setTargetedVal(weight);
+ ll.add(redisQueuePointIdVo);
+
+ //排序
+ ll.sort((o1, o2) -> o2.getTargetedVal() - o1.getTargetedVal());
+ List<String> collect = ll.stream().map(item -> {
+ String value = item.getOrderId() + "_" + item.getPointLonLat() + "_" + item.getPushStatus() + "_" + item.getUid() + "_" + item.getOrderNumber()
+ + "_" + item.getDistance() + "_" + item.getDuration() + "_" + item.getPlanRuleForQueue() + "_" + item.getTargetedVal();
+ return value;
+ }).collect(Collectors.toList());
+ //如果有正在推单的数据,则放在第一位
+ if(StringUtils.isNotEmpty(pushOrder)){
+ collect.add(0, pushOrder);
+ }
+ //先清除key的缓存数据
+ redisService.deleteObject(s);
+ //再全部重新赋值
+ redisService.setCacheList(s, collect);
+
+ String value = orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0_" + uid + "_" + xpOrder.getOrderNumber()
+ + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule() + "_" + weight;
+ xpOrder.setQueueName(s);
+ xpOrder.setQueueValue(value);
+ xpOrderClient.updateOrder(xpOrder);
+
+ // 存储mongodb 数据
+ XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
+ xpGeoQueryEntity.setOrderId(orderId.toString());
+ xpGeoQueryEntity.setLocation(new GeoJsonPoint(xpPoint.getPointLon(), xpPoint.getPointLat()));
+ // 计算2个时间的秒数
+ xpGeoQueryEntity.setTime(currentTimeSlot);
+ xpGeoQueryEntity.setStatus(0);
+ xpGeoQueryEntity.setTimestamp(System.currentTimeMillis());
+ geoQueryEntityService.save(xpGeoQueryEntity);
+
+ return orderId.toString();
+ }
}
- RedisQueuePointIdVo redisQueuePointIdVo = new RedisQueuePointIdVo();
- redisQueuePointIdVo.setOrderId(orderId.toString());
- redisQueuePointIdVo.setPointLonLat(xpPoint.getPointLon() + "," + xpPoint.getPointLat());
- redisQueuePointIdVo.setPushStatus("0");
- redisQueuePointIdVo.setUid(uid);
- redisQueuePointIdVo.setOrderNumber(xpOrder.getOrderNumber());
- redisQueuePointIdVo.setDistance(distance.toString());
- redisQueuePointIdVo.setDuration(duration.toString());
- redisQueuePointIdVo.setPlanRuleForQueue(xpRoutePlan.getRoutePlanRule().toString());
- redisQueuePointIdVo.setTargetedVal(weight);
- ll.add(redisQueuePointIdVo);
- //排序
- ll.sort((o1, o2) -> o2.getTargetedVal() - o1.getTargetedVal());
- List<String> collect = ll.stream().map(item -> {
- String value = item.getOrderId() + "_" + item.getPointLonLat() + "_" + item.getPushStatus() + "_" + item.getUid() + "_" + item.getOrderNumber()
- + "_" + item.getDistance() + "_" + item.getDuration() + "_" + item.getPlanRuleForQueue() + "_" + item.getTargetedVal();
- return value;
- }).collect(Collectors.toList());
- redisService.setCacheList(s, cacheList);
-
- xpOrder.setQueueName(s);
+ String key = CacheConstants.SP_QUEUE_POINT_ID + "-" + xpPoint.getId() + "-" + xpPoint.getPointLon() + "," + xpPoint.getPointLat();
+ if(xpRoutePlan==null){
+ redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + null + "_" + weight));
+ }else {
+ redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule() + "_" + weight));
+ }
+ log.info("订单推单:{} {}", key, redisService.getCacheList(key));
+ xpOrder.setQueueName(key);
xpOrderClient.updateOrder(xpOrder);
+
// 存储mongodb 数据
XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
@@ -932,32 +992,12 @@
xpGeoQueryEntity.setStatus(0);
xpGeoQueryEntity.setTimestamp(System.currentTimeMillis());
geoQueryEntityService.save(xpGeoQueryEntity);
-
- return orderId.toString();
}
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ lock.unlock();
}
-
- String key = CacheConstants.SP_QUEUE_POINT_ID + "-" + xpPoint.getId() + "-" + xpPoint.getPointLon() + "," + xpPoint.getPointLat();
- if(xpRoutePlan==null){
- redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + null + "_" + weight));
- }else {
- redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule() + "_" + weight));
- }
- log.info("订单推单:{} {}", key, redisService.getCacheList(key));
- xpOrder.setQueueName(key);
- xpOrderClient.updateOrder(xpOrder);
-
-
- // 存储mongodb 数据
- XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
- xpGeoQueryEntity.setOrderId(orderId.toString());
- xpGeoQueryEntity.setLocation(new GeoJsonPoint(xpPoint.getPointLon(), xpPoint.getPointLat()));
- // 计算2个时间的秒数
- xpGeoQueryEntity.setTime(currentTimeSlot);
- xpGeoQueryEntity.setStatus(0);
- xpGeoQueryEntity.setTimestamp(System.currentTimeMillis());
- geoQueryEntityService.save(xpGeoQueryEntity);
-
return orderId.toString();
}
@@ -1088,9 +1128,11 @@
if (userCouponVo != null) {
if (userCouponVo.getMoney() > fareVo.getOriginalFare()) {
fareVo.setDiscountAmount(fareVo.getOriginalFare());
+ fareVo.setCouponType(userCouponVo.getCouponType());
fareVo.setFinalFare(0.00);
} else {
fareVo.setDiscountAmount(userCouponVo.getMoney());
+ fareVo.setCouponType(userCouponVo.getCouponType());
fareVo.setFinalFare(fareVo.getOriginalFare() - fareVo.getDiscountAmount());
}
fareVo.setCouponId(userCouponVo.getId());
@@ -1222,6 +1264,7 @@
R<XpTradingStrategyDetailVO> strategyDetailVOR = xpTradingStrategyClient.queryById();
XpTradingStrategyDetailVO strategyDetailVO = strategyDetailVOR.getData();
+ //将多线路数据缓存,用于后续确认操作
redisService.setCacheObject(CacheConstants.ORDER_MULTI_ROUTE_SNAPSHOT + userId + ":" + snapshotId, JSON.toJSONString(payload), Long.valueOf(strategyDetailVO.getMaxStandingTiming()), TimeUnit.SECONDS);
@@ -1236,9 +1279,6 @@
vo.setOperateFree(operateFree);
//产品喊写死
vo.setMaxPeopleNumber(5);
-
- RouteOptionVo first = options.get(0);
- redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + userId, JSON.toJSONString(first.getRoute()), 24L, TimeUnit.HOURS);
return vo;
}
@Override
@@ -1473,18 +1513,20 @@
RLock lock = redissonClient.getLock("queue_lock_" + queueName);
try {
if(lock.tryLock(2, 5, TimeUnit.SECONDS)){
- if (StringUtils.isBlank(queueName)) {
+ if (StringUtils.isEmpty(queueName)) {
// 订单不在排队中
queueStatusVo.setStatus(1);
queueStatusVo.setCurrentPosition(0);
queueStatusVo.setTotalCount(0);
queueStatusVo.setEstimatedWaitTime(0);
+ log.info("订单不在排队中: {}", orderId);
return queueStatusVo;
}
// 从Redis获取队列数据
List<String> queueItems = redisService.getCacheList(queueName);
if (queueItems == null || queueItems.isEmpty()) {
+ log.error("列表为空: {}", orderId);
// 队列为空,说明已分配车辆
queueStatusVo.setStatus(1);
queueStatusVo.setCurrentPosition(0);
@@ -1492,7 +1534,7 @@
queueStatusVo.setEstimatedWaitTime(0);
return queueStatusVo;
}
-
+ log.info("排队队列数据 {}", JSON.toJSONString(queueItems));
// 遍历队列,找到当前订单的位置
int currentPosition = 0;
int totalCount = queueItems.size();
@@ -1513,6 +1555,7 @@
queueStatusVo.setEstimatedWaitTime((waitTimeTimeSlot*currentPosition)/60);
}
} catch (Exception e) {
+ e.printStackTrace();
log.error("查询排队状态失败: {}", e.getMessage(), e);
// 异常情况下返回默认值
queueStatusVo.setStatus(0);
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
index 3bf1452..62dea6a 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
@@ -22,6 +22,9 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
@@ -83,7 +86,7 @@
public XpPricingCardVo calculationFixedPrice(String uid, JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney,
Integer isDynamicPriceStatus, Long openCityId, String dynamicPricingJson) {
// 默认费率1
- double priceRate=1;
+ double priceRate=100;
if(isDynamicPriceStatus==1){
// 先判断是否已经调价过了(供需调价)
Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid);
@@ -91,66 +94,62 @@
// 是否调价过了
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
}else {
- //是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
- if(dynamicPriceObj!=null){
- JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
- // 触发动态调价
- // value=时间
- String timeStr = dynamicPriceObj.toString();
- // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
- R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
- if(r.getCode()==200){
- int num = r.getData();
- // X单上升一次调价
- Integer orderNum = getOrderNum(jsonObject, 4);
- // 需要调价的次数
- int count = num / orderNum;
- if(count>0){
- // 计算每次上升的费率
- Integer upRate = getOrderNum(jsonObject, 5);
- BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
- for (int i = count; i > 0; i--) {
- // 当前费率+(费率*上升百分比)
- priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- }
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ Integer num1 = jsonObject.getInteger("num1");
+ String timeStr = LocalDateTime.now().minusMinutes(num1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // 触发动态调价
+ // value=时间
+ // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+ R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
+ if(r.getCode()==200){
+ int num = r.getData();
+ // X单上升一次调价
+ Integer orderNum = getOrderNum(jsonObject, 4);
+ // 需要调价的次数
+ int count = num / orderNum;
+ if(count>0){
+ // 计算每次上升的费率
+ Integer upRate = getOrderNum(jsonObject, 5);
+ BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+ for (int i = count; i > 0; i--) {
+ // 当前费率+(费率*上升百分比)
+ priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
}
- if(priceRate > 1){
- // 冷却时间
- Integer time = getOrderNum(jsonObject, 6);
- // 触发调价了
- redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
- }
+ }
+ if(priceRate > 1){
+ // 冷却时间
+ Integer time = getOrderNum(jsonObject, 6);
+ // 触发调价了
+ redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
}
}
+ log.info("供需后的费率 {}", priceRate);
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
- if(dynamicPriceObj!=null) {
- JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
- // 天气预报动态调价
- JSONArray ws = jsonObject.getJSONArray("weatherRules");
- if (null != ws) {
- XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
- WeatherDTO data = xpMapClient.wether(openCity.getCityCode()).getData();
- List<WeatherDTO.Lives> lives = data.getLives();
- if (lives != null && !lives.isEmpty()) {
- String w = lives.get(0).getWeather();
- for (Object o : ws) {
- JSONObject ele = JSONObject.parseObject(o.toString());
- if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
- double floatRate = ele.getDouble("ratio");
- priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
- break;
- }
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ // 天气预报动态调价
+ JSONArray ws = jsonObject.getJSONArray("weatherRules");
+ if (null != ws) {
+ XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
+ WeatherDTO data = xpMapClient.wether(openCity.getCityCode()).getData();
+ List<WeatherDTO.Lives> lives = data.getLives();
+ if (lives != null && !lives.isEmpty()) {
+ String w = lives.get(0).getWeather();
+ for (Object o : ws) {
+ JSONObject ele = JSONObject.parseObject(o.toString());
+ if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+ double floatRate = ele.getDouble("ratio");
+ priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
+ break;
}
}
}
}
}
+ priceRate = new BigDecimal(priceRate).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+ log.info("浮动费率 {}", priceRate);
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
- double amount = 0;
double realDistance = distance / 1000;//实际公里
double realTime = duration / 60;//实际时间
@@ -165,12 +164,9 @@
// 超出时间价格
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();
-
- xpPricingCardVo.setStartPrice(startPrice);
- xpPricingCardVo.setDistancePrice(distancePrice);
- xpPricingCardVo.setDurationPrice(durationPrice);
+ xpPricingCardVo.setStartPrice(new BigDecimal(startPrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
+ xpPricingCardVo.setDurationPrice(new BigDecimal(durationPrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
xpPricingCardVo.setTotalPrice(new BigDecimal(startPrice + distancePrice + durationPrice).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 里程
xpPricingCardVo.setDistance(realDistance*1000);
@@ -194,7 +190,7 @@
public XpPricingCardVo calculationPrice(String uid,JSONObject rule, JSONArray startingFareJson, double distance, long duration,
long wait, Double waitMoney,Integer isDynamicPriceStatus,Long openCityId,String dynamicPricingJson) {
// 默认费率1
- double priceRate=1;
+ double priceRate=100;
if(isDynamicPriceStatus==1){
// 先判断是否已经调价过了(供需调价)
Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid);
@@ -202,66 +198,61 @@
// 是否调价过了
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
}else {
- //是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
- if(dynamicPriceObj!=null){
- JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
- // 触发动态调价
- // value=时间
- String timeStr = dynamicPriceObj.toString();
- // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
- R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
- if(r.getCode()==200){
- int num = r.getData();
- // X单上升一次调价
- Integer orderNum = getOrderNum(jsonObject, 4);
- // 需要调价的次数
- int count = num / orderNum;
- if(count>0){
- // 计算每次上升的费率
- Integer upRate = getOrderNum(jsonObject, 5);
- BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
- for (int i = count; i > 0; i--) {
- // 当前费率+(费率*上升百分比)
- priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- }
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ Integer num1 = jsonObject.getInteger("num1");
+ String timeStr = LocalDateTime.now().minusMinutes(num1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // 触发动态调价
+ // value=时间
+ // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+ R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
+ if(r.getCode()==200){
+ int num = r.getData();
+ // X单上升一次调价
+ Integer orderNum = getOrderNum(jsonObject, 4);
+ // 需要调价的次数
+ int count = num / orderNum;
+ if(count>0){
+ // 计算每次上升的费率
+ Integer upRate = getOrderNum(jsonObject, 5);
+ BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+ for (int i = count; i > 0; i--) {
+ // 当前费率+(费率*上升百分比)
+ priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
}
- if(priceRate > 1){
- // 冷却时间
- Integer time = getOrderNum(jsonObject, 6);
- // 触发调价了
- redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
- }
+ }
+ if(priceRate > 1){
+ // 冷却时间
+ Integer time = getOrderNum(jsonObject, 6);
+ // 触发调价了
+ redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
}
}
+ log.info("供需后的费率 {}", priceRate);
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
- if(dynamicPriceObj!=null) {
- JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
- // 天气预报动态调价
- JSONArray ws = jsonObject.getJSONArray("weatherRules");
- if (null != ws) {
- XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
- WeatherDTO data = xpMapClient.wether(openCity.getCityCode()).getData();
- List<WeatherDTO.Lives> lives = data.getLives();
- if (lives != null && !lives.isEmpty()) {
- String w = lives.get(0).getWeather();
- for (Object o : ws) {
- JSONObject ele = JSONObject.parseObject(o.toString());
- if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
- double floatRate = ele.getDouble("ratio");
- priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
- break;
- }
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ // 天气预报动态调价
+ JSONArray ws = jsonObject.getJSONArray("weatherRules");
+ if (null != ws) {
+ XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
+ WeatherDTO data = xpMapClient.wether(openCity.getCityCode()).getData();
+ List<WeatherDTO.Lives> lives = data.getLives();
+ if (lives != null && !lives.isEmpty()) {
+ String w = lives.get(0).getWeather();
+ for (Object o : ws) {
+ JSONObject ele = JSONObject.parseObject(o.toString());
+ if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+ double floatRate = ele.getDouble("ratio");
+ priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
+ break;
}
}
}
}
}
-
+ priceRate = new BigDecimal(priceRate).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+ log.info("浮动费率 {}", priceRate);
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
- double amount = 0;
//等待费
Date date = new Date();
// 计算出是在那个时间段内
@@ -339,11 +330,10 @@
longDistanceThree = rule.getDouble("num34") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num29") + new BigDecimal(exceedDistance * rule.getDouble("num30")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * rule.getDouble("num31")).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num29"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num29")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
xpPricingCardVo.setTime("节假日");
@@ -354,13 +344,13 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num30")) + longDistanceOne + longDistanceTwo + longDistanceThree;
distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num31")));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * rule.getDouble("num31")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
} else {
@@ -390,11 +380,9 @@
longDistanceThree = rule.getDouble("num20") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num15") + new BigDecimal(exceedDistance * rule.getDouble("num16")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * rule.getDouble("num17")).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num15"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num15")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
xpPricingCardVo.setTime(rule.getString("num14"));
@@ -404,13 +392,13 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num16")) + longDistanceOne + longDistanceTwo + longDistanceThree;
distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num17")));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * rule.getDouble("num17")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
xpPricingCardVo.setDistancePriceNormal(rule.getDouble("num2")*1000);
@@ -465,11 +453,9 @@
longDistanceThree = rule.getDouble("num28") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num23") + new BigDecimal(exceedDistance * rule.getDouble("num24")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * rule.getDouble("num25")).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num23"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num23")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) {
xpPricingCardVo.setTime(rule.getString("num21"));
@@ -487,13 +473,13 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num24")) + longDistanceOne + longDistanceTwo + longDistanceThree;
distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num25")));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * rule.getDouble("num25")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
} else {
@@ -524,11 +510,9 @@
longDistanceThree = rule.getDouble("num13") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num1") + new BigDecimal(exceedDistance * rule.getDouble("num4")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * (null != rule.getDouble("num5") ? rule.getDouble("num5") : 0)).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num1"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num1")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
xpPricingCardVo.setTime(rule.getString("startTime") + " - " + rule.getString("endTime"));
@@ -542,36 +526,23 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num4")) + longDistanceOne + longDistanceTwo + longDistanceThree;
distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * (null != rule.getDouble("num5") ? rule.getDouble("num5") : 0)));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * (null != rule.getDouble("num5") ? rule.getDouble("num5") : 0)).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
}
}
}
// 订单总额
- Double startPrice = xpPricingCardVo.getStartPrice();
- amount=new BigDecimal(amount).setScale(2,RoundingMode.HALF_UP).doubleValue();
- // 先减去起步价重新计算
- amount = amount - startPrice;
-
- // 动态计算费用
- startPrice= new BigDecimal(startPrice).multiply(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- amount = amount+startPrice;
+ double amount = xpPricingCardVo.getStartPrice() + xpPricingCardVo.getDistancePrice() + xpPricingCardVo.getDurationPrice();
xpPricingCardVo.setTotalPrice(new BigDecimal(amount).setScale(2,RoundingMode.HALF_UP).doubleValue());
-
-
-
-
xpPricingCardVo.setDistance(xpPricingCardVo.getDistance()*1000);
xpPricingCardVo.setDuration(xpPricingCardVo.getDuration()*60);
-
-
return xpPricingCardVo;
}
/**
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/holiday/HolidayUtil.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/holiday/HolidayUtil.java
index cb0d6d8..99c754b 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/holiday/HolidayUtil.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/holiday/HolidayUtil.java
@@ -6,6 +6,7 @@
import com.xiaopeng.common.core.utils.HttpUtils;
import com.xiaopeng.common.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.Duration;
@@ -22,6 +23,9 @@
@Autowired
private RedisService redisService;
+ @Value("${holiday.api.url}")
+ private String holidayApiUrl;
+
public boolean isHoliday() {
LocalDate now = LocalDate.now();
@@ -30,7 +34,7 @@
if (redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now) != null && ("1").equals(redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now).toString())) {
return true;
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" + now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtil.get("https://publicapi.xiaoai.me/holiday/day?date=" +now);
JSONObject jsonObject = JSONObject.parseObject(result);
Object data = jsonObject.get("data");
@@ -58,7 +62,7 @@
if (cacheObject!=null) {
return Integer.valueOf(cacheObject.toString());
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=2026-01-04");
JSONObject jsonObject = JSONObject.parseObject(result);
@@ -102,7 +106,7 @@
if (cacheObject!=null) {
return Integer.valueOf(cacheObject.toString());
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=2026-01-04");
JSONObject jsonObject = JSONObject.parseObject(result);
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/map/GDMapGeocodingUtil.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/map/GDMapGeocodingUtil.java
index d1b22eb..1364691 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/map/GDMapGeocodingUtil.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/map/GDMapGeocodingUtil.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.common.core.utils.HttpUtils;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@@ -16,7 +17,11 @@
@Lazy
public class GDMapGeocodingUtil {
- private String key = "66ae577f63898dae3016d599fda57221";
+ @Value("${map.api-key}")
+ private String key;
+
+ @Value("${map.urls.reverse-geocode}")
+ private String reverseGeocodeUrl;
@@ -30,7 +35,7 @@
* @throws Exception
*/
public Map<String, String> geocode(String lon, String lan) {
- String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan;
+ String url = reverseGeocodeUrl + "?key=" + key + "&location=" + lon + "," + lan;
String forObject = HttpUtils.sendGet(url);
JSONObject jsonObject = JSON.parseObject(forObject);
Map<String, String> map = new HashMap<>();
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
index 887a82a..d105420 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
@@ -82,12 +82,12 @@
// 判断是否有正在进行的正常订单
// 查询车辆
XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData();
- if(xpVehicle.getState()==1){
+ if (xpVehicle.getState() == 1) {
return R.fail("车辆正在接单中");
}
String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
- if(vehiclePosition==null || vehiclePosition.getPoint()==null){
+ if (vehiclePosition == null || vehiclePosition.getPoint() == null) {
return R.fail("车辆位置信息不存在");
}
Integer departureStatus = dto.getDepartureStatus();
@@ -103,33 +103,36 @@
vehicleEventDTO.setOrderId("");
vehicleEventDTO.setEventKey("RT_web_vehicle_status_changed");
vehicleEventDTO.setEventTime(System.currentTimeMillis());
- Map<String,Object> attributes = new HashMap<>();
+ Map<String, Object> attributes = new HashMap<>();
attributes.put("vin", vin);
- attributes.put("order_id","");
- attributes.put("timestamp",vehicleEventDTO.getEventTime());
- if(departureStatus == 1){
- attributes.put("main_status","ONLINE");
- // TODO 预留位置 目前无状态
- attributes.put("sub_status","");
- attributes.put("prev_sub_status","");
+ attributes.put("order_id", "");
+ attributes.put("timestamp", vehicleEventDTO.getEventTime());
- }else {
- attributes.put("main_status","OFFLINE");
+ // 1.0埋点新增
+ attributes.put("odometer_km", vehiclePosition.getTotalOdometer());
+
+ if (departureStatus == 1) {
+ attributes.put("main_status", "ONLINE");
// TODO 预留位置 目前无状态
- attributes.put("sub_status","");
- attributes.put("prev_sub_status","");
+ attributes.put("sub_status", "");
+ attributes.put("prev_sub_status", "");
+
+ } else {
+ attributes.put("main_status", "OFFLINE");
+ // TODO 预留位置 目前无状态
+ attributes.put("sub_status", "");
+ attributes.put("prev_sub_status", "");
}
vehicleEventDTO.setAttributes(attributes);
vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
// 发车
- if(dto.getDepartureStatus()==1){
+ if (dto.getDepartureStatus() == 1) {
// 找车辆的任务 生成巡游单子 下发命令
//发车之前,检查所有之前没终止的数据,将其终止
xpCruiseOrderClient.stopAllCruiseOrder(vin);
- R<XpCruiseOrder> newCruiseOrder = xpCruisePlanClient.getNewCruiseOrder(new NewCruiseOrderDto(xpVehicle.getId(), vin, xpVehicle.getFleetId(),vehiclePosition.getPoint()));
- if(newCruiseOrder.getData()!=null){
- //标记订单为返程类型巡游单
+ R<XpCruiseOrder> newCruiseOrder = xpCruisePlanClient.getNewCruiseOrder(new NewCruiseOrderDto(xpVehicle.getId(), vin, xpVehicle.getFleetId(), vehiclePosition.getPoint()));
+ if (newCruiseOrder.getData() != null && 200 == newCruiseOrder.getCode()) {
//方向为正向
XpCruiseOrder cruiseOrder = newCruiseOrder.getData();
cruiseOrder.setOrderType(2);
@@ -137,16 +140,16 @@
//不停车替换新任务
cruiseOrder.setTaskActionType(TaskActionType.kTerminateForNewTask);
R<Long> longR = xpCruiseOrderClient.addCruiseOrder(cruiseOrder);
- if(200 != longR.getCode()){
+ if (200 != longR.getCode()) {
return R.fail(longR.getMsg());
}
}
- }else if(dto.getDepartureStatus()==3){
+ } else if (dto.getDepartureStatus() == 3) {
// 收车 关闭当前巡游单子 生成新的返程单子 找到收车站点
XpCruiseOrder oldCruiseOrder = xpCruiseOrderClient.cancelCruiseOrderByVin(vin).getData();
XpCruiseOrder xpCruiseOrder = new XpCruiseOrder();
- if(vehiclePosition!=null){
+ if (vehiclePosition != null) {
double x = vehiclePosition.getPoint().getX();
double y = vehiclePosition.getPoint().getY();
xpCruiseOrder.setStartLon(x);
@@ -163,7 +166,7 @@
// 找到收车站点
XpCruiseOrder returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder).getData();
- if(returnCruisePoint!=null){
+ if (returnCruisePoint != null) {
//不停车替换新任务
returnCruisePoint.setLastOrderId1("XU" + oldCruiseOrder.getId());
returnCruisePoint.setLastXpuTaskId(oldCruiseOrder.getXpuTaskId());
@@ -202,7 +205,7 @@
if (StringUtils.isNotBlank(vehiclePictures)) {
JSONObject jsonObject = JSONObject.parseObject(vehiclePictures);
// 1
- String downloadUrl = jsonObject.getString("url");;
+ String downloadUrl = jsonObject.getString("url");
try {
downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
} catch (UnsupportedEncodingException e) {
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java
index 4ad2d4a..0cceeba 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java
@@ -229,7 +229,7 @@
// 找到收车站点
R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder);
- if (returnCruisePoint.getData() != null) {
+ if (returnCruisePoint.getData() != null && 200 == returnCruisePoint.getCode()) {
XpCruiseOrder cruiseOrder = returnCruisePoint.getData();
//不停车替换新任务
cruiseOrder.setLastOrderId1("XU" + oldCruiseOrder.getId());
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
index cc701b9..6f18e7d 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
@@ -72,7 +72,7 @@
@Override
public AppXpCruiseCheckInRuleVo getMyXpCruiseCheckInRule(Long uid) {
List<XpCruiseCheckInRule> list = this.list(new LambdaQueryWrapper<XpCruiseCheckInRule>().eq(XpCruiseCheckInRule::getDeleted, 0)
- .apply("find_in_set({0}, operations_user_id)", uid).last(" and (now() BETWEEN start_time and end_time or cyclic_mode = 1)"));
+ .eq(XpCruiseCheckInRule::getOperationsUserId, uid).last(" and (now() BETWEEN start_time and end_time or cyclic_mode = 1)"));
if(list.isEmpty()){
return null;
}
@@ -147,7 +147,7 @@
public Long saveCruiseCheckInRecord(XpCruiseCheckInRecord dto) {
Long checkLocationId = dto.getCheckLocationId();
List<XpCruiseCheckInRule> list = this.list(new LambdaQueryWrapper<XpCruiseCheckInRule>().eq(XpCruiseCheckInRule::getDeleted, 0)
- .apply("find_in_set({0}, operations_user_id)", dto.getOperationsUserId()).last(" and (now() BETWEEN start_time and end_time or cyclic_mode = 1)"));
+ .eq(XpCruiseCheckInRule::getOperationsUserId, dto.getOperationsUserId()).last(" and (now() BETWEEN start_time and end_time or cyclic_mode = 1)"));
if(list.isEmpty()){
return null;
}
@@ -294,10 +294,10 @@
long count = xpCruiseCheckInRuleLocationService.count(new LambdaQueryWrapper<XpCruiseCheckInRuleLocation>()
.eq(XpCruiseCheckInRuleLocation::getCruiseCheckInRuleId, cruiseCheckInRuleListPage.getId()));
cruiseCheckInRuleListPage.setPointNum(count);
- List<XpOperationsUser> xpOperationsUser = xpOperationsUserClient.queryByIds(cruiseCheckInRuleListPage.getOperationsUserId()).getData();
- cruiseCheckInRuleListPage.setUserName(xpOperationsUser.stream().map(XpOperationsUser::getNickName).collect(Collectors.toList()));
- cruiseCheckInRuleListPage.setPhone(xpOperationsUser.stream().map(XpOperationsUser::getPhoneNumber).collect(Collectors.toList()));
- cruiseCheckInRuleListPage.setRoleName(xpOperationsUser.stream().map(XpOperationsUser::getRoleName).collect(Collectors.toList()));
+ XpOperationsUser xpOperationsUser = xpOperationsUserClient.queryById(cruiseCheckInRuleListPage.getOperationsUserId()).getData();
+ cruiseCheckInRuleListPage.setUserName(xpOperationsUser.getNickName());
+ cruiseCheckInRuleListPage.setPhone(xpOperationsUser.getPhoneNumber());
+ cruiseCheckInRuleListPage.setRoleName(xpOperationsUser.getRoleName());
}
return xpCruiseCheckInRuleListPage;
}
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
index 86df48e..5857f88 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -261,20 +261,20 @@
throw new ServiceException("上报失败,未获取到车辆信息", I18nKeyConstant.TASK_VEHICLE_NOT_EXIST);
}
String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin());
- VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
- if (Objects.isNull(vehiclePosition)) {
- log.error("事故上报未获取到车辆当前定位");
- throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
- }
- xpTask.setVehicleLon(new BigDecimal(vehiclePosition.getPoint().getX()));
- xpTask.setVehicleLat(new BigDecimal(vehiclePosition.getPoint().getY()));
- Map<String, String> geocode = gdMapGeocodingUtil.geocode(xpTask.getVehicleLon().toString(), xpTask.getVehicleLat().toString());
- String address = geocode == null ? null : geocode.get("address");
- if (StringUtils.isBlank(address)) {
- log.error("事故上报通过车辆定位从高德获取地址信息失败");
- throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
- }
- xpTask.setVehicleLocation(address);
+ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+ if (Objects.isNull(vehiclePosition)) {
+ log.error("事故上报未获取到车辆当前定位");
+ throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
+ }
+ xpTask.setVehicleLon(new BigDecimal(vehiclePosition.getPoint().getX()));
+ xpTask.setVehicleLat(new BigDecimal(vehiclePosition.getPoint().getY()));
+ Map<String, String> geocode = gdMapGeocodingUtil.geocode(xpTask.getVehicleLon().toString(), xpTask.getVehicleLat().toString());
+ String address = geocode == null ? null : geocode.get("address");
+ if (StringUtils.isBlank(address)) {
+ log.error("事故上报通过车辆定位从高德获取地址信息失败");
+ throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
+ }
+ xpTask.setVehicleLocation(address);
// 临时处理
// xpTask.setVehicleLon(new BigDecimal("104.055683"));
// xpTask.setVehicleLat(new BigDecimal("30.585991"));
@@ -298,7 +298,7 @@
List<Long> userIds = xpOperationsRoleResult.getData().stream().filter(x -> ids.contains(x.getOperationsUserId()))
.map(XpOperationsRole::getOperationsUserId)
.distinct().collect(Collectors.toList());
- if(CollUtil.isEmpty(userIds)){
+ if (CollUtil.isEmpty(userIds)) {
throw new ServiceException("未配置车队运维人员");
}
//获取首选人的实时定位,计算每个人到事故车辆位置的导航距离
@@ -306,33 +306,39 @@
for (Long userId : userIds) {
Operations operations = new Operations();
operations.setUserId(userId);
+ //获取运维人员实时定位
XpOperationsUserPositionDTO operationsUserPositionDTO = mongoTemplate.findOne(new Query(Criteria.where("id").is(userId)), XpOperationsUserPositionDTO.class);
- if(null != operationsUserPositionDTO){
+ if (null != operationsUserPositionDTO) {
LonLatDto start = new LonLatDto(operationsUserPositionDTO.getLongitude(), operationsUserPositionDTO.getLatitude());
LonLatDto end = new LonLatDto(xpTask.getVehicleLon().doubleValue(), xpTask.getVehicleLat().doubleValue());
+ //获取导航线路
RouteVo routeVo = gdMapGeocodingUtil.getDistanceAndTime(start, end, null, null, null, null);
operations.setDistance(routeVo.getDistance());
+ operationsList.add(operations);
}
- operationsList.add(operations);
}
+ if(operationsList.isEmpty()){
+ throw new ServiceException("未找到合适的运维人员");
+ }
+
//对距离进行排序,去距离最近的人员
operationsList.sort((o1, o2) -> o1.getDistance().compareTo(o2.getDistance()) * -1);
Operations operations = operationsList.get(0);
Long userId = operations.getUserId();
//如果多人距离相同,可按照上班状态>空闲状态>工号排序
List<Operations> collect = operationsList.stream().filter(s -> s.getDistance().equals(operations.getDistance())).collect(Collectors.toList());
- if(collect.size() > 1){
+ if (collect.size() > 1) {
//查询已经上班打卡了的人员
List<XpClockIn> xpClockIns = xpClockInService.list(new QueryWrapper<XpClockIn>().in("app_user_id", collect)
- .isNull("clock_out_result").last(" and DATE(now()) = DATE(clock_in_time)"));
- if(xpClockIns.size() == 1){
+ .isNull("clock_out_result").last(" and DATE(now()) = DATE(clock_in_time) and clock_out_time is null"));
+ if (xpClockIns.size() == 1) {
userId = xpClockIns.get(0).getAppUserId();
- }else if(xpClockIns.size() > 1){
+ } else if (xpClockIns.size() > 1) {
//查询有任务的人员
List<Long> collect1 = xpClockIns.stream().map(XpClockIn::getAppUserId).collect(Collectors.toList());
List<XpTask> list1 = this.list(new QueryWrapper<XpTask>().eq("task_category", 2).in("handle_user_id", collect1)
.in("status", Arrays.asList(0, 1, 4)));
- if(list1.size() > 0){
+ if (list1.size() > 0) {
//对工号进行排序
List<String> collect2 = list1.stream().map(XpTask::getHandleUserId).collect(Collectors.toList());
//找出没有任务的人员
@@ -354,7 +360,7 @@
xpTask.setExpiredNoticeSent(0);
xpTask.setWillTimeoutNoticeSent(0);
this.save(xpTask);
- if (xpTask.getId() == null && StringUtils.isNotBlank(xpTask.getTaskCode())) {
+ if (xpTask.getId() == null && StringUtils.isNotEmpty(xpTask.getTaskCode())) {
XpTask savedTask = this.getOne(new LambdaQueryWrapper<XpTask>()
.eq(XpTask::getTaskCode, xpTask.getTaskCode())
.last("limit 1"));
@@ -467,11 +473,11 @@
}
-
/**
* 异步发送事故通知
- * @param xpTask 任务信息
- * @param plateNumber 车牌号
+ *
+ * @param xpTask 任务信息
+ * @param plateNumber 车牌号
* @param processingTimeLimit 处理时限(分钟)
*/
private void sendAccidentNotificationAsync(XpTask xpTask, String plateNumber, Integer processingTimeLimit) {
@@ -507,9 +513,9 @@
/**
* 异步发送事故任务分配通知
*
- * @param xpTask 任务信息
- * @param handlerUserId 当前分配的处理人
- * @param plateNumber 车牌号
+ * @param xpTask 任务信息
+ * @param handlerUserId 当前分配的处理人
+ * @param plateNumber 车牌号
* @param processingTimeLimit 处理时限(分钟)
*/
private void sendAssignedAccidentNotificationAsync(XpTask xpTask, Long handlerUserId, String plateNumber, Integer processingTimeLimit) {
@@ -539,8 +545,8 @@
/**
* 构建事故通知文案
*
- * @param xpTask 任务信息
- * @param plateNumber 车牌号
+ * @param xpTask 任务信息
+ * @param plateNumber 车牌号
* @param processingTimeLimit 处理时限(分钟)
* @return 通知内容
*/
@@ -550,8 +556,9 @@
/**
* 构建事故推送 body JSON
+ *
* @param content 消息内容
- * @param xpTask 任务信息
+ * @param xpTask 任务信息
* @return JSON 字符串
*/
private String buildAccidentPushBodyJson(String content, XpTask xpTask) {
@@ -566,9 +573,9 @@
/**
* 保存事故通知记录并发送阿里云推送
*
- * @param data 接收通知的运维人员
+ * @param data 接收通知的运维人员
* @param content 通知内容
- * @param xpTask 任务信息
+ * @param xpTask 任务信息
*/
private void saveAndPushAccidentNotification(List<XpOperationsUser> data, String content, XpTask xpTask) {
String bodyJson = buildAccidentPushBodyJson(content, xpTask);
@@ -1644,7 +1651,7 @@
XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
int type = 9;
- if(task.getTaskCategory() != 2) {
+ if (task.getTaskCategory() != 2) {
type = Integer.parseInt(task.getTaskTypeId());
}
@@ -1655,7 +1662,7 @@
}
List<XpTask.Reject> rejects = Optional.ofNullable(task.getExcluded()).orElse(new ArrayList<>());
- if(msg != null && Strings.isNotBlank(task.getHandleUserId())) {
+ if (msg != null && Strings.isNotBlank(task.getHandleUserId())) {
XpTask.Reject reject = task.reject(msg);
rejects.add(reject);
List<Long> id = Collections.singletonList(Long.parseLong(task.getHandleUserId()));
@@ -1682,13 +1689,13 @@
// vehiclePosition.setPoint(new GeoJsonPoint(103.12615621, 30.264561));
String handlerUser = chooseNearestAvailableOperationsUser(belongUserIds, vehiclePosition);
task.setHandleUserId(handlerUser);
- if(handlerUser == null) {
+ if (handlerUser == null) {
task.setStatus(4);
task.setReassignmentStatus(1);
noticeAdministrator(task);//TODO 需要通知管理员手动处理,考虑再AliPushUtil 中给管理员发送消息
}
updateById(task);
- if(StringUtils.isNotBlank(task.getHandleUserId())){
+ if (StringUtils.isNotBlank(task.getHandleUserId())) {
sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
}
}
@@ -1729,7 +1736,7 @@
task.setVehicleLon(new BigDecimal(vehiclePosition.getPoint().getX()));
String handlerUser = chooseNearestAvailableOperationsUser(belongUserIds, vehiclePosition);
task.setHandleUserId(handlerUser);
- if(handlerUser == null) {
+ if (handlerUser == null) {
task.setStatus(4);
task.setReassignmentStatus(1);
noticeAdministrator(task);
@@ -1745,7 +1752,7 @@
task.setCreateTime(LocalDateTime.now());
this.save(task);
// 异步发送消息通知
- sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
+ sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
}
@Override
@@ -1755,7 +1762,7 @@
XpTask task = getById(Long.valueOf(taskId));
XpVehicle vehicle = xpVehicleClient.queryById(task.getVehicleId()).getData();
updateTaskStatus(task.getId(), TaskScheduleConstants.TASK_STATUS_PENDING_ARRIVE, Long.valueOf(task.getHandleUserId()));
- sendAccidentNotificationAsync(getById(task.getId()), vehicle.getPlateNumber(), (int) Duration.between(LocalDateTime.now(),task.getEndTime()).toMinutes());
+ sendAccidentNotificationAsync(getById(task.getId()), vehicle.getPlateNumber(), (int) Duration.between(LocalDateTime.now(), task.getEndTime()).toMinutes());
}
@Override
@@ -1855,7 +1862,6 @@
}
-
@Override
public R assigneeTask(Long id, Long handlerUserId, Long assigneeUserId) {
XpTask task = this.getById(id);
@@ -1933,7 +1939,7 @@
for (XpTask task : saveTask) {
- reassign(task.getId(),null);
+ reassign(task.getId(), null);
}
}
@@ -2411,15 +2417,16 @@
/**
* 任务改派操作
+ *
* @param vo
*/
@Override
public void taskReassignment(TaskReassignmentVo vo) {
XpTask xpTask = this.getById(vo.getTaskId());
- if(null == xpTask){
+ if (null == xpTask) {
throw new ServiceException("无效的任务", I18nKeyConstant.TASK_NOT_EXIST);
}
- if(2 == xpTask.getReassignmentStatus()){
+ if (2 == xpTask.getReassignmentStatus()) {
throw new ServiceException("任务已改派,不能重复操作", I18nKeyConstant.TASK_HAS_BEEN_REASSIGNED);
}
xpTask.setReassignmentStatus(2);
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleListPage.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleListPage.java
index 7527b45..8c7cdb7 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleListPage.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRuleListPage.java
@@ -4,8 +4,6 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import java.util.List;
-
@Data
@ApiModel
public class XpCruiseCheckInRuleListPage {
@@ -16,11 +14,11 @@
@ApiModelProperty("关联点位数量")
private Long pointNum;
@ApiModelProperty("执行人员")
- private List<String> userName;
+ private String userName;
@ApiModelProperty("手机号")
- private List<String> phone;
+ private String phone;
@ApiModelProperty("人员角色")
- private List<String> roleName;
+ private String roleName;
- private String operationsUserId;
+ private Long operationsUserId;
}
diff --git a/xp-robotaxi-maintenance-boot/src/main/resources/application-local.yml b/xp-robotaxi-maintenance-boot/src/main/resources/application-local.yml
index 8007e19..b465e46 100644
--- a/xp-robotaxi-maintenance-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-maintenance-boot/src/main/resources/application-local.yml
@@ -13,12 +13,16 @@
aliOssUrlPublic: https://oss-cn-hangzhou.aliyuncs.com
fileWaterMarkUrl:
- spring:
+spring:
config:
activate:
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
diff --git a/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpVehicleModelMapper.xml b/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpVehicleModelMapper.xml
index ff38d48..1fa9b67 100644
--- a/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpVehicleModelMapper.xml
+++ b/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpVehicleModelMapper.xml
@@ -6,6 +6,9 @@
select id,
name,
seat,
+ vehicle_length,
+ vehicle_width,
+ vehicle_height,
is_deleted,
create_time,
update_time,
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiConfigHolder.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiConfigHolder.java
new file mode 100644
index 0000000..3ce65a2
--- /dev/null
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiConfigHolder.java
@@ -0,0 +1,17 @@
+package com.xiaopeng.map.config;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class MapApiConfigHolder {
+
+ private static MapApiProperties properties;
+
+ public MapApiConfigHolder(MapApiProperties properties) {
+ MapApiConfigHolder.properties = properties;
+ }
+
+ public static MapApiProperties getProperties() {
+ return properties;
+ }
+}
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiProperties.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiProperties.java
new file mode 100644
index 0000000..2fe8542
--- /dev/null
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MapApiProperties.java
@@ -0,0 +1,33 @@
+package com.xiaopeng.map.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "map")
+public class MapApiProperties {
+
+ private String apiKey;
+
+ private Urls urls = new Urls();
+
+ @Data
+ public static class Urls {
+
+ private String weather;
+
+ private String routePrice;
+
+ private String routeQuery;
+
+ private String reverseGeocode;
+
+ private String geocode;
+
+ private String walking;
+
+ private String ip;
+ }
+}
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
index dee2018..409dcef 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
@@ -13,6 +13,7 @@
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.redis.service.RedisService;
+import com.xiaopeng.map.config.MapApiProperties;
import com.xiaopeng.map.mangodb.model.GeoPoint;
import com.xiaopeng.map.mangodb.service.XpGeoFencingPolygonService;
import com.xiaopeng.map.service.XpElectronicFenceAreaService;
@@ -30,7 +31,6 @@
import org.apache.http.util.EntityUtils;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPolygon;
@@ -272,21 +272,18 @@
- @Value("${map.urls.weather:https://restapi.amap.com/v3/weather/weatherInfo?key=%s&city=%s}")
- String WEATHER_URL;
-
@Autowired
ObjectMapper om;
- @Value("${map.apikey:66ae577f63898dae3016d599fda57221}")
- String key;
+ @Autowired
+ private MapApiProperties mapApiProperties;
@ApiOperation(value = "获取天气信息", tags = {"内部-调价"})
@PostMapping("/logan/inner/weatherInfo")
public R<WeatherDTO> wether(@RequestParam("cityCode") String cityCode) {
try{
CloseableHttpClient httpClient = HttpClients.createDefault();
- HttpGet httpGet = new HttpGet(String.format(WEATHER_URL, key, cityCode));
+ HttpGet httpGet = new HttpGet(String.format(mapApiProperties.getUrls().getWeather(), mapApiProperties.getApiKey(), cityCode));
CloseableHttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/AmapWalkingRouteUtil.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/AmapWalkingRouteUtil.java
index c6b3e71..78f49e3 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/AmapWalkingRouteUtil.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/AmapWalkingRouteUtil.java
@@ -8,12 +8,13 @@
import com.xiaopeng.api.vo.map.PointByIpVo;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.HttpUtils;
+import com.xiaopeng.map.config.MapApiConfigHolder;
+import com.xiaopeng.map.config.MapApiProperties;
import com.xiaopeng.map.constant.I18nKeyConstant;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
-import org.springframework.beans.factory.annotation.Value;
import java.io.IOException;
import java.util.HashMap;
@@ -26,29 +27,20 @@
@Slf4j
public class AmapWalkingRouteUtil {
- // 高德地图Web服务API配置
- private static final String AMAP_API_BASE_URL = "https://restapi.amap.com/v3/direction/walking";
- private static final String AMAP_GEOCODING_URL = "https://restapi.amap.com/v3/geocode/geo";
- // 高德API基础URL
- private static final String IP_API_URL = "https://restapi.amap.com/v3/ip";
- private static final String GEOCODE_API_URL = "https://restapi.amap.com/v3/geocode/geo";
-
-
// HTTP客户端
private final OkHttpClient httpClient;
private final ObjectMapper objectMapper;
- // @Value("${map.apikey}")
- private static String apiKey="66ae577f63898dae3016d599fda57221";
+ private static String apiKey;
/**
* IP定位
*/
public static PointByIpVo ipLocation(String ip) throws IOException {
PointByIpVo pointByIpVo = new PointByIpVo();
- StringBuilder urlBuilder = new StringBuilder(IP_API_URL)
- .append("?key=").append(apiKey)
+ StringBuilder urlBuilder = new StringBuilder(getMapProperties().getUrls().getIp())
+ .append("?key=").append(getApiKey())
.append("&output=json");
if (ip != null && !ip.trim().isEmpty()) {
@@ -99,7 +91,7 @@
}
private static LonLatDto geocodeCity(String cityName) throws IOException {
- String url = GEOCODE_API_URL + "?key=" +apiKey + "&address=" + cityName + "&output=json&city=" + cityName;
+ String url = getMapProperties().getUrls().getGeocode() + "?key=" + getApiKey() + "&address=" + cityName + "&output=json&city=" + cityName;
String response = HttpUtils.sendGet(url);
System.out.println(response);
JSONObject jsonObject = JSONObject.parseObject(response);
@@ -120,18 +112,12 @@
return new LonLatDto(longitude, latitude);
}
- public static void main (String[]args) throws IOException {
- geocodeCity("凉山彝族自治州");
-
- }
-
-
/**
* 构造函数
* @param apiKey 高德地图API Key
*/
public AmapWalkingRouteUtil(String apiKey) {
- this.apiKey = apiKey;
+ AmapWalkingRouteUtil.apiKey = apiKey;
this.httpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
@@ -259,10 +245,10 @@
*/
public Location getLocationByAddress (String address) throws IOException {
Map<String, String> params = new HashMap<>();
- params.put("key", apiKey);
+ params.put("key", getApiKey());
params.put("address", address);
- String url = buildUrl(AMAP_GEOCODING_URL, params);
+ String url = buildUrl(getMapProperties().getUrls().getGeocode(), params);
Request request = new Request.Builder().url(url).build();
try (Response response = httpClient.newCall(request).execute()) {
@@ -299,11 +285,11 @@
try {
Map<String, String> params = new HashMap<>();
- params.put("key", apiKey);
+ params.put("key", getApiKey());
params.put("origin", origin.toString());
params.put("destination", destination.toString());
- String url = buildUrl(AMAP_API_BASE_URL, params);
+ String url = buildUrl(getMapProperties().getUrls().getWalking(), params);
Request request = new Request.Builder().url(url).build();
try (Response response = httpClient.newCall(request).execute()) {
@@ -368,10 +354,10 @@
private String getAddressByLocation (Location location){
try {
Map<String, String> params = new HashMap<>();
- params.put("key", apiKey);
+ params.put("key", getApiKey());
params.put("location", location.toString());
- String url = buildUrl("https://restapi.amap.com/v3/geocode/regeo", params);
+ String url = buildUrl(getMapProperties().getUrls().getReverseGeocode(), params);
Request request = new Request.Builder().url(url).build();
try (Response response = httpClient.newCall(request).execute()) {
@@ -430,5 +416,16 @@
return earthRadius * c;
}
+ private static MapApiProperties getMapProperties() {
+ return MapApiConfigHolder.getProperties();
+ }
- }
\ No newline at end of file
+ private static String getApiKey() {
+ if (apiKey != null) {
+ return apiKey;
+ }
+ return getMapProperties().getApiKey();
+ }
+
+
+ }
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
index 89118b7..e2a1925 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
@@ -7,10 +7,10 @@
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.common.core.utils.HttpUtils;
+import com.xiaopeng.map.config.MapApiProperties;
import com.xiaopeng.map.mangodb.service.XpGeoFencingPolygonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@@ -29,11 +29,12 @@
@Lazy
public class GDMapGeocodingUtil {
- private String key = "66ae577f63898dae3016d599fda57221";
-
@Autowired
private XpGeoFencingPolygonService xpGeoFencingPolygonService;
+
+ @Autowired
+ private MapApiProperties mapApiProperties;
/**
@@ -50,7 +51,7 @@
public RouteVo getDistanceAndTime(LonLatDto start, LonLatDto end,ArrayList<JSONObject> avoidRoads,String fenceId,Integer routePlanRule, List<HistoryPointDto> history) {
RouteVo routeVo = new RouteVo();
- String url = "https://tsapi.amap.com/v1/route/price?key=" + key + "&extensions=all&start=" + start.getLongitude() + "," + start.getLatitude();
+ String url = mapApiProperties.getUrls().getRoutePrice() + "?key=" + mapApiProperties.getApiKey() + "&extensions=all&start=" + start.getLongitude() + "," + start.getLatitude();
HashMap<String, Object> params = new HashMap<>();
params.put("extensions", "all");
params.put("start", start.getLongitude() + "," + start.getLatitude());
@@ -166,7 +167,7 @@
* @throws Exception
*/
public List<RouteVo> getDistanceAndTimeList(LonLatDto start, LonLatDto end,ArrayList<JSONObject> avoidRoads,String fenceId,Integer routePlanRule, List<HistoryPointDto> history) {
- String url = "https://tsapi.amap.com/v1/route/price?key=" + key + "&extensions=all&start=" + start.getLongitude() + "," + start.getLatitude();
+ String url = mapApiProperties.getUrls().getRoutePrice() + "?key=" + mapApiProperties.getApiKey() + "&extensions=all&start=" + start.getLongitude() + "," + start.getLatitude();
HashMap<String, Object> params = new HashMap<>();
params.put("extensions", "all");
params.put("start", start.getLongitude() + "," + start.getLatitude());
@@ -232,22 +233,6 @@
}
- public static void main(String[] args) {
- String url = "https://tsapi.amap.com/v1/route/price?key=" + "66ae577f63898dae3016d599fda57221" + "&extensions=all&start=" + "113.384932" + "," + "23.155455";
- HashMap<String, Object> params = new HashMap<>();
- params.put("extensions", "all");
- params.put("start", "113.384932" + "," + "23.155455");
- params.put("end", "113.388209" + "," + "23.163455");
- params.put("routeUserType", 2);
- log.info("高德地图接口:{}", url);
- log.info("高德地图参数:{}", params);
- String post = HttpUtils.post(url, JSON.toJSONString(params));
- log.info("高德地图返回结果:" + post);
- JSONObject jsonObject = JSON.parseObject(post);
- System.out.println(jsonObject);
- }
-
-
class ArrayPointsTask extends RecursiveTask<Long> {
//最大定位集合阈值
private final int THRESHOLD = 10;
@@ -293,7 +278,7 @@
* @return
*/
public String routed(String routeID) {
- String url = "https://tsapi.amap.com/v1/route/query/routeid?key=" + key;
+ String url = mapApiProperties.getUrls().getRouteQuery() + "?key=" + mapApiProperties.getApiKey();
HashMap<String, Object> params = new HashMap<>();
params.put("routeID", routeID);
params.put("sdkVersion", "9.850.152.3.532");
@@ -314,7 +299,7 @@
* @throws Exception
*/
public Map<String, String> geocode(String lon, String lan) {
- String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan;
+ String url = mapApiProperties.getUrls().getReverseGeocode() + "?key=" + mapApiProperties.getApiKey() + "&location=" + lon + "," + lan;
String forObject = HttpUtils.sendGet(url);
JSONObject jsonObject = JSON.parseObject(forObject);
Map<String, String> map = new HashMap<>();
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GaodeMapService.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GaodeMapService.java
index 2fd921e..ff54db8 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GaodeMapService.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GaodeMapService.java
@@ -2,26 +2,29 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.xiaopeng.map.config.MapApiConfigHolder;
+import com.xiaopeng.map.config.MapApiProperties;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
-import org.springframework.beans.factory.annotation.Value;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class GaodeMapService {
-
- // 高德地图API基础URL
- private static final String WALKING_API_URL = "https://restapi.amap.com/v3/direction/walking";
-
- // 你的高德地图API Key
-// @Value("${map.apikey}")
- private String apiKey="66ae577f63898dae3016d599fda57221";
-
+
+ private final String walkingApiUrl;
+
+ private final String apiKey;
+
+ public GaodeMapService() {
+ MapApiProperties properties = MapApiConfigHolder.getProperties();
+ this.walkingApiUrl = properties.getUrls().getWalking();
+ this.apiKey = properties.getApiKey();
+ }
/**
* 获取步行路径规划
@@ -55,7 +58,7 @@
*/
private String buildWalkingUrl(String origin, String destination) {
return String.format("%s?origin=%s&destination=%s&key=%s",
- WALKING_API_URL,
+ walkingApiUrl,
origin,
destination,
apiKey);
@@ -112,4 +115,4 @@
return result;
}
-}
\ No newline at end of file
+}
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/holiday/HolidayUtil.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/holiday/HolidayUtil.java
index f7ce483..29164f0 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/holiday/HolidayUtil.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/holiday/HolidayUtil.java
@@ -8,6 +8,7 @@
import com.xiaopeng.common.core.utils.HttpUtils;
import com.xiaopeng.common.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.Duration;
@@ -24,6 +25,9 @@
@Autowired
private RedisService redisService;
+ @Value("${holiday.api.url}")
+ private String holidayApiUrl;
+
public boolean isHoliday() {
LocalDate now = LocalDate.now();
@@ -32,7 +36,7 @@
if (redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now) != null && ("1").equals(redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now).toString())) {
return true;
}
- String result = HttpUtil.get("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtil.get(holidayApiUrl + now);
JSONObject jsonObject = JSONObject.parseObject(result);
Object data = jsonObject.get("data");
JSONArray parse = JSONArray.parse(data.toString());
@@ -58,7 +62,7 @@
if (cacheObject!=null) {
return Integer.valueOf(cacheObject.toString());
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=2026-01-04");
JSONObject jsonObject = JSONObject.parseObject(result);
diff --git a/xp-robotaxi-map-boot/src/main/resources/application-local.yml b/xp-robotaxi-map-boot/src/main/resources/application-local.yml
index eba45eb..a955f06 100644
--- a/xp-robotaxi-map-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-map-boot/src/main/resources/application-local.yml
@@ -2,14 +2,17 @@
config:
activate:
on-profile: local
+ autoconfigure:
+ exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
password: syAktm2x9uDusoF_
port: 6379
- autoconfigure:
- exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
-
shardingsphere:
props:
sql-show: true
@@ -124,3 +127,18 @@
vin:
salt1: ${VIN_SALT1:}
salt2: ${VIN_SALT2:}
+
+map:
+ api-key: 66ae577f63898dae3016d599fda57221
+ urls:
+ weather: https://restapi.amap.com/v3/weather/weatherInfo?key=%s&city=%s
+ route-price: https://tsapi.amap.com/v1/route/price
+ route-query: https://tsapi.amap.com/v1/route/query/routeid
+ reverse-geocode: https://restapi.amap.com/v3/geocode/regeo
+ geocode: https://restapi.amap.com/v3/geocode/geo
+ walking: https://restapi.amap.com/v3/direction/walking
+ ip: https://restapi.amap.com/v3/ip
+
+holiday:
+ api:
+ url: https://publicapi.xiaoai.me/holiday/day?date=
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java
index c2e7fa4..e5b77ee 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java
@@ -3,6 +3,7 @@
import cn.hutool.core.lang.UUID;
import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.evi.oss.service.AliOssService;
import com.xiaopeng.operation.vo.FileUploadVO;
import io.swagger.annotations.Api;
@@ -13,6 +14,9 @@
import javax.annotation.Resource;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
/**
* <p>
@@ -30,12 +34,37 @@
@Resource
private AliOssService aliOssService;
+ private static final Set<String> ALLOWED_IMAGE_TYPES = new HashSet<>(Arrays.asList(
+ ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg"
+ ));
+
+ /**
+ * 校验文件名安全性和图片类型
+ */
+ private void validateFileName(String fileName) throws IOException {
+ if (fileName == null || fileName.trim().isEmpty()) {
+ throw new IOException("文件名不能为空");
+ }
+ if (fileName.contains("../") || fileName.contains("..\\")) {
+ throw new IOException("文件名包含非法字符");
+ }
+ String fileExtension = "";
+ int lastDotIndex = fileName.lastIndexOf(".");
+ if (lastDotIndex > 0) {
+ fileExtension = fileName.substring(lastDotIndex).toLowerCase();
+ }
+ if (!ALLOWED_IMAGE_TYPES.contains(fileExtension)) {
+ throw new ServiceException("只允许上传图片文件,支持的类型:jpg, jpeg, png, gif, bmp, webp, svg");
+ }
+ }
+
@PostMapping(value = "/base/v1/oss/upload",headers = "content-type=multipart/form-data")
@ApiOperation(value = "文件上传",tags = "文件上传")
public R<FileUploadVO> uploadOSS(@RequestParam("file") MultipartFile file) {
try {
// 上传并返回访问地址
String fileName = file.getOriginalFilename();
+ validateFileName(fileName);
String prefix = fileName.substring(fileName.lastIndexOf("."));
long fileSize = file.getSize();
String fileId = UUID.randomUUID().toString();
@@ -67,6 +96,7 @@
try {
// 上传并返回访问地址
String fileName = file.getOriginalFilename();
+ validateFileName(fileName);
String prefix = fileName.substring(fileName.lastIndexOf("."));
long fileSize = file.getSize();
String fileId = UUID.randomUUID().toString();
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
index 8797bce..d9da3f7 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
@@ -3,27 +3,28 @@
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.operation.CruisePointDto;
+import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.operation.NewCruiseOrderDto;
+import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
-import com.xiaopeng.api.model.operation.XpCruisePlan;
-import com.xiaopeng.api.model.operation.XpCruisePlanPoint;
-import com.xiaopeng.api.model.operation.XpCruisePlanVehicle;
-import com.xiaopeng.api.model.operation.XpPoint;
+import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.model.order.XpCruiseOrder;
+import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
+import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.operation.dto.XpCruisePlanAddDTO;
import com.xiaopeng.operation.dto.XpCruisePlanEditDTO;
import com.xiaopeng.operation.query.CruisePlanQuery;
-import com.xiaopeng.operation.service.IXpCruisePlanPointService;
-import com.xiaopeng.operation.service.IXpCruisePlanService;
-import com.xiaopeng.operation.service.IXpCruisePlanVehicleService;
-import com.xiaopeng.operation.service.XpPointService;
+import com.xiaopeng.operation.service.*;
import com.xiaopeng.operation.vo.XpCruisePlanDetailVO;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -47,6 +48,7 @@
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
@@ -69,6 +71,18 @@
private final IXpCruisePlanPointService xpCruisePlanPointService;
private final XpPointService pointService;
private final XpVehicleClient xpVehicleClient;
+
+ @Resource
+ private XpTargetedServiceVehicleService xpTargetedServiceVehicleService;
+
+ @Resource
+ private XpTargetedServiceService xpTargetedServiceService;
+
+ @Resource
+ private XpMapClient xpMapClient;
+
+ @Resource
+ private RedisService redisService;
@Resource(name = "hutoolSnowflake")
private Snowflake snowflake;
@@ -133,11 +147,25 @@
public R<XpCruiseOrder> getCruisePoint(@RequestBody CruisePointDto dto) {
// 先找计划
XpCruisePlanVehicle plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>().eq(XpCruisePlanVehicle::getVehicleId, dto.getVehicleId()));
+ Long cruisePlanId = null;
if (plan == null) {
- return R.fail("没有找到对应的计划");
+ //没有巡游计划,判断是否在定向服务里面
+ List<XpTargetedService> targetedServices = xpTargetedServiceService.list(new QueryWrapper<XpTargetedService>().eq("status", 1));
+ if(targetedServices.isEmpty()){
+ return R.fail("没有巡游计划");
+ }
+ List<Long> collect1 = targetedServices.stream().map(XpTargetedService::getId).collect(Collectors.toList());
+ List<XpTargetedServiceVehicle> list = xpTargetedServiceVehicleService.list(new QueryWrapper<XpTargetedServiceVehicle>().in("targeted_service_id", collect1)
+ .eq("vehicle_id", dto.getVehicleId()));
+ if(list.isEmpty()){
+ return R.fail("没有巡游计划");
+ }
+ cruisePlanId = list.get(0).getCruisePlanId();
+ }else{
+ cruisePlanId = plan.getCruisePlanId();
}
// 找对应的多个点位
- List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>().eq(XpCruisePlanPoint::getCruisePlanId, plan.getCruisePlanId()).orderByAsc(XpCruisePlanPoint::getSortOrder));
+ List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>().eq(XpCruisePlanPoint::getCruisePlanId, cruisePlanId).orderByAsc(XpCruisePlanPoint::getSortOrder));
// 找到现在这个点位
// 根据dto的pointId 是第几个
int index = 0;
@@ -179,7 +207,62 @@
newXpCruiseOrder.setEndLat(point.getPointLat());
newXpCruiseOrder.setMissionId(xpCruisePlanPoint.getCruisePlanId());
-
+ //获取巡游导航数据,如果无法获取到有效的导航,则继续用下一个点位作为终点
+ LonLatDto destination = new LonLatDto();
+ LonLatDto origin = new LonLatDto();
+ boolean ROUTE_FLAG = false;
+ boolean start = false;
+ if(newXpCruiseOrder.getOrderReverse() == 1){
+ for (XpCruisePlanPoint xpCruisePlanPoint1 : planPointList) {
+ if (start || xpCruisePlanPoint1.getPointId().equals(newXpCruiseOrder.getEndPointId())) {
+ start = true;
+ origin.setLongitude(newXpCruiseOrder.getStartLon());
+ origin.setLatitude(newXpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = pointService.getById(xpCruisePlanPoint1.getPointId());
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + newXpCruiseOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }else{
+ for (int i = planPointList.size() - 1; i >= 0; i--) {
+ XpCruisePlanPoint xpCruisePlanPoint1 = planPointList.get(i);
+ if(start || xpCruisePlanPoint1.getPointId().equals(newXpCruiseOrder.getEndPointId())){
+ start = true;
+ origin.setLongitude(newXpCruiseOrder.getStartLon());
+ origin.setLatitude(newXpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = pointService.getById(xpCruisePlanPoint1.getPointId());
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + newXpCruiseOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }
+ if(!ROUTE_FLAG){
+ return R.fail("巡游计划获取导航信息失败");
+ }
return R.ok(newXpCruiseOrder);
}
@@ -204,8 +287,27 @@
public R<List<XpCruisePlanPoint>> getCruisePlanPointList(@RequestParam Long vehicleId) {
// 先找计划
XpCruisePlanVehicle plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>().eq(XpCruisePlanVehicle::getVehicleId, vehicleId));
+ Long cruisePlanId = null;
+ if(null == plan){
+ //没有巡游计划,判断是否在定向服务里面
+ List<XpTargetedService> targetedServices = xpTargetedServiceService.list(new QueryWrapper<XpTargetedService>().eq("status", 1));
+ if(targetedServices.isEmpty()){
+ return R.fail("没有巡游计划,执行收车失败");
+ }
+ List<Long> collect1 = targetedServices.stream().map(XpTargetedService::getId).collect(Collectors.toList());
+ List<XpTargetedServiceVehicle> list = xpTargetedServiceVehicleService.list(new QueryWrapper<XpTargetedServiceVehicle>().in("targeted_service_id", collect1)
+ .eq("vehicle_id", vehicleId));
+ if(list.isEmpty()){
+ return R.fail("没有巡游计划,执行收车失败");
+ }
+ cruisePlanId = list.get(0).getCruisePlanId();
+ }else{
+ cruisePlanId = plan.getCruisePlanId();
+ }
+
// 找对应的多个点位
- List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>().eq(XpCruisePlanPoint::getCruisePlanId, plan.getCruisePlanId()).orderByAsc(XpCruisePlanPoint::getSortOrder));
+ List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>()
+ .eq(XpCruisePlanPoint::getCruisePlanId, cruisePlanId).orderByAsc(XpCruisePlanPoint::getSortOrder));
return R.ok(planPointList);
}
@@ -218,13 +320,25 @@
*/
@PostMapping("/logan/inner/cruise/getNewCruiseOrder")
public R<XpCruiseOrder> getNewCruiseOrder(@RequestBody NewCruiseOrderDto dto) {
-
// 先找计划
XpCruisePlanVehicle plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>().eq(XpCruisePlanVehicle::getVehicleId, dto.getVehicleId()));
+ if(null == plan){
+ //没有巡游计划,判断是否在定向服务里面
+ List<XpTargetedService> targetedServices = xpTargetedServiceService.list(new QueryWrapper<XpTargetedService>().eq("status", 1));
+ if(targetedServices.isEmpty()){
+ return R.ok(null);
+ }
+ List<Long> collect1 = targetedServices.stream().map(XpTargetedService::getId).collect(Collectors.toList());
+ List<XpTargetedServiceVehicle> list = xpTargetedServiceVehicleService.list(new QueryWrapper<XpTargetedServiceVehicle>().in("targeted_service_id", collect1)
+ .eq("vehicle_id", dto.getVehicleId()));
+ if(list.isEmpty()){
+ return R.ok(null);
+ }
+ plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>()
+ .eq(XpCruisePlanVehicle::getCruisePlanId, list.get(0).getCruisePlanId()).eq(XpCruisePlanVehicle::getVehicleId, dto.getVehicleId()));
+ }
// 找对应的多个点位
List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>().eq(XpCruisePlanPoint::getCruisePlanId, plan.getCruisePlanId()).orderByAsc(XpCruisePlanPoint::getSortOrder));
-
-
XpCruiseOrder newXpCruiseOrder = new XpCruiseOrder();
newXpCruiseOrder.setFleetId(dto.getFleetId());
@@ -251,6 +365,62 @@
newXpCruiseOrder.setEndLon(endPoint.getPointLon());
newXpCruiseOrder.setEndLat(endPoint.getPointLat());
+ //获取巡游导航数据,如果无法获取到有效的导航,则继续用下一个点位作为终点
+ LonLatDto destination = new LonLatDto();
+ LonLatDto origin = new LonLatDto();
+ boolean ROUTE_FLAG = false;
+ boolean start = false;
+ if(newXpCruiseOrder.getOrderReverse() == 1){
+ for (XpCruisePlanPoint xpCruisePlanPoint1 : planPointList) {
+ if (start || xpCruisePlanPoint1.getPointId().equals(newXpCruiseOrder.getEndPointId())) {
+ start = true;
+ origin.setLongitude(newXpCruiseOrder.getStartLon());
+ origin.setLatitude(newXpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = pointService.getById(xpCruisePlanPoint1.getPointId());
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + newXpCruiseOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }else{
+ for (int i = planPointList.size() - 1; i >= 0; i--) {
+ XpCruisePlanPoint xpCruisePlanPoint1 = planPointList.get(i);
+ if(start || xpCruisePlanPoint1.getPointId().equals(newXpCruiseOrder.getEndPointId())){
+ start = true;
+ origin.setLongitude(newXpCruiseOrder.getStartLon());
+ origin.setLatitude(newXpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = pointService.getById(xpCruisePlanPoint1.getPointId());
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + newXpCruiseOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }
+ if(!ROUTE_FLAG){
+ return R.fail("巡游计划获取导航信息失败");
+ }
return R.ok(newXpCruiseOrder);
@@ -267,7 +437,19 @@
// 先找计划
XpCruisePlanVehicle plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>().eq(XpCruisePlanVehicle::getVehicleId, xpCruiseOrder.getVehicleId()));
if(null == plan){
- return R.fail("没有巡游计划,执行收车失败");
+ //没有巡游计划,判断是否在定向服务里面
+ List<XpTargetedService> targetedServices = xpTargetedServiceService.list(new QueryWrapper<XpTargetedService>().eq("status", 1));
+ if(targetedServices.isEmpty()){
+ return R.fail("没有巡游计划,执行收车失败");
+ }
+ List<Long> collect1 = targetedServices.stream().map(XpTargetedService::getId).collect(Collectors.toList());
+ List<XpTargetedServiceVehicle> list = xpTargetedServiceVehicleService.list(new QueryWrapper<XpTargetedServiceVehicle>().in("targeted_service_id", collect1)
+ .eq("vehicle_id", xpCruiseOrder.getVehicleId()));
+ if(list.isEmpty()){
+ return R.fail("没有巡游计划,执行收车失败");
+ }
+ plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>()
+ .eq(XpCruisePlanVehicle::getCruisePlanId, list.get(0).getCruisePlanId()).eq(XpCruisePlanVehicle::getVehicleId, xpCruiseOrder.getVehicleId()));
}
// 找对应的多个点位
List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>().eq(XpCruisePlanPoint::getCruisePlanId, plan.getCruisePlanId()).orderByAsc(XpCruisePlanPoint::getSortOrder));
@@ -278,6 +460,63 @@
xpCruiseOrder.setEndLon(xpPoint.getPointLon());
xpCruiseOrder.setEndLat(xpPoint.getPointLat());
xpCruiseOrder.setMissionId(plan.getCruisePlanId());
+
+ //获取巡游导航数据,如果无法获取到有效的导航,则继续用下一个点位作为终点
+ LonLatDto destination = new LonLatDto();
+ LonLatDto origin = new LonLatDto();
+ boolean ROUTE_FLAG = false;
+ boolean start = false;
+ if(xpCruiseOrder.getOrderReverse() == 1){
+ for (XpCruisePlanPoint xpCruisePlanPoint1 : planPointList) {
+ if (start || xpCruisePlanPoint1.getPointId().equals(xpCruiseOrder.getEndPointId())) {
+ start = true;
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = pointService.getById(xpCruisePlanPoint1.getPointId());
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + xpCruiseOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }else{
+ for (int i = planPointList.size() - 1; i >= 0; i--) {
+ XpCruisePlanPoint xpCruisePlanPoint1 = planPointList.get(i);
+ if(start || xpCruisePlanPoint1.getPointId().equals(xpCruiseOrder.getEndPointId())){
+ start = true;
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = pointService.getById(xpCruisePlanPoint1.getPointId());
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + xpCruiseOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }
+ if(!ROUTE_FLAG){
+ return R.fail("巡游计划获取导航信息失败");
+ }
return R.ok(xpCruiseOrder);
}
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTargetedServiceController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTargetedServiceController.java
index 43d09da..996f45e 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTargetedServiceController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTargetedServiceController.java
@@ -210,4 +210,18 @@
return R.ok(list.stream().map(XpTargetedServiceVehicle::getVehicleId).collect(Collectors.toList()));
}
+
+
+ /**
+ * 获取定向服务所有车辆
+ * @return
+ */
+ @GetMapping("/logan/inner/v1/targetedService/getAllTargetedServiceVehicleByCityCode")
+ public R<List<XpTargetedServiceVehicle>> getAllTargetedServiceVehicleByCityCode(@RequestParam("cityCode") String cityCode){
+ List<XpTargetedService> targetedServices = xpTargetedServiceService.list(new LambdaQueryWrapper<XpTargetedService>()
+ .eq(XpTargetedService::getCityCode, cityCode).eq(XpTargetedService::getStatus, 1));
+ List<XpTargetedServiceVehicle> list = xpTargetedServiceVehicleService.list(new LambdaQueryWrapper<XpTargetedServiceVehicle>().in(XpTargetedServiceVehicle::getTargetedServiceId, targetedServices.stream()
+ .map(XpTargetedService::getId).collect(Collectors.toList())));
+ return R.ok(list);
+ }
}
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
index 8850942..54c5933 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
@@ -1,33 +1,49 @@
package com.xiaopeng.operation.service.impl;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.dto.account.UcUserInfo;
+import com.xiaopeng.api.dto.operation.SmsDto;
import com.xiaopeng.api.dto.operation.XpActivityDto;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
+import com.xiaopeng.api.feignClient.operation.SmsClient;
+import com.xiaopeng.api.feignClient.operation.XpCouponClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
+import com.xiaopeng.api.feignClient.pushMessage.SubscribeMessageClient;
import com.xiaopeng.api.model.account.XpAppUserCoupon;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
import com.xiaopeng.api.vo.account.AppUserCouponSaveBatchVo;
+import com.xiaopeng.api.vo.operation.SmsVo;
+import com.xiaopeng.api.vo.pushMessage.SendCouponMessageVo;
+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.utils.bean.BeanUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.mapper.XpActicityMapper;
import com.xiaopeng.operation.service.*;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
+import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -75,6 +91,35 @@
@Resource
private UserResourcesClient userResourcesClient;
+
+ @Resource
+ private SubscribeMessageClient subscribeMessageClient;
+
+ @Resource
+ private XpCouponClient xpCouponClient;
+
+ @Resource
+ private SmsClient smsClient;
+
+ @Value("${sms.appid:1476153389173952512}")
+ private String sms_appid;
+
+ private static final ThreadPoolExecutor RETRY_EXECUTOR = new ThreadPoolExecutor(
+ 4,
+ 16,
+ 60L, TimeUnit.SECONDS,
+ new LinkedBlockingQueue<>(512),
+ new ThreadFactory() {
+ private final AtomicInteger counter = new AtomicInteger(0);
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r, "route-push-retry-" + counter.incrementAndGet());
+ t.setDaemon(true);
+ return t;
+ }
+ },
+ new ThreadPoolExecutor.CallerRunsPolicy()
+ );
@@ -234,13 +279,6 @@
List<XpActivity> list = xpActicityService.list(new QueryWrapper<XpActivity>().in("status", Arrays.asList(1, 2)).eq("is_deleted", 0));
for (XpActivity xpActivity : list) {
Integer status = xpActivity.getStatus();
- //即将开始的活动推送socket给前端用户
- if(1 == status && LocalDateTime.now().isBefore(xpActivity.getStartTime())){
-
- }
-
- //即将结束的活动推送给前端用户
-
//生效的活动修改状态和发放一次优惠券
if(1 == status && LocalDateTime.now().isAfter(xpActivity.getStartTime()) && LocalDateTime.now().isBefore(xpActivity.getEndTime())){
xpActivity.setStatus(2);
@@ -250,7 +288,6 @@
for (XpActicityStrategy xpActicityStrategy : list1) {
pushCoupon(xpActivity, xpActicityStrategy);
}
-
}
//到期的活动修改状态为已结束
if(2 == status & LocalDateTime.now().isAfter(xpActivity.getEndTime())){
@@ -355,8 +392,8 @@
AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
vo.setXpAppUserCoupons(xpAppUserCoupons);
xpAppUserCouponClient.saveBatch(vo);
-
- log.info("全部白名单用户发送 {}", JSON.toJSONString(xpAppUserCoupons));
+ //发送到账提醒消息
+ pushMessage(xpActivity, xpAppUserCoupons);
}
if(null == distributionsTotal){
continue;
@@ -432,6 +469,8 @@
AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
vo.setXpAppUserCoupons(xpAppUserCoupons);
xpAppUserCouponClient.saveBatch(vo);
+ //发送到账提醒消息
+ pushMessage(xpActivity, xpAppUserCoupons);
}
if(null == distributionsTotal){
continue;
@@ -518,8 +557,97 @@
AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
vo.setXpAppUserCoupons(xpAppUserCoupons);
xpAppUserCouponClient.saveBatch(vo);
+ //发送到账提醒消息
+ pushMessage(xpActivity, xpAppUserCoupons);
}
}
}
}
+
+
+ /**
+ * 推送提醒消息
+ * @param xpActivity
+ * @param list
+ */
+ private void pushMessage(XpActivity xpActivity, List<XpAppUserCoupon> list) {
+ pushWxCouponMessage(xpActivity, list);
+ pushSmsCouponMessage(xpActivity, list);
+ }
+
+
+ /**
+ * 微信通知
+ */
+ private void pushWxCouponMessage(XpActivity xpActivity, List<XpAppUserCoupon> list) {
+ log.info("开始执行优惠券到账微信提醒消息发送 {}", JSON.toJSONString(xpActivity));
+ //微信通知活动开始提醒(0=否,1=是)
+ Integer wechatReceivedReminder = xpActivity.getWechatReceivedReminder();
+ if(null != wechatReceivedReminder && 1 == wechatReceivedReminder){
+ RETRY_EXECUTOR.execute(() -> {
+ for (XpAppUserCoupon xpAppUserCoupon : list) {
+ XpCoupon coupon = xpCouponClient.getCouponById(xpAppUserCoupon.getCouponId()).getData();
+ SendSubscribeMessageVo vo = new SendSubscribeMessageVo();
+ vo.setUserId(xpAppUserCoupon.getAppUserId());
+ vo.setTemplateId(MessageTemplateEnum.C.getTemplateId());
+ String json = MessageTemplateEnum.C.getRemarks();
+ json = json.replace("活动名称", xpAppUserCoupon.getCouponName());
+ json = json.replace("温馨提示", coupon.getCouponDescription());
+ vo.setJson(json);
+ R<?> r = subscribeMessageClient.sendSubscribeMessage(vo);
+ }
+ });
+ }
+ }
+
+
+ /**
+ * 短信通知
+ * @param xpActivity
+ */
+ private void pushSmsCouponMessage(XpActivity xpActivity, List<XpAppUserCoupon> list) {
+ log.info("开始执行优惠券短信提醒消息发送 {}", JSON.toJSONString(xpActivity));
+ Integer now = Integer.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HHmm")));
+ if(StringUtils.hasLength(xpActivity.getSmsStartBlockingTime())){
+ String[] smsStartBlockingTime = xpActivity.getSmsStartBlockingTime().split(",");
+ String[] smsEndBlockingTime = xpActivity.getSmsEndBlockingTime().split(",");
+ for (int i = 0; i < smsStartBlockingTime.length; i++) {
+ Integer start = Integer.valueOf(smsStartBlockingTime[i].replace(":", ""));
+ Integer end = Integer.valueOf(smsEndBlockingTime[i].replace(":", ""));
+ if(start <= now && now <= end){
+ log.info("当前时间在短信发送时间区间内,不发送短信");
+ return;
+ }
+ }
+ }
+
+
+ //短信通知到账提醒(0=否,1=是)
+ Integer smsReceivedReminder = xpActivity.getSmsReceivedReminder();
+ if(null != smsReceivedReminder && 1 == smsReceivedReminder){
+ RETRY_EXECUTOR.execute(() -> {
+ for (XpAppUserCoupon xpAppUserCoupon : list) {
+ UcUserInfo ucUserInfo = userResourcesClient.getBaseUserByUid(xpAppUserCoupon.getAppUserId().toString());
+ if(null == ucUserInfo || !StringUtils.hasLength(ucUserInfo.getMobile())){
+ log.info("用户信息不存在,跳过");
+ continue;
+ }
+ XpCoupon coupon = xpCouponClient.getCouponById(xpAppUserCoupon.getCouponId()).getData();
+ SmsVo vo = new SmsVo();
+ vo.setAppId(sms_appid);
+ vo.setPushType(1);
+ vo.setReceivers(ucUserInfo.getMobile());
+ vo.setTemplateCode("RTActivityStartTpl");
+ vo.setAppPushConfigCode("RTActivityStartSms");
+ vo.setParams(new HashMap<>());
+ vo.getParams().put("name", xpAppUserCoupon.getCouponName());
+ SmsDto smsDto = smsClient.pushSms(vo);
+ if(null == smsDto || smsDto.getCode() != 200){
+ log.info("短信发送失败");
+ }
+ }
+ });
+ }
+ }
+
}
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
index f2c7cc4..4a37637 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
@@ -348,6 +348,7 @@
fareVo.setOriginalFare(xpPricingCardVo.getTotalPrice());
if (userCouponVo != null) {
fareVo.setDiscountAmount(userCouponVo.getMoney());
+ fareVo.setCouponType(userCouponVo.getCouponType());
fareVo.setFinalFare(fareVo.getOriginalFare() - fareVo.getDiscountAmount());
fareVo.setCouponId(userCouponVo.getId());
} else {
@@ -497,7 +498,7 @@
// xpOrder.setStartMileage(Double.valueOf(startMileage));
xpOrder.setAppUserId(Long.valueOf(uid));
- xpOrder.setOrderNumber("XP" + System.currentTimeMillis());
+ xpOrder.setOrderNumber(getOrderNumber());
xpOrder.setPlacementLon(dto.getPlacementLon());
xpOrder.setPlacementLat(dto.getPlacementLat());
xpOrder.setPlacementAddress(dto.getPlacementAddress());
@@ -642,6 +643,11 @@
}
+ private String getOrderNumber(){
+ int random = Double.valueOf(Math.random() * 1000).intValue();
+ return "XP" + random + System.currentTimeMillis();
+ }
+
private Boolean isInOperationTime(String operationStrategy) {
JSONArray jsonArray = JSONArray.parseArray(operationStrategy);
Integer holidayToday = holidayUtil.isHolidayToday();
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/GDMapGeocodingUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/GDMapGeocodingUtil.java
index ad9f688..50a4a4a 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/GDMapGeocodingUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/GDMapGeocodingUtil.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.common.core.utils.HttpUtils;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@@ -16,7 +17,11 @@
@Lazy
public class GDMapGeocodingUtil {
- private String key = "66ae577f63898dae3016d599fda57221";
+ @Value("${map.api-key}")
+ private String key;
+
+ @Value("${map.urls.reverse-geocode}")
+ private String reverseGeocodeUrl;
@@ -30,7 +35,7 @@
* @throws Exception
*/
public Map<String, String> geocode(String lon, String lan) {
- String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan;
+ String url = reverseGeocodeUrl + "?key=" + key + "&location=" + lon + "," + lan;
String forObject = HttpUtils.sendGet(url);
JSONObject jsonObject = JSON.parseObject(forObject);
Map<String, String> map = new HashMap<>();
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
index d590732..27c5b4f 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -174,7 +174,9 @@
String orderId = split[0];
XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData();
if(xpOrder.getStatus() != OrderStatusEnum.PENDING_ORDER.getCode()){
- redisService.popFirstElement(xpOrder.getQueueName());
+ if(StringUtils.isNotEmpty((xpOrder.getQueueName()))){
+ redisService.removeByPattern(xpOrder.getQueueName(), xpOrder.getOrderNumber());
+ }
}
}
@@ -195,7 +197,7 @@
String[] split = firstElement.toString().split("_");
// 如果未处理 创建新任务
if (split[2].equals("0")) {
- String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7];
+ String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7] + "_" + split[8];
// 状态改为处理中
redisService.updateFirst(name, value);
threadPoolTaskExecutor.submit(() -> {
@@ -207,7 +209,9 @@
String orderId = split[0];
XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData();
if(xpOrder.getStatus() != OrderStatusEnum.PENDING_ORDER.getCode()){
- redisService.popFirstElement(xpOrder.getQueueName());
+ if(StringUtils.isNotEmpty(xpOrder.getQueueName())){
+ redisService.removeByPattern(xpOrder.getQueueName(), xpOrder.getOrderNumber());
+ }
}
}
@@ -311,9 +315,6 @@
if (xpOrder.getStatus() == 1) {
xpOrderClient.cancelOrder(orderId);
log.info("五轮推单结束,无车辆接单,执行取消订单 {}", orderNo);
- //将订单从队列中移除
- redisService.popFirstElement(quoteName);
- log.info("五轮推单结束,无车辆接单,执行队列移除订单 {}", orderNo);
//推送订单状态给乘客
SendMessageDTO dto = new SendMessageDTO();
dto.setAppUserId(xpOrder.getAppUserId().toString());
@@ -368,7 +369,11 @@
}
XpOrder xpOrder = xpOrderR.getData();
if (xpOrder.getStatus() == 0) {
- redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ log.info("订单已取消,退出退单逻辑 {}", orderNo);
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ }
+ return true;
}
// 找出围栏id
@@ -428,6 +433,8 @@
PushOrderDto pushOrderDto = new PushOrderDto();
pushOrderDto.setVin(priorityVin);
pushOrderDto.setOrderId(orderCheck.getData().getId().toString());
+ pushOrderDto.setStartTaskId(orderCheck.getData().getXpuStartTaskId());
+ pushOrderDto.setEndTaskId(orderCheck.getData().getXpuEndTaskId());
pushOrderDto.setStartWaypointId(orderCheck.getData().getStartPointId());
pushOrderDto.setEndWaypointId(orderCheck.getData().getEndPointId());
pushOrderDto.setStartLatitude(orderCheck.getData().getStartLat());
@@ -442,7 +449,10 @@
orderCheck.getData().getEndLat(), orderCheck.getData().getEndLon(), orderNo);
orderMissionClient.pushOrder(pushOrderDto);
log.info("[人车订单绑定测试] ====== 派单成功! uid={}, vin={}, orderNo={}, 从队列移除订单 ======", uid, priorityVin, orderNo);
- redisService.removeByPattern(quoteName, orderNo);
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, orderNo);
+ }
+
return true;
} else {
log.info("[人车订单绑定测试] 关闭巡游单失败, 回退常规流程, vin={}, orderNo={}", priorityVin, orderNo);
@@ -1068,77 +1078,68 @@
}
VehiclePositionVo vehiclePositionVo = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getTotal).reversed()).collect(Collectors.toList()).get(0);
-//
-// VehiclePositionVo vehiclePositionVo1 = vehiclePositionVo;
-
-
RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin());
lock.lock(10, TimeUnit.SECONDS);
log.info("队列 {} 车辆 {} 单号 {}", quoteName, vehiclePositionVo.getVin(), orderNo);
try {
-
-
-
-// VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin());
- if (vehiclePositionR.getCode() != 200) {
- continue;
- }
- XpVehicle vehiclePosition = vehiclePositionR.getData();
- log.info("符合条件的车辆 {} ,直接推单XPU。单号 {}", vehiclePosition.getPlateNumber(), orderNo);
- log.info("当前车辆状态 {} 单号 {}", vehiclePosition.getState(), orderNo);
+ if (vehiclePositionR.getCode() == 200) {
+ XpVehicle vehiclePosition = vehiclePositionR.getData();
+ log.info("符合条件的车辆 {} ,直接推单XPU。单号 {}", vehiclePosition.getPlateNumber(), orderNo);
+ log.info("当前车辆状态 {} 单号 {}", vehiclePosition.getState(), orderNo);
- String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehiclePosition.getVehicleVin());
- // 再次查询一下订单 看是否取消
- xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
- if (xpOrderR.getCode() != 200) {
- continue;
- }
- xpOrder = xpOrderR.getData();
- if (xpOrder.getStatus() != 1) {
- continue;
- }
- //所有条件满足,走正常派单,不满足走后面的连环派单
- if (vehiclePosition.getOperatingStatus() == 1 && vehiclePosition.getState() == 0 && vehiclePosition.getVehicleType() == 2) {
- //非合作商的车辆需要处理巡游单
- if(null == vehiclePosition.getOfficialPartnerId()){
- // 关闭巡游单子
- R<XpCruiseOrder> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vin);
- if (stringR == null || stringR.getCode() != 200) {
- log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber());
- continue;
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehiclePosition.getVehicleVin());
+ // 再次查询一下订单 看是否取消
+ xpOrder = xpOrderClient.queryOrderByOrderNo(orderNo).getData();
+ if (xpOrder.getStatus() == 1) {
+ //所有条件满足,走正常派单,不满足走后面的连环派单
+ if (vehiclePosition.getOperatingStatus() == 1 && vehiclePosition.getState() == 0 && vehiclePosition.getVehicleType() == 2) {
+ //非合作商的车辆需要处理巡游单
+ if(null == vehiclePosition.getOfficialPartnerId()){
+ // 关闭巡游单子
+ R<XpCruiseOrder> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vin);
+ if (stringR != null && stringR.getCode() == 200) {
+ log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo);
+ XpCruiseOrder cruiseOrder = stringR.getData();
+ // 下发命令
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setVin(vin);
+ pushOrderDto.setOrderId(xpOrder.getId().toString());
+ pushOrderDto.setStartTaskId(xpOrder.getXpuStartTaskId());
+ pushOrderDto.setEndTaskId(xpOrder.getXpuEndTaskId());
+ pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
+ pushOrderDto.setStartLatitude(xpOrder.getStartLat());
+ pushOrderDto.setStartLongitude(xpOrder.getStartLon());
+ pushOrderDto.setEndLatitude(xpOrder.getEndLat());
+ pushOrderDto.setEndLongitude(xpOrder.getEndLon());
+ pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
+ pushOrderDto.setOrderType(OrderType.USER_ORDER);
+ pushOrderDto.setStage(1);
+ if(null != cruiseOrder){
+ pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId());
+ pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId());
+ }
+ pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
+ // 调用推送服务 orderId + carVin
+ orderMissionClient.pushOrder(pushOrderDto);
+ log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
+ }
+ }else {
+ //流量接入-接单推送 合作商的车辆需要调用合作商的订单通知接口
+ officialPartnerUtil.pushNewOrder(vehiclePosition.getOfficialPartnerId(), xpOrder);
+ }
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ }
+
+ log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
+ return true;
}
- log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo);
- XpCruiseOrder cruiseOrder = stringR.getData();
- // 下发命令
- PushOrderDto pushOrderDto = new PushOrderDto();
- pushOrderDto.setVin(vin);
- pushOrderDto.setOrderId(xpOrder.getId().toString());
- pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
- pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
- pushOrderDto.setStartLatitude(xpOrder.getStartLat());
- pushOrderDto.setStartLongitude(xpOrder.getStartLon());
- pushOrderDto.setEndLatitude(xpOrder.getEndLat());
- pushOrderDto.setEndLongitude(xpOrder.getEndLon());
- pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
- pushOrderDto.setOrderType(OrderType.USER_ORDER);
- pushOrderDto.setStage(1);
- if(null != cruiseOrder){
- pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId());
- pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId());
- }
- pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
- // 调用推送服务 orderId + carVin
- orderMissionClient.pushOrder(pushOrderDto);
- log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
- }else {
- //流量接入-接单推送 合作商的车辆需要调用合作商的订单通知接口
- officialPartnerUtil.pushNewOrder(vehiclePosition.getOfficialPartnerId(), xpOrder);
}
- redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
- log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
- return true;
+
}
+
} catch (Exception e) {
e.printStackTrace();
} finally {
@@ -1155,62 +1156,59 @@
try {
// 查询车辆状态
R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin);
- if (vehicleR.getCode() != 200) {
- continue;
- }
- XpVehicle vehicleId1 = vehicleR.getData();
- log.info("附近只有一个车辆 {} ,直接推单XPU。单号 {}", vehicleId1.getPlateNumber(), orderNo);
- log.info("当前车辆状态 运营状态 {} 单号 {}", vehicleId1.getState(), orderNo);
+ if (vehicleR.getCode() == 200) {
+ XpVehicle vehicleId1 = vehicleR.getData();
+ log.info("附近只有一个车辆 {} ,直接推单XPU。单号 {}", vehicleId1.getPlateNumber(), orderNo);
+ log.info("当前车辆状态 运营状态 {} 单号 {}", vehicleId1.getState(), orderNo);
- // 再次查询一下订单 看是否取消
- xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
- if (xpOrderR.getCode() != 200) {
- continue;
- }
- xpOrder = xpOrderR.getData();
- if (xpOrder.getStatus() != 1) {
- continue;
- }
+ // 再次查询一下订单 看是否取消
+ xpOrder = xpOrderClient.queryOrderByOrderNo(orderNo).getData();
+ if (xpOrder.getStatus() == 1) {
+ // 所有条件满足走正常派单,不满足走循环派单
+ if (vehicleId1.getOperatingStatus() == 1 && vehicleId1.getState() == 0 && vehicleId1.getVehicleType() == 2) {
+ if(null == vehicleId1.getOfficialPartnerId()){
+ // 关闭巡游单子
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehicleId1.getVehicleVin());
+ R<XpCruiseOrder> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vin);
+ if (stringR != null && stringR.getCode() == 200) {
+ log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo);
+ XpCruiseOrder cruiseOrder = stringR.getData();
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setVin(vehiclePosition.getVin());
+ pushOrderDto.setOrderId(xpOrder.getId().toString());
+ pushOrderDto.setStartTaskId(xpOrder.getXpuStartTaskId());
+ pushOrderDto.setEndTaskId(xpOrder.getXpuEndTaskId());
+ pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
+ pushOrderDto.setStartLatitude(xpOrder.getStartLat());
+ pushOrderDto.setStartLongitude(xpOrder.getStartLon());
+ pushOrderDto.setEndLatitude(xpOrder.getEndLat());
+ pushOrderDto.setEndLongitude(xpOrder.getEndLon());
+ pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
+ pushOrderDto.setOrderType(OrderType.USER_ORDER);
+ pushOrderDto.setStage(1);
+ if(null != cruiseOrder){
+ pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId());
+ pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId());
+ }
+ pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
+ // 调用推送服务 orderId + carVin
+ orderMissionClient.pushOrder(pushOrderDto);
+ }
+ }else {
+ //流量接入-接单推送 合作商的车辆需要调用合作商的订单通知接口
+ officialPartnerUtil.pushNewOrder(vehicleId1.getOfficialPartnerId(), xpOrder);
+ }
+ log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
- // 所有条件满足走正常派单,不满足走循环派单
- if (vehicleId1.getOperatingStatus() == 1 && vehicleId1.getState() == 0 && vehicleId1.getVehicleType() == 2) {
- if(null == vehicleId1.getOfficialPartnerId()){
- // 关闭巡游单子
- String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehicleId1.getVehicleVin());
- R<XpCruiseOrder> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vin);
- if (stringR == null || stringR.getCode() != 200) {
- log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber());
- continue;
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ }
+
+ log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
+ return true;
}
- log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo);
- XpCruiseOrder cruiseOrder = stringR.getData();
- PushOrderDto pushOrderDto = new PushOrderDto();
- pushOrderDto.setVin(vehiclePosition.getVin());
- pushOrderDto.setOrderId(xpOrder.getId().toString());
- pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
- pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
- pushOrderDto.setStartLatitude(xpOrder.getStartLat());
- pushOrderDto.setStartLongitude(xpOrder.getStartLon());
- pushOrderDto.setEndLatitude(xpOrder.getEndLat());
- pushOrderDto.setEndLongitude(xpOrder.getEndLon());
- pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
- pushOrderDto.setOrderType(OrderType.USER_ORDER);
- pushOrderDto.setStage(1);
- if(null != cruiseOrder){
- pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId());
- pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId());
- }
- pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
- // 调用推送服务 orderId + carVin
- orderMissionClient.pushOrder(pushOrderDto);
- }else {
- //流量接入-接单推送 合作商的车辆需要调用合作商的订单通知接口
- officialPartnerUtil.pushNewOrder(vehicleId1.getOfficialPartnerId(), xpOrder);
}
- log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
- redisService.popFirstElement(quoteName);
- log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
- return true;
}
} catch (Exception e) {
e.printStackTrace();
@@ -1303,11 +1301,14 @@
JSONObject jsonObject = new JSONObject();
jsonObject.put("orderId", xpOrder.getId());
- jsonObject.put("endLongitude", xpOrder.getEndLat());
+ jsonObject.put("endLongitude", xpOrder.getEndLon());
jsonObject.put("endLatitude", xpOrder.getEndLat());
redisService.setCacheObject(CacheConstants.nextOrder(xpOrder1.getId().toString()), jsonObject.toJSONString());
redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), JSON.toJSONString(route));
- redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
+
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
+ }
log.info("连环派单 {} 设置下一单接驾导航数据 {}", orderNo, JSON.toJSONString(route));
//构建推送消息
@@ -1376,7 +1377,10 @@
}
XpOrder xpOrder = xpOrderR.getData();
if (xpOrder.getStatus() == 0) {
- redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ }
+
}
// 找出围栏id
@@ -1452,7 +1456,11 @@
orderCheck.getData().getEndLat(), orderCheck.getData().getEndLon(), orderNo);
orderMissionClient.pushOrder(pushOrderDto);
log.info("[人车订单绑定测试] ====== 派单成功! uid={}, vin={}, orderNo={}, 从队列移除订单 ======", uid, priorityVin, orderNo);
- redisService.removeByPattern(quoteName, orderNo);
+
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, orderNo);
+ }
+
return true;
} else {
log.info("[人车订单绑定测试] 关闭巡游单失败, 回退常规流程, vin={}, orderNo={}", priorityVin, orderNo);
@@ -2132,8 +2140,9 @@
// 调用推送服务 orderId + carVin
orderMissionClient.pushOrder(pushOrderDto);
log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
-
- redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ }
log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
return true;
} catch (Exception e) {
@@ -2205,7 +2214,10 @@
// 调用推送服务 orderId + carVin
orderMissionClient.pushOrder(pushOrderDto);
log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
- redisService.popFirstElement(quoteName);
+
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+ }
log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
return true;
} catch (Exception e) {
@@ -2298,11 +2310,14 @@
// orderMissionClient.pushOrder(pushOrderDto);
JSONObject jsonObject = new JSONObject();
jsonObject.put("orderId", xpOrder.getId());
- jsonObject.put("endLongitude", xpOrder.getEndLat());
+ jsonObject.put("endLongitude", xpOrder.getEndLon());
jsonObject.put("endLatitude", xpOrder.getEndLat());
redisService.setCacheObject(CacheConstants.nextOrder(luckyOder.getId().toString()), jsonObject.toJSONString());
redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), routeToOrigin);
- redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
+ if(StringUtils.isNotEmpty(quoteName)){
+ redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
+ }
+
log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
break;
}
@@ -2452,7 +2467,7 @@
routeToOrigin.setDistance(routeToOrigin.getDistance() + routeRemain.getDistance());
JSONObject jsonObject = new JSONObject();
jsonObject.put("orderId", data.getId());
- jsonObject.put("endLongitude", data.getEndLat());
+ jsonObject.put("endLongitude", data.getEndLon());
jsonObject.put("endLatitude", data.getEndLat());
redisService.setCacheObject(CacheConstants.nextOrder(luckyOder.getId().toString()), jsonObject.toJSONString());
redisService.setCacheObject(CacheConstants.navigationStart(data.getAppUserId().toString()), routeToOrigin);
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java
index c07030a..f7debcc 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java
@@ -115,21 +115,19 @@
}
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
- double amount = 0;
-
double realDistance = distance / 1000;//实际公里
double realTime = duration / 60;//实际时间
double exceedDistance = (realDistance - rule.getDouble("num2")) < 0 ? 0 : realDistance - rule.getDouble("num2");//超出起步里程的公里
double exceedTime = (realTime - rule.getDouble("num3")) < 0 ? 0 : realTime - rule.getDouble("num3");//超过起步分钟数的时间
// 起步价
- Double startPrice = rule.getDouble("num1");
+ Double startPrice = rule.getDouble("num1") * priceRate;
// 超出公里数价格
- Double distancePrice = rule.getDouble("num4") * exceedDistance;
+ Double distancePrice = rule.getDouble("num4") * exceedDistance * priceRate;
// 超出时间价格
- Double durationPrice = rule.getDouble("num5") * exceedTime;
+ Double durationPrice = rule.getDouble("num5") * exceedTime * priceRate;
startPrice = new BigDecimal(startPrice).multiply(BigDecimal.valueOf(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
@@ -140,7 +138,6 @@
// 里程
xpPricingCardVo.setDistance(realDistance);
xpPricingCardVo.setDuration(realTime);
-
return xpPricingCardVo;
}
@@ -157,8 +154,6 @@
* @throws Exception
*/
public XpPricingCardVo calculationPrice(String uid,JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney,Integer isDynamicPriceStatus,Long openCityId,String dynamicPricingJson) {
-
-
// 默认费率1
double priceRate=1;
if(isDynamicPriceStatus==1){
@@ -208,7 +203,6 @@
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
- double amount = 0;
//等待费
Date date = new Date();
// 计算出是在那个时间段内
@@ -270,8 +264,6 @@
if (realDistance > rule.getDouble("num12")) {
longDistanceThree = rule.getDouble("num34") * (realDistance - rule.getDouble("num12"));
}
- amount = rule.getDouble("num29") + (exceedDistance * rule.getDouble("num30")) + (exceedTime * rule.getDouble("num31")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
xpPricingCardVo.setStartPrice(rule.getDouble("num29"));
@@ -304,8 +296,6 @@
if (realDistance > rule.getDouble("num12")) {
longDistanceThree = rule.getDouble("num20") * (realDistance - rule.getDouble("num12"));
}
- amount = rule.getDouble("num15") + (exceedDistance * rule.getDouble("num16")) + (exceedTime * rule.getDouble("num17")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
xpPricingCardVo.setStartPrice(rule.getDouble("num15"));
@@ -359,8 +349,6 @@
if (realDistance > rule.getDouble("num12")) {
longDistanceThree = rule.getDouble("num28") * (realDistance - rule.getDouble("num12"));
}
- amount = rule.getDouble("num23") + (exceedDistance * rule.getDouble("num24")) + (exceedTime * rule.getDouble("num25")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
xpPricingCardVo.setStartPrice(rule.getDouble("num23"));
@@ -396,8 +384,6 @@
if (realDistance > rule.getDouble("num12")) {
longDistanceThree = rule.getDouble("num13") * (realDistance - rule.getDouble("num12"));
}
- amount = rule.getDouble("num1") + (exceedDistance * rule.getDouble("num4")) + (exceedTime * rule.getDouble("num5")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
xpPricingCardVo.setStartPrice(rule.getDouble("num1"));
@@ -427,15 +413,8 @@
}
// 订单总额
- Double startPrice = xpPricingCardVo.getStartPrice();
- // 先减去起步价重新计算
- amount = amount - startPrice;
- // 动态计算费用
- startPrice= new BigDecimal(startPrice).multiply(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- amount = amount+startPrice;
- xpPricingCardVo.setTotalPrice(amount);
-
-
+ double amount = xpPricingCardVo.getStartPrice() + xpPricingCardVo.getDistancePrice() + xpPricingCardVo.getDurationPrice();
+ xpPricingCardVo.setTotalPrice(new BigDecimal(amount).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
return xpPricingCardVo;
}
/**
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/holiday/HolidayUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/holiday/HolidayUtil.java
index 20cab47..1389a7b 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/holiday/HolidayUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/holiday/HolidayUtil.java
@@ -7,7 +7,7 @@
import com.xiaopeng.common.core.utils.HttpUtils;
import com.xiaopeng.common.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.Duration;
@@ -24,6 +24,9 @@
@Autowired
private RedisService redisService;
+ @Value("${holiday.api.url}")
+ private String holidayApiUrl;
+
public boolean isHoliday() {
LocalDate now = LocalDate.now();
@@ -32,7 +35,7 @@
if (redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now) != null && ("1").equals(redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now).toString())) {
return true;
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" + now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtil.get("https://publicapi.xiaoai.me/holiday/day?date=" +now);
JSONObject jsonObject = JSONObject.parseObject(result);
Object data = jsonObject.get("data");
@@ -60,7 +63,7 @@
if (cacheObject!=null) {
return Integer.valueOf(cacheObject.toString());
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=2026-01-04");
JSONObject jsonObject = JSONObject.parseObject(result);
@@ -93,7 +96,7 @@
if (cacheObject!=null) {
return Integer.valueOf(cacheObject.toString());
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=2026-01-04");
JSONObject jsonObject = JSONObject.parseObject(result);
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/ActivityTask.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/ActivityTask.java
index 7224c73..bd148a8 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/ActivityTask.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/ActivityTask.java
@@ -1,15 +1,11 @@
package com.xiaopeng.operation.utils.task;
-import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.xiaopeng.api.dto.account.UcUserInfo;
-import com.xiaopeng.api.feignClient.account.UserResourcesClient;
-import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
-import com.xiaopeng.api.feignClient.order.XpOrderClient;
-import com.xiaopeng.api.model.account.XpAppUserCoupon;
-import com.xiaopeng.api.model.operation.*;
-import com.xiaopeng.operation.service.*;
+import com.xiaopeng.api.model.operation.XpActicityStrategy;
+import com.xiaopeng.api.model.operation.XpActivity;
+import com.xiaopeng.operation.service.IXpActicityService;
+import com.xiaopeng.operation.service.IXpActicityStrategyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -17,10 +13,7 @@
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
-import java.util.stream.Collectors;
@Slf4j
@Component
@@ -32,27 +25,6 @@
@Resource
private IXpActicityService xpActicityService;
- @Resource
- private IXpActicityUserService xpActicityUserService;
-
- @Resource
- private IXpWhitelistService xpWhitelistService;
-
- @Resource
- private IXpActicityCouponService xpActicityCouponService;
-
- @Resource
- private IXpCouponService xpCouponService;
-
- @Resource
- private XpAppUserCouponClient xpAppUserCouponClient;
-
- @Resource
- private XpOrderClient xpOrderClient;
-
- @Resource
- private UserResourcesClient userResourcesClient;
-
@Scheduled(cron = "0 0/1 * * * *")
public void taskOrder() {
@@ -62,18 +34,13 @@
}
-
-
-
-
-
/**
* 每日发放券的活动
*/
- public void pusCoupon(){
+ public void pusCoupon() {
List<XpActivity> activities = xpActicityService.list(new QueryWrapper<XpActivity>().eq("status", 2)
.eq("is_deleted", 0).last(" and now() between start_time and end_time"));
- if(activities.isEmpty()){
+ if (activities.isEmpty()) {
return;
}
for (XpActivity activity : activities) {
@@ -84,7 +51,7 @@
for (XpActicityStrategy xpActicityStrategy : list) {
String distributionTime = xpActicityStrategy.getDistributionTime();
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm"));
- if(distributionTime.equals(format)){
+ if (distributionTime.equals(format)) {
xpActicityService.pushCoupon(activity, xpActicityStrategy);
}
}
diff --git a/xp-robotaxi-operation-boot/src/main/resources/application-local.yml b/xp-robotaxi-operation-boot/src/main/resources/application-local.yml
index 77ec6b0..ec32a4b 100644
--- a/xp-robotaxi-operation-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-operation-boot/src/main/resources/application-local.yml
@@ -4,6 +4,10 @@
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
@@ -104,3 +108,12 @@
seata:
enabled: false
+
+map:
+ api-key: 66ae577f63898dae3016d599fda57221
+ urls:
+ reverse-geocode: https://restapi.amap.com/v3/geocode/regeo
+
+holiday:
+ api:
+ url: https://publicapi.xiaoai.me/holiday/day?date=
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MinistryTransportProperties.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MinistryTransportProperties.java
new file mode 100644
index 0000000..ef597c8
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MinistryTransportProperties.java
@@ -0,0 +1,41 @@
+package com.xiaopeng.order.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "ministry.transport")
+public class MinistryTransportProperties {
+
+ private String companyId;
+
+ private String platform;
+
+ private String key;
+
+ private String url;
+
+ private String addressCode;
+
+ private String fareType;
+
+ private String departCityDefault;
+
+ private String destCityDefault;
+
+ private String protocolVersion;
+
+ private String driverLicenseId;
+
+ private String driverPhone;
+
+ private String vehicleCertNo;
+
+ private String driverName;
+
+ private String driverIdNo;
+
+ private String driverCertNo;
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
index 03755a1..43a6fd5 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
@@ -3,15 +3,21 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
+import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
+import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.order.AddCruiseMissionDto;
import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
+import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.model.order.XpCruiseOrder;
import com.xiaopeng.api.vo.OrderType;
+import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.WebUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
+import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.order.model.exportExcel.XpCruiseOrderExportExcel;
import com.xiaopeng.order.model.exportExcel.XpOrderExportExcel;
import com.xiaopeng.order.model.query.XpCruiseOrderExcelQuery;
@@ -27,6 +33,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@@ -51,6 +58,10 @@
private final OrderMissionClient orderMissionClient;
private final IXpOrderService xpOrderService;
+ @Resource
+ private XpMapClient xpMapClient;
+
+
/**
* 根据车辆VIN码取消订单
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
index 2c3bb05..7948881 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -16,6 +16,8 @@
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
import com.xiaopeng.api.dto.vehicleConvoy.BleInfoResponseDto;
+import com.xiaopeng.api.feignClient.account.SysGroupMenuClient;
+import com.xiaopeng.api.feignClient.frdXfipEvent.XpFrdXfipEventClient;
import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient;
import com.xiaopeng.api.feignClient.operation.XpWhiteListClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.BluetoothUnlockClient;
@@ -49,6 +51,12 @@
import com.xiaopeng.order.config.BluetoothDebugConfig;
import com.xiaopeng.order.dto.OrderNavigationDto;
import com.xiaopeng.order.model.dto.*;
+import com.xiaopeng.api.model.order.OrderTrajectory;
+import com.xiaopeng.order.mangodb.service.OrderTrajectoryService;
+import com.xiaopeng.order.model.dto.XpOrderCommentDto;
+import com.xiaopeng.order.model.dto.XpOrderOperateDTO;
+import com.xiaopeng.order.model.dto.XpOrderPayDto;
+import com.xiaopeng.order.model.dto.XpOrderReassignDTO;
import com.xiaopeng.order.model.exportExcel.XpOrderExportExcel;
import com.xiaopeng.order.model.query.XpHistoryOrderListQuery;
import com.xiaopeng.order.model.query.XpOrderExcelQuery;
@@ -170,7 +178,7 @@
*/
@PostMapping("/logan/inner/order/has-unpay-order")
@ApiOperation(value = "查询是否有未支付订单", tags = {"内部接口"})
- public R<Long> hasUnPayOrder1(String uid) {
+ public R<Long> hasUnPayOrder(String uid) {
XpOrder order = xpOrderService.getOne(new LambdaQueryWrapper<XpOrder>()
.eq(XpOrder::getAppUserId, Long.parseLong(uid))
.eq(XpOrder::getStatus, 8)
@@ -1068,26 +1076,26 @@
*/
@PostMapping("/base/v1/mini-program/order/creditPayCall")
@ApiOperation(value = "信用支付下单回调", tags = {"小程序-发起支付"}, response = CreditPayCallVo.class)
- public CreditPayCallVo creditPayCall(@RequestBody CreditPayCallDto dto) {
+ public R<CreditPayCallVo> creditPayCall(@RequestBody CreditPayCallDto dto) {
CreditPayCallVo vo = new CreditPayCallVo();
vo.setRetCode("0");
vo.setRetMsg("成功");
if (dto == null || (StringUtils.isBlank(dto.getAuthOrderId()) || StringUtils.isBlank(dto.getBusinessOrderId()))) {
- return vo;
+ return R.ok(vo);
}
LambdaQueryWrapper<XpOrder> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(XpOrder::getAuthOrderId, dto.getAuthOrderId());
XpOrder order = xpOrderService.getOne(wrapper.last("LIMIT 1"));
if (order == null) {
- return vo;
+ return R.ok(vo);
}
if ("SUCCESS".equals(dto.getCreditOrderStatus())) {
// 发起扣款
xpOrderService.creditPayCall(order);
}
- return vo;
+ return R.ok(vo);
}
/**
@@ -1095,26 +1103,9 @@
*/
@PostMapping("/base/v1/mini-program/order/creditPaySuccessCall")
@ApiOperation(value = "信用扣款回调", tags = {"小程序-发起支付"}, response = CreditPayCallVo.class)
- public CreditPayCallVo creditPaySuccessCall(@RequestBody CreditPaySuccessCallDto dto) {
-
- LambdaQueryWrapper<XpOrder> wrapper = new LambdaQueryWrapper<>();
- wrapper.eq(XpOrder::getAuthOrderId, dto.getAuthOrderId());
- XpOrder order = xpOrderService.getOne(wrapper.last("LIMIT 1"));
- if(dto.getPayStatus()==1){
- order.setStatus(9);
- order.setAppUserId(null);
- xpOrderService.updateById(order);
- CreditPayCallVo vo = new CreditPayCallVo();
- vo.setRetCode("0");
- vo.setRetMsg("成功");
-
- // 对接财务
- xpOrderService.xpFrdXfipEventPush(order,dto.getPayFee(),dto.getOrderId());
-
- return vo;
- }
- return null;
-
+ public R<CreditPayCallVo> creditPaySuccessCall(@RequestBody CreditPaySuccessCallDto dto) {
+ CreditPayCallVo vo = xpOrderService.creditPaySuccessCall(dto);
+ return R.ok(vo);
}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderCreateInfoDTO.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderCreateInfoDTO.java
new file mode 100644
index 0000000..8a4cd96
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderCreateInfoDTO.java
@@ -0,0 +1,98 @@
+package com.xiaopeng.order.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 监管平台订单发起(DDFQ) DTO
+ */
+@Data
+@ApiModel("监管平台订单发起信息")
+public class RegulationOrderCreateInfoDTO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("公司标识")
+ private String companyId;
+
+ @ApiModelProperty("发起地行政区划编号")
+ private String address;
+
+ @ApiModelProperty("订单编号")
+ private String orderId;
+
+ @ApiModelProperty("预计用车时间")
+ private String departTime;
+
+ @ApiModelProperty("订单下达时间")
+ private String orderTime;
+
+ @ApiModelProperty("乘客电话")
+ private String passengerPhone;
+
+ @ApiModelProperty("乘客备注")
+ private String passengerNote;
+
+ @ApiModelProperty("预计出发地点详细地址")
+ private String departure;
+
+ @ApiModelProperty("预计出发地点经度")
+ private String depLongitude;
+
+ @ApiModelProperty("预计出发地点纬度")
+ private String depLatitude;
+
+ @ApiModelProperty("预计目的地点详细地址")
+ private String destination;
+
+ @ApiModelProperty("预计目的地点经度")
+ private String destLongitude;
+
+ @ApiModelProperty("预计目的地点纬度")
+ private String destLatitude;
+
+ @ApiModelProperty("坐标加密标识")
+ private String encrypt;
+
+ @ApiModelProperty("运价类型编码")
+ private String fareType;
+
+ @ApiModelProperty("下单来源")
+ private String orderSource;
+
+ @ApiModelProperty("乘客称谓")
+ private String psgName;
+
+ @ApiModelProperty("乘客性别")
+ private String psgGender;
+
+ @ApiModelProperty("乘车人数")
+ private String psgTotal;
+
+ @ApiModelProperty("是否预约订单")
+ private String isReserve;
+
+ @ApiModelProperty("预计里程")
+ private String preMile;
+
+ @ApiModelProperty("预计用时")
+ private String preTime;
+
+ @ApiModelProperty("预计费用")
+ private String preFare;
+
+ @ApiModelProperty("出发城市")
+ private String departCity;
+
+ @ApiModelProperty("目的城市")
+ private String destCity;
+
+ @ApiModelProperty("订单是否来源于第三方聚合平台")
+ private String isFromThirdPlatform;
+
+ @ApiModelProperty("协议版本")
+ private String protocolVersion;
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderMatchInfoDTO.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderMatchInfoDTO.java
new file mode 100644
index 0000000..30ef629
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/dto/RegulationOrderMatchInfoDTO.java
@@ -0,0 +1,104 @@
+package com.xiaopeng.order.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 监管平台订单成功(DDCG) DTO
+ */
+@Data
+@ApiModel("监管平台订单成功信息")
+public class RegulationOrderMatchInfoDTO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("公司标识")
+ private String companyId;
+
+ @ApiModelProperty("发起地行政区划代码")
+ private String address;
+
+ @ApiModelProperty("订单编号")
+ private String orderId;
+
+ @ApiModelProperty("车辆经度")
+ private String longitude;
+
+ @ApiModelProperty("车辆纬度")
+ private String latitude;
+
+ @ApiModelProperty("坐标加密标识")
+ private String encrypt;
+
+ @ApiModelProperty("机动车驾驶证号")
+ private String licenseId;
+
+ @ApiModelProperty("驾驶员联系电话")
+ private String driverPhone;
+
+ @ApiModelProperty("车牌号码")
+ private String vehicleNo;
+
+ @ApiModelProperty("车牌颜色")
+ private String plateColor;
+
+ @ApiModelProperty("派单成功时间")
+ private String distributeTime;
+
+ @ApiModelProperty("订单下达时间")
+ private String orderTime;
+
+ @ApiModelProperty("网络预约出租汽车运输证号")
+ private String carCertNo;
+
+ @ApiModelProperty("驾驶员姓名")
+ private String driverName;
+
+ @ApiModelProperty("驾驶员身份证号")
+ private String idNo;
+
+ @ApiModelProperty("网络预约出租汽车驾驶员证号")
+ private String driCertNo;
+
+ @ApiModelProperty("出发城市")
+ private String departCity;
+
+ @ApiModelProperty("目的城市")
+ private String destCity;
+
+ @ApiModelProperty("预计出发地点")
+ private String departLocale;
+
+ @ApiModelProperty("预计出发地点详细地址")
+ private String departLocaleDetail;
+
+ @ApiModelProperty("预计出发地点经度")
+ private String departLon;
+
+ @ApiModelProperty("预计出发地点纬度")
+ private String departLat;
+
+ @ApiModelProperty("预计目的地点")
+ private String desLocale;
+
+ @ApiModelProperty("预计目的地点详细地址")
+ private String desLocaleDetail;
+
+ @ApiModelProperty("预计目的地点经度")
+ private String desLon;
+
+ @ApiModelProperty("预计目的地点纬度")
+ private String desLat;
+
+ @ApiModelProperty("上一笔订单实际下车时间")
+ private String latestDestTime;
+
+ @ApiModelProperty("订单是否来源于第三方聚合平台")
+ private String isFromThirdPlatform;
+
+ @ApiModelProperty("协议版本")
+ private String protocolVersion;
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
index ee675fe..ad3d284 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -17,11 +17,13 @@
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.dto.UserOrderListDto;
import com.xiaopeng.api.model.order.OrderTrajectory;
+import com.xiaopeng.order.model.dto.CreditPaySuccessCallDto;
import com.xiaopeng.order.model.dto.XpOrderCommentDto;
import com.xiaopeng.order.model.dto.XpOrderPayDto;
import com.xiaopeng.order.model.query.XpHistoryOrderListQuery;
import com.xiaopeng.order.model.query.XpOrderExcelQuery;
import com.xiaopeng.order.model.query.XpOrderPageQuery;
+import com.xiaopeng.order.model.vo.CreditPayCallVo;
import com.xiaopeng.order.model.vo.XpOrderDetailVO;
import com.xiaopeng.order.model.vo.XpOrderHistoryVO;
import com.xiaopeng.order.model.vo.XpOrderPageVO;
@@ -322,4 +324,15 @@
* @param order
*/
void xpFrdXfipEventPush(XpOrder order,Long payFee,String orderId);
+
+
+ /**
+ * 订单扣款成功后的回调
+ * @param dto
+ * @return
+ */
+ CreditPayCallVo creditPaySuccessCall(CreditPaySuccessCallDto dto);
+
+
+
}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/BootCommonService.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/BootCommonService.java
index d1ad053..a914a75 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/BootCommonService.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/BootCommonService.java
@@ -12,6 +12,7 @@
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.core.utils.StringUtils;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.order.service.IXpOrderService;
import org.springframework.stereotype.Component;
@@ -110,9 +111,7 @@
* oldStatus 订单旧状态
*/
public void setCache_orderStatus(Long xpOrderId, XpOrder order ,OrderStatusEnum status) {
- if(order == null){
- order = xpOrderService.getById(xpOrderId);
- }
+ order = xpOrderService.getById(xpOrderId);
redisService.setCacheObject("ORDER_STATUS:" + xpOrderId, order.getStatus(), 24L, TimeUnit.HOURS);
SendSubscribeMessageVo vo = new SendSubscribeMessageVo();
@@ -130,7 +129,7 @@
vo.setTemplateId(MessageTemplateEnum.E.getTemplateId());
json = MessageTemplateEnum.E.getRemarks();
json = json.replace("车牌号", plateNumber);
- json = json.replace("预计到达时间", LocalDateTime.now().toString());
+ json = json.replace("报警时间", LocalDateTime.now().toString());
}
}else if(order.getStatus() == OrderStatusEnum.PICK_UP_GUESTS.getCode()) { //车辆到达上车点通知
String plateNumber = null;
@@ -143,7 +142,7 @@
vo.setTemplateId(MessageTemplateEnum.E.getTemplateId());
json = MessageTemplateEnum.E.getRemarks();
json = json.replace("车牌号", plateNumber);
- json = json.replace("预计驶离时间", LocalDateTime.now().toString());
+ json = json.replace("报警时间", LocalDateTime.now().toString());
}
}else{
@@ -152,14 +151,21 @@
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("");
+ String plateNumber = null;
+ // 查询车辆
+ XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+ if(xpVehicle != null){
+ plateNumber = xpVehicle.getPlateNumber();
+ }
+ if(StringUtils.isNotEmpty(plateNumber)){
+ String bz = getBz(order);
+ vo.setTemplateId(MessageTemplateEnum.A.getTemplateId());
+ json = MessageTemplateEnum.A.getRemarks();
+ json = json.replace("订单编号", plateNumber);
+ json = json.replace("订单状态", OrderStatusEnum.getDescByCode(order.getStatus()));
+ json = json.replace("备注", bz);
+ vo.setPage("");
+ }
}
}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java
index b3c6054..c36e06b 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java
@@ -79,6 +79,7 @@
xpCruiseOrder.setVehicleId(null);
this.updateById(xpCruiseOrder);
PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setEndTaskId(xpCruiseOrder.getXpuTaskId());
pushOrderDto.setVin(xpCruiseOrder.getVehicleVin());
pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index 3ebda38..43d69ba 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -4,6 +4,7 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.DesensitizedUtil;
+import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
@@ -33,6 +34,7 @@
import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
import com.xiaopeng.api.feignClient.account.SysGroupMenuClient;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
+import com.xiaopeng.api.feignClient.account.XpAppUserClient;
import com.xiaopeng.api.feignClient.account.XpAppUserCollectAddrClient;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
@@ -48,6 +50,7 @@
import com.xiaopeng.api.feignClient.vehicleConvoy.*;
import com.xiaopeng.api.model.maintenance.XpTaskRule;
import com.xiaopeng.api.model.operation.*;
+import com.xiaopeng.api.model.account.XpAppUser;
import com.xiaopeng.api.model.order.*;
import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
@@ -87,6 +90,7 @@
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.common.security.utils.SecurityUtils;
+import com.xiaopeng.order.config.MinistryTransportProperties;
import com.xiaopeng.order.constant.I18nKeyConstant;
import com.xiaopeng.order.dto.MileageDto;
import com.xiaopeng.order.dto.UserOrderListDto;
@@ -98,6 +102,9 @@
import com.xiaopeng.order.mapper.XpCruiseOrderMapper;
import com.xiaopeng.order.mapper.XpOrderDetailMapper;
import com.xiaopeng.order.mapper.XpOrderMapper;
+import com.xiaopeng.order.model.dto.CreditPaySuccessCallDto;
+import com.xiaopeng.order.model.dto.RegulationOrderCreateInfoDTO;
+import com.xiaopeng.order.model.dto.RegulationOrderMatchInfoDTO;
import com.xiaopeng.order.model.dto.XpOrderCommentDto;
import com.xiaopeng.order.model.dto.XpOrderPayDto;
import com.xiaopeng.order.model.query.XpHistoryOrderListQuery;
@@ -105,6 +112,7 @@
import com.xiaopeng.order.model.query.XpOrderPageQuery;
import com.xiaopeng.order.model.vo.*;
import com.xiaopeng.order.service.*;
+import com.xiaopeng.order.utils.MinistryOfTransportOrderReporter;
import com.xiaopeng.order.utils.*;
import com.xiaopeng.order.utils.holiday.HolidayUtil;
import com.xiaopeng.order.vo.*;
@@ -161,10 +169,12 @@
private final UserResourcesClient userResourcesClient;
private final XpPointClient xpPointClient;
private final XpVehicleClient xpVehicleClient;
+ private final XpAppUserClient xpAppUserClient;
private final XpAppUserCouponClient xpAppUserCouponClient;
private final XpFleetClient xpFleetClient;
private final XpFleetVehicleClient xpFleetVehicleClient;
private final UserVehicleClient userVehicleClient;
+ private final MinistryTransportProperties ministryTransportProperties;
@Lazy
@Autowired
private IXpOrderEvaluateService xpOrderEvaluateService;
@@ -189,6 +199,7 @@
@Autowired
private IXpTestOrderService xpTestOrderService;
private final XpMapClient xpMapClient;
+ private final MinistryOfTransportOrderReporter ministryOfTransportOrderReporter;
@Resource
private XpRoutePlanClient xpRoutePlanClient;
@Resource
@@ -224,6 +235,9 @@
@Resource
private XpFrdXfipEventClient xpFrdXfipEventClient;
+
+ @Resource
+ private XpTargetedServiceClient targetedServiceClient;
@Value("${robotaxi.appId:xp_robotaxi_api}")
private String appid;
@@ -516,7 +530,6 @@
if (Objects.nonNull(query.getEndTime())) {
wrapper.le(XpOrder::getCreateTime, LocalDateTime.of(query.getEndTime(), LocalTime.MAX));
}
- wrapper.orderByDesc(XpOrder::getCreateTime);
return wrapper;
}
@@ -701,7 +714,9 @@
* 取消订单
*/
private void cancelOrder(XpOrder order) {
- redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
+ if(StringUtils.isNotEmpty(order.getQueueName())){
+ redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
+ }
Long userId = order.getAppUserId();
Integer status = order.getStatus();
@@ -861,6 +876,7 @@
// 下发命令
PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setEndTaskId(order.getStatus() < 6 ? order.getXpuStartTaskId() : order.getXpuEndTaskId());
pushOrderDto.setOrderId(order.getId().toString());
pushOrderDto.setVin(xpVehicle.getVehicleVin());
pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
@@ -1011,6 +1027,17 @@
}
if (order.getOfficialPartnerId() == null) {
+ //给车端发送取消靠边停车的报文
+ PushOrderDto cancelDto = new PushOrderDto();
+ cancelDto.setStartTaskId(order.getXpuStartTaskId());
+ cancelDto.setEndTaskId(order.getXpuEndTaskId());
+ cancelDto.setOrderId(order.getId().toString());
+ cancelDto.setVin(vin);
+ cancelDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
+ cancelDto.setCancelScene(CancelOrderSceneEnum.REASSIGN_OLD_VEHICLE.getCode());
+ orderMissionClient.cancelOrder(cancelDto);
+
+
//创建定时任务执行延迟驶离终点和下发巡游单
XpPoint point = xpPointClient.queryById(order.getEndPointId()).getData();
Integer parkingTimeLimit = point.getParkingTimeLimit();
@@ -1352,7 +1379,11 @@
returnOrder.setOrderReverse(lastCruise.getOrderReverse());
log.info("巡游订单状态为{},默认返回原出发点", lastCruise.getStatus());
}
-
+ R<XpCruiseOrder> orderR = xpCruisePlanClient.findReturnCruisePoint(returnOrder);
+ if(null != orderR && 200 != orderR.getCode()){
+ log.error(orderR.getMsg());
+ return;
+ }
xpCruiseOrderMapper.insert(returnOrder);
// 下发巡游订单到原车辆
@@ -1880,7 +1911,9 @@
throw new ServiceException("订单状态错误", I18nKeyConstant.ORDER_STATUS_ERROR);
}
try {
- redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
+ if(StringUtils.isNotEmpty(order.getQueueName())){
+ redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
+ }
} catch (Exception e) {
e.printStackTrace();
}
@@ -1973,6 +2006,39 @@
e.printStackTrace();
}
+ //判断是否有连环单
+ String json = redisService.getCacheObject(CacheConstants.nextOrder(order.getId().toString()));
+ if (StringUtils.isNotEmpty(json)) {
+ JSONObject jsonObject = JSON.parseObject(json);
+ Long id = jsonObject.getLong("orderId");
+ //判断订单状态
+ XpOrder xpOrder1 = this.getById(id);
+ if (2 == xpOrder1.getStatus()) {
+ //开始推送订单给车端
+ // 下发命令
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setStartTaskId(xpOrder1.getXpuStartTaskId());
+ pushOrderDto.setEndTaskId(xpOrder1.getXpuEndTaskId());
+ pushOrderDto.setVin(vin);
+ pushOrderDto.setOrderId(xpOrder1.getId().toString());
+ pushOrderDto.setStartWaypointId(xpOrder1.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder1.getEndPointId());
+ pushOrderDto.setStartLatitude(xpOrder1.getStartLat());
+ pushOrderDto.setStartLongitude(xpOrder1.getStartLon());
+ pushOrderDto.setEndLatitude(xpOrder1.getEndLat());
+ pushOrderDto.setEndLongitude(xpOrder1.getEndLon());
+ pushOrderDto.setEndPoiName(xpOrder1.getEndPointName());
+ pushOrderDto.setOrderType(OrderType.USER_ORDER);
+ pushOrderDto.setStage(1);
+ pushOrderDto.setLastOrderId(order.getId().toString());
+ pushOrderDto.setLastXpuTaskId(status == 1 ? order.getXpuStartTaskId() : order.getXpuEndTaskId());
+ pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
+ // 调用推送服务 orderId + carVin
+ orderMissionClient.pushOrder(pushOrderDto);
+ log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder1.getOrderNumber(), xpOrder1.getOrderNumber());
+ return;
+ }
+ }
//车辆继续巡游
addCruiseMission(order, status);
}
@@ -2027,7 +2093,9 @@
xpOrderCancel.setCreateTime(LocalDateTime.now());
xpOrderCancelService.save(xpOrderCancel);
- redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
+ if(StringUtils.isNotEmpty(order.getQueueName())){
+ redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
+ }
// 消息推送
Map<String, Object> params = new HashMap<>();
@@ -2555,7 +2623,7 @@
log.info("计算价格-保存费用明细 {} {}", orderId, JSON.toJSONString(xpOrderDetails));
// 默认费率1
- double priceRate = 1;
+ double priceRate = 100;
if (pricing.getIsDynamicPrice() == 1) {
// 先判断是否已经调价过了
Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid);
@@ -2563,60 +2631,55 @@
// 是否调价过了
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
} else {
- //是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId());
- if (dynamicPriceObj != null) {
- JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
- // 触发动态调价
- // value=时间
- String timeStr = dynamicPriceObj.toString();
- // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
- Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId()));
- // X单上升一次调价
- Integer orderNum = getOrderNum(jsonObject, 4);
- // 需要调价的次数
- int count = num / orderNum;
- if (count > 0) {
- // 计算每次上升的费率
- Integer upRate = getOrderNum(jsonObject, 5);
- BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
- for (int i = count; i > 0; i--) {
- // 当前费率+(费率*上升百分比)
- priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- }
- if(priceRate > 1){
- // 冷却时间
- Integer time = getOrderNum(jsonObject, 6);
- // 触发调价了
- redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
- }
+ JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
+ Integer num1 = jsonObject.getInteger("num1");
+ String timeStr = LocalDateTime.now().minusMinutes(num1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+ Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId()));
+ // X单上升一次调价
+ Integer orderNum = getOrderNum(jsonObject, 4);
+ // 需要调价的次数
+ int count = num / orderNum;
+ if (count > 0) {
+ // 计算每次上升的费率
+ Integer upRate = getOrderNum(jsonObject, 5);
+ BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+ for (int i = count; i > 0; i--) {
+ // 当前费率+(费率*上升百分比)
+ priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
+ }
+ if(priceRate > 1){
+ // 冷却时间
+ Integer time = getOrderNum(jsonObject, 6);
+ // 触发调价了
+ redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
}
}
}
+ log.info("供需后的费率 {}", priceRate);
//是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId());
- if (dynamicPriceObj != null) {
- JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
- // 天气预报动态调价
- JSONArray ws = jsonObject.getJSONArray("weatherRules");
- if (null != ws) {
- WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
- List<WeatherDTO.Lives> lives = data.getLives();
- if (lives != null && !lives.isEmpty()) {
- String w = lives.get(0).getWeather();
- for (Object o : ws) {
- JSONObject ele = JSONObject.parseObject(o.toString());
- if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
- double floatRate = ele.getDouble("ratio");
- priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
- break;
- }
+ JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
+ // 天气预报动态调价
+ JSONArray ws = jsonObject.getJSONArray("weatherRules");
+ if (null != ws) {
+ WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
+ List<WeatherDTO.Lives> lives = data.getLives();
+ if (lives != null && !lives.isEmpty()) {
+ String w = lives.get(0).getWeather();
+ for (Object o : ws) {
+ JSONObject ele = JSONObject.parseObject(o.toString());
+ if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+ double floatRate = ele.getDouble("ratio");
+ priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
+ break;
}
}
}
}
}
+ priceRate = new BigDecimal(priceRate).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+ log.info("浮动费率 {}", priceRate);
log.info("计算价格-计算费率 {} {}", orderId, priceRate);
order.setOrderMoney(totalPrice.multiply(new BigDecimal(priceRate)));
order.setAppUserId(null);
@@ -2684,7 +2747,7 @@
log.info("应付总额: " + totalAmount + " 元");
BigDecimal startMoney = BigDecimal.ZERO;
// 默认费率1
- double priceRate = 1;
+ double priceRate = 100;
if (pricing.getIsDynamicPrice() == 1) {
// 先判断是否已经调价过了
Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid);
@@ -2692,60 +2755,55 @@
// 是否调价过了
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
} else {
- //是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId());
- if (dynamicPriceObj != null) {
- JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
- // 触发动态调价
- // value=时间
- String timeStr = dynamicPriceObj.toString();
- // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
- Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId()));
- // X单上升一次调价
- Integer orderNum = getOrderNum(jsonObject, 4);
- // 需要调价的次数
- int count = num / orderNum;
- if (count > 0) {
- // 计算每次上升的费率
- Integer upRate = getOrderNum(jsonObject, 5);
- BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
- for (int i = count; i > 0; i--) {
- // 当前费率+(费率*上升百分比)
- priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- }
- if(priceRate > 1){
- // 冷却时间
- Integer time = getOrderNum(jsonObject, 6);
- // 触发调价了
- redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
- }
+ JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
+ Integer num1 = jsonObject.getInteger("num1");
+ String timeStr = LocalDateTime.now().minusMinutes(num1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+ Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId()));
+ // X单上升一次调价
+ Integer orderNum = getOrderNum(jsonObject, 4);
+ // 需要调价的次数
+ int count = num / orderNum;
+ if (count > 0) {
+ // 计算每次上升的费率
+ Integer upRate = getOrderNum(jsonObject, 5);
+ BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+ for (int i = count; i > 0; i--) {
+ // 当前费率+(费率*上升百分比)
+ priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
+ }
+ if(priceRate > 1){
+ // 冷却时间
+ Integer time = getOrderNum(jsonObject, 6);
+ // 触发调价了
+ redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
}
}
}
+ log.info("供需后的费率 {}", priceRate);
//是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId());
- if (dynamicPriceObj != null) {
- JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
- // 天气预报动态调价
- JSONArray ws = jsonObject.getJSONArray("weatherRules");
- if (null != ws) {
- WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
- List<WeatherDTO.Lives> lives = data.getLives();
- if (lives != null && !lives.isEmpty()) {
- String w = lives.get(0).getWeather();
- for (Object o : ws) {
- JSONObject ele = JSONObject.parseObject(o.toString());
- if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
- double floatRate = ele.getDouble("ratio");
- priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
- break;
- }
+ JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
+ // 天气预报动态调价
+ JSONArray ws = jsonObject.getJSONArray("weatherRules");
+ if (null != ws) {
+ WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
+ List<WeatherDTO.Lives> lives = data.getLives();
+ if (lives != null && !lives.isEmpty()) {
+ String w = lives.get(0).getWeather();
+ for (Object o : ws) {
+ JSONObject ele = JSONObject.parseObject(o.toString());
+ if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+ double floatRate = ele.getDouble("ratio");
+ priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
+ break;
}
}
}
}
}
+ priceRate = new BigDecimal(priceRate).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+ log.info("浮动费率 {}", priceRate);
log.info("计算价格-计算费率 {} {}", orderId, priceRate);
// 封装费用明细数据
for (Map.Entry<String, BigDecimal> stringBigDecimalEntry : bill.entrySet()) {
@@ -2965,8 +3023,23 @@
// 判断是否有计划
R<XpCruisePlanVehicle> xpCruisePlanR = xpCruisePlanClient.getCruisePlan(vehicle.getId());
if (xpCruisePlanR == null || xpCruisePlanR.getData() == null) {
- log.info("添加巡游单失败,没有符合条件的巡游计划", vehicle.getPlateNumber());
- return;
+ log.info("未找到匹配的巡游计划,无法执行巡游订单 {}", vehicle.getPlateNumber());
+ //没有巡游计划,判断是否在定向服务里面
+ List<XpTargetedServiceVehicle> data = targetedServiceClient.getAllTargetedServiceVehicleByCityCode(order.getCityCode()).getData();
+ if(data.isEmpty()){
+ log.info("给车端发送取消行程报文 {}", vehicle.getPlateNumber());
+
+ PushOrderDto cancelDto = new PushOrderDto();
+ cancelDto.setStartTaskId(order.getXpuStartTaskId());
+ cancelDto.setEndTaskId(order.getXpuEndTaskId());
+ cancelDto.setOrderId(order.getId().toString());
+ String vin1 = SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin());
+ cancelDto.setVin(vin1);
+ cancelDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
+ cancelDto.setCancelScene(CancelOrderSceneEnum.REASSIGN_OLD_VEHICLE.getCode());
+ orderMissionClient.cancelOrder(cancelDto);
+ return;
+ }
}
// 获取配置 根据配置判断是否该收车 如果是则找到收车点位进行收车操作
R<XpTaskRule> xpTaskRuleR = xpTaskRuleClient.queryDetail();
@@ -3013,11 +3086,14 @@
xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId());
xpCruiseOrder.setMissionId(xpCruiseOrders.getMissionId());
}
+ // 先找计划
+ R<List<XpCruisePlanPoint>> pointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId());
+ if(200 != pointList.getCode()){
+ return;
+ }
//所有没有赋值终点点位的情况,全部导航到巡游计划的第一个点位开始执行巡游任务
if (null == xpCruiseOrder.getEndPointId()) {
- // 先找计划
- List<XpCruisePlanPoint> planPointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId()).getData();
- XpCruisePlanPoint xpCruisePlanPoint = planPointList.get(0);
+ XpCruisePlanPoint xpCruisePlanPoint = pointList.getData().get(0);
Long endPointId = xpCruisePlanPoint.getPointId();
XpPoint endPoint = xpPointClient.queryById(endPointId).getData();
xpCruiseOrder.setEndPointId(endPointId);
@@ -3040,11 +3116,69 @@
xpVehicleClient.updateVehicleById(vehicle1);
//找到车辆的收车点位 更新终点点位
R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder);
- if (200 != returnCruisePoint.getCode()) {
+ if (200 == returnCruisePoint.getCode()) {
xpCruiseOrder = returnCruisePoint.getData();
xpCruiseOrder.setOrderType(2);
xpCruiseOrder.setOrderReverse(1);
}
+ }
+ }else{
+ //获取巡游导航数据,如果无法获取到有效的导航,则继续用下一个点位作为终点
+ LonLatDto destination = new LonLatDto();
+ LonLatDto origin = new LonLatDto();
+ boolean ROUTE_FLAG = false;
+ boolean start = false;
+ if(xpCruiseOrder.getOrderReverse() == 1){
+ for (XpCruisePlanPoint xpCruisePlanPoint1 : pointList.getData()) {
+ if (start || xpCruisePlanPoint1.getPointId().equals(xpCruiseOrder.getEndPointId())) {
+ start = true;
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = xpPointClient.queryById(xpCruisePlanPoint1.getPointId()).getData();
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + xpCruiseOrder.getVehicleId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }else{
+ for (int i = pointList.getData().size() - 1; i >= 0; i--) {
+ XpCruisePlanPoint xpCruisePlanPoint1 = pointList.getData().get(i);
+ if(start || xpCruisePlanPoint1.getPointId().equals(xpCruiseOrder.getEndPointId())){
+ start = true;
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = xpPointClient.queryById(xpCruisePlanPoint1.getPointId()).getData();
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + xpCruiseOrder.getVehicleId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }
+ if(!ROUTE_FLAG){
+ log.info("巡游计划获取导航信息失败 {}", JSON.toJSONString(vehicle));
+ return;
}
}
xpCruiseOrderMapper.insert(xpCruiseOrder);
@@ -3084,18 +3218,22 @@
R<XpCruisePlanVehicle> xpCruisePlanR = xpCruisePlanClient.getCruisePlan(vehicle.getId());
if (xpCruisePlanR == null || xpCruisePlanR.getData() == null) {
log.info("未找到匹配的巡游计划,无法执行巡游订单 {}", vehicle.getPlateNumber());
- log.info("给车端发送取消行程报文 {}", vehicle.getPlateNumber());
+ //没有巡游计划,判断是否在定向服务里面
+ List<XpTargetedServiceVehicle> data = targetedServiceClient.getAllTargetedServiceVehicleByCityCode(order.getCityCode()).getData();
+ if(data.isEmpty()){
+ log.info("给车端发送取消行程报文 {}", vehicle.getPlateNumber());
- PushOrderDto cancelDto = new PushOrderDto();
- cancelDto.setStartTaskId(order.getXpuStartTaskId());
- cancelDto.setEndTaskId(order.getXpuEndTaskId());
- cancelDto.setOrderId(order.getId().toString());
- String vin1 = SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin());
- cancelDto.setVin(vin1);
- cancelDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
- cancelDto.setCancelScene(CancelOrderSceneEnum.REASSIGN_OLD_VEHICLE.getCode());
- orderMissionClient.cancelOrder(cancelDto);
- return;
+ PushOrderDto cancelDto = new PushOrderDto();
+ cancelDto.setStartTaskId(order.getXpuStartTaskId());
+ cancelDto.setEndTaskId(order.getXpuEndTaskId());
+ cancelDto.setOrderId(order.getId().toString());
+ String vin1 = SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin());
+ cancelDto.setVin(vin1);
+ cancelDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
+ cancelDto.setCancelScene(CancelOrderSceneEnum.REASSIGN_OLD_VEHICLE.getCode());
+ orderMissionClient.cancelOrder(cancelDto);
+ return;
+ }
}
String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin());
VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
@@ -3144,10 +3282,14 @@
xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId());
xpCruiseOrder.setMissionId(xpCruiseOrders.getMissionId());
}
+ // 先找计划
+ R<List<XpCruisePlanPoint>> pointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId());
+ if(200 != pointList.getCode()){
+ return;
+ }
//所有没有赋值终点点位的情况,全部导航到巡游计划的第一个点位开始执行巡游任务
if (null == xpCruiseOrder.getEndPointId()) {
- // 先找计划
- List<XpCruisePlanPoint> planPointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId()).getData();
+ List<XpCruisePlanPoint> planPointList = pointList.getData();
XpCruisePlanPoint xpCruisePlanPoint = planPointList.get(0);
Long endPointId = xpCruisePlanPoint.getPointId();
XpPoint endPoint = xpPointClient.queryById(endPointId).getData();
@@ -3178,6 +3320,64 @@
xpCruiseOrder.setOrderType(2);
xpCruiseOrder.setOrderReverse(1);
}
+ }
+ }else{
+ //获取巡游导航数据,如果无法获取到有效的导航,则继续用下一个点位作为终点
+ LonLatDto destination = new LonLatDto();
+ LonLatDto origin = new LonLatDto();
+ boolean ROUTE_FLAG = false;
+ boolean start = false;
+ if(xpCruiseOrder.getOrderReverse() == 1){
+ for (XpCruisePlanPoint xpCruisePlanPoint1 : pointList.getData()) {
+ if (start || xpCruisePlanPoint1.getPointId().equals(xpCruiseOrder.getEndPointId())) {
+ start = true;
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = xpPointClient.queryById(xpCruisePlanPoint1.getPointId()).getData();
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + xpCruiseOrder.getVehicleId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }else{
+ for (int i = pointList.getData().size() - 1; i >= 0; i--) {
+ XpCruisePlanPoint xpCruisePlanPoint1 = pointList.getData().get(i);
+ if(start || xpCruisePlanPoint1.getPointId().equals(xpCruiseOrder.getEndPointId())){
+ start = true;
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ XpPoint xpPoint1 = xpPointClient.queryById(xpCruisePlanPoint1.getPointId()).getData();
+ destination.setLongitude(xpPoint1.getPointLon());
+ destination.setLatitude(xpPoint1.getPointLat());
+ OrderRouteAndFareDto dto1 = new OrderRouteAndFareDto();
+ dto1.setOrigin(origin);
+ dto1.setDestination(destination);
+ dto1.setRouteType(3);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto1);
+ if (200 != routeVoR.getCode()) {
+ continue;
+ }
+ RouteVo routeVo = routeVoR.getData();
+ redisService.setCacheObject("CRUISE_ROUTE:" + xpCruiseOrder.getVehicleId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.DAYS);
+ ROUTE_FLAG = true;
+ break;
+ }
+ }
+ }
+ if(!ROUTE_FLAG){
+ log.info("巡游计划获取导航信息失败 {}", JSON.toJSONString(vehicle));
+ return;
}
}
@@ -3502,7 +3702,7 @@
// creditOrderCreateDto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
// creditOrderCreateDto.setSubject("小鹏集团|robotaxi");
// creditOrderCreateDto.setPayType("13");
- // TODO 需要根据环境补充路径
+ // TODO 需要根据环境补充路径
// creditOrderCreateDto.setPayCallbackUrl("");
//
// creditOrderCreateDto.setBusinessExtendData("{\"mainOrderId\":\"" +order.getOrderNumber() + "\"}");
@@ -3604,6 +3804,7 @@
if (insert <= 0) {
return false;
}
+// pushOrderCreateToMinistry(xpOrder, "新增订单");
return true;
}
@@ -3876,7 +4077,9 @@
// Redis弹出这个队列元素
// value 订单Id_经纬度_状态_用户id_订单编号_距离_时间
try {
- redisService.popFirstElement(order.getQueueName());
+ if(StringUtils.isNotEmpty(order.getQueueName())){
+ redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
+ }
} catch (Exception e) {
log.error("Redis弹出队列元素出错");
}
@@ -3895,6 +4098,9 @@
this.updateById(order);
order.setAppUserId(appUserId);
bootCommonService.setCache_orderStatus(order.getId(), order, null);
+ if (vehicle != null) {
+// pushOrderMatchToMinistry(order, vehicle, appUserId, order.getAcceptanceTime(), "推单成功");
+ }
//构建推送消息
Map<String, Object> params = new HashMap<>();
@@ -4550,6 +4756,8 @@
if (xpOrder.getStatus() >= 8) {
return R.fail("订单已结束,无法修改");
}
+ XpVehicle matchedVehicle = null;
+ LocalDateTime distributeTime = null;
switch (vo.getOrderStatus()) {
case 2:
@@ -4566,13 +4774,17 @@
if (null == xpVehicle) {
return R.fail("车牌号不存在");
}
+ matchedVehicle = xpVehicle;
xpOrder.setOfficialPartnerId(officialPartnerId);
xpOrder.setVehicleId(xpVehicle.getId());
xpOrder.setAcceptanceTime(vo.getAcceptanceTime());
+ distributeTime = vo.getAcceptanceTime();
redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.READY_DEPART.getCode(), 24L, TimeUnit.HOURS);
//将订单弹出队列
try {
- redisService.popFirstElement(xpOrder.getQueueName());
+ if(StringUtils.isNotEmpty(xpOrder.getQueueName())){
+ redisService.removeByPattern(xpOrder.getQueueName(), xpOrder.getOrderNumber());
+ }
} catch (Exception e) {
log.error("Redis弹出队列元素出错");
}
@@ -4856,6 +5068,9 @@
}
xpOrder.setStatus(vo.getOrderStatus());
this.updateById(xpOrder);
+ if (vo.getOrderStatus() == 2 && matchedVehicle != null) {
+// pushOrderMatchToMinistry(xpOrder, matchedVehicle, xpOrder.getAppUserId(), distributeTime, "合作商接单成功");
+ }
//推送订单状态给乘客端
Map<String, Object> params = new HashMap<>();
Map<String, Object> content = new HashMap<>();
@@ -4891,6 +5106,185 @@
return R.ok();
+ }
+
+ private void pushOrderCreateToMinistry(XpOrder order, String scene) {
+ if (order == null) {
+ return;
+ }
+ try {
+ RegulationOrderCreateInfoDTO dto = buildOrderCreateInfoForMinistry(order);
+ String response = ministryOfTransportOrderReporter.pushOrderCreateInfo(dto);
+ log.info("{}后上报交通部DDFQ完成, orderId={}, orderNo={}, response={}",
+ scene, order.getId(), order.getOrderNumber(), response);
+ } catch (Exception e) {
+ log.error("{}后上报交通部DDFQ失败, orderId={}, orderNo={}",
+ scene, order.getId(), order.getOrderNumber(), e);
+ }
+ }
+
+ private void pushOrderMatchToMinistry(XpOrder order, XpVehicle vehicle, Long appUserId, LocalDateTime distributeTime, String scene) {
+ if (order == null || vehicle == null) {
+ return;
+ }
+ try {
+ RegulationOrderMatchInfoDTO dto = buildOrderMatchInfoForMinistry(order, vehicle, appUserId, distributeTime);
+ String response = ministryOfTransportOrderReporter.pushOrderMatchInfo(dto);
+ log.info("{}后上报交通部DDCG完成, orderId={}, orderNo={}, vehicleId={}, response={}",
+ scene, order.getId(), order.getOrderNumber(), vehicle.getId(), response);
+ } catch (Exception e) {
+ log.error("{}后上报交通部DDCG失败, orderId={}, orderNo={}, vehicleId={}",
+ scene, order.getId(), order.getOrderNumber(), vehicle.getId(), e);
+ }
+ }
+
+ private RegulationOrderCreateInfoDTO buildOrderCreateInfoForMinistry(XpOrder order) {
+ XpAppUser appUser = queryAppUser(order.getAppUserId());
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime orderTime = defaultIfNull(order.getCreateTime(), now);
+ LocalDateTime departTime = order.getEstimatedTime() != null
+ ? order.getEstimatedTime()
+ : defaultIfNull(order.getRideTime(), orderTime);
+
+ RegulationOrderCreateInfoDTO dto = new RegulationOrderCreateInfoDTO();
+ dto.setCompanyId(ministryTransportProperties.getCompanyId());
+ dto.setAddress(ministryTransportProperties.getAddressCode());
+ dto.setOrderId(defaultIfBlank(order.getOrderNumber(), String.valueOf(order.getId())));
+ dto.setDepartTime(formatTransportTime(departTime));
+ dto.setOrderTime(formatTransportTime(orderTime));
+ dto.setPassengerPhone(appUser == null ? "" : defaultIfBlank(appUser.getPhoneNumber(), ""));
+ dto.setPassengerNote("");
+ dto.setDeparture(defaultIfBlank(order.getStartAddress(), ""));
+ dto.setDepLongitude(formatCoordinate(order.getStartLon()));
+ dto.setDepLatitude(formatCoordinate(order.getStartLat()));
+ dto.setDestination(defaultIfBlank(order.getEndAddress(), ""));
+ dto.setDestLongitude(formatCoordinate(order.getEndLon()));
+ dto.setDestLatitude(formatCoordinate(order.getEndLat()));
+ dto.setEncrypt("1");
+ dto.setFareType(ministryTransportProperties.getFareType());
+ dto.setOrderSource("0");
+ dto.setPsgName(appUser == null ? "乘客" : defaultIfBlank(appUser.getNickName(), "乘客"));
+ dto.setPsgGender(mapPassengerGender(appUser == null ? null : appUser.getGender()));
+ dto.setPsgTotal("1");
+ dto.setIsReserve(order.getEstimatedTime() != null ? "1" : "0");
+ dto.setPreMile(formatDecimal(order.getMileageKilometers(), 0));
+ dto.setPreTime(formatDecimal(order.getDuration(), 0));
+ dto.setPreFare(formatAmount(order.getOrderMoney()));
+ dto.setDepartCity(defaultIfBlank(order.getCityCode(), ministryTransportProperties.getDepartCityDefault()));
+ dto.setDestCity(defaultIfBlank(order.getCityCode(), ministryTransportProperties.getDestCityDefault()));
+ dto.setIsFromThirdPlatform("0");
+ dto.setProtocolVersion(ministryTransportProperties.getProtocolVersion());
+ return dto;
+ }
+
+ private RegulationOrderMatchInfoDTO buildOrderMatchInfoForMinistry(XpOrder order, XpVehicle vehicle, Long appUserId, LocalDateTime distributeTime) {
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin());
+ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+ GeoJsonPoint point = vehiclePosition == null ? null : vehiclePosition.getPoint();
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime orderTime = defaultIfNull(order.getCreateTime(), now);
+ LocalDateTime actualDistributeTime = defaultIfNull(distributeTime, defaultIfNull(order.getAcceptanceTime(), now));
+
+ RegulationOrderMatchInfoDTO dto = new RegulationOrderMatchInfoDTO();
+ dto.setCompanyId(ministryTransportProperties.getCompanyId());
+ dto.setAddress(ministryTransportProperties.getAddressCode());
+ dto.setOrderId(defaultIfBlank(order.getOrderNumber(), String.valueOf(order.getId())));
+ dto.setLongitude(formatCoordinate(point == null ? order.getStartLon() : point.getX()));
+ dto.setLatitude(formatCoordinate(point == null ? order.getStartLat() : point.getY()));
+ dto.setEncrypt("1");
+ dto.setLicenseId(ministryTransportProperties.getDriverLicenseId());
+ dto.setDriverPhone(ministryTransportProperties.getDriverPhone());
+ dto.setVehicleNo(defaultIfBlank(vehicle.getPlateNumber(), ""));
+ dto.setPlateColor(getPlateColor(vehicle.getPlateNumber()));
+ dto.setDistributeTime(formatTransportTime(actualDistributeTime));
+ dto.setOrderTime(formatTransportTime(orderTime));
+ dto.setCarCertNo(ministryTransportProperties.getVehicleCertNo());
+ dto.setDriverName(ministryTransportProperties.getDriverName());
+ dto.setIdNo(ministryTransportProperties.getDriverIdNo());
+ dto.setDriCertNo(ministryTransportProperties.getDriverCertNo());
+ dto.setDepartCity(defaultIfBlank(order.getCityCode(), ministryTransportProperties.getDepartCityDefault()));
+ dto.setDestCity(defaultIfBlank(order.getCityCode(), ministryTransportProperties.getDestCityDefault()));
+ dto.setDepartLocale(defaultIfBlank(order.getStartAddress(), ""));
+ dto.setDepartLocaleDetail(defaultIfBlank(order.getStartAddress(), ""));
+ dto.setDepartLon(formatCoordinate(order.getStartLon()));
+ dto.setDepartLat(formatCoordinate(order.getStartLat()));
+ dto.setDesLocale(defaultIfBlank(order.getEndAddress(), ""));
+ dto.setDesLocaleDetail(defaultIfBlank(order.getEndAddress(), ""));
+ dto.setDesLon(formatCoordinate(order.getEndLon()));
+ dto.setDesLat(formatCoordinate(order.getEndLat()));
+ dto.setLatestDestTime(formatTransportTime(actualDistributeTime.minusMinutes(30)));
+ dto.setIsFromThirdPlatform("0");
+ dto.setProtocolVersion(ministryTransportProperties.getProtocolVersion());
+ return dto;
+ }
+
+ private XpAppUser queryAppUser(Long appUserId) {
+ if (appUserId == null) {
+ return null;
+ }
+ try {
+ R<XpAppUser> result = xpAppUserClient.queryOperationsUserById(appUserId);
+ return result == null ? null : result.getData();
+ } catch (Exception e) {
+ log.warn("查询乘客信息失败, appUserId={}", appUserId, e);
+ return null;
+ }
+ }
+
+ private LocalDateTime defaultIfNull(LocalDateTime value, LocalDateTime defaultValue) {
+ return value == null ? defaultValue : value;
+ }
+
+ private String defaultIfBlank(String value, String defaultValue) {
+ return StringUtils.isBlank(value) ? defaultValue : value;
+ }
+
+ private String formatTransportTime(LocalDateTime time) {
+ return time == null ? null : time.format(MinistryOfTransportOrderReporter.DATA_TIME_FORMATTER);
+ }
+
+ private String formatCoordinate(Double value) {
+ if (value == null) {
+ return "0";
+ }
+ return BigDecimal.valueOf(value)
+ .multiply(BigDecimal.valueOf(1_000_000L))
+ .setScale(0, RoundingMode.HALF_UP)
+ .toPlainString();
+ }
+
+ private String formatDecimal(Number value, int scale) {
+ if (value == null) {
+ return "0";
+ }
+ return BigDecimal.valueOf(value.doubleValue())
+ .setScale(scale, RoundingMode.HALF_UP)
+ .toPlainString();
+ }
+
+ private String formatAmount(BigDecimal value) {
+ if (value == null) {
+ return "0";
+ }
+ return value.stripTrailingZeros().toPlainString();
+ }
+
+ private String mapPassengerGender(Integer gender) {
+ if (Integer.valueOf(1).equals(gender)) {
+ return "1";
+ }
+ if (Integer.valueOf(2).equals(gender)) {
+ return "2";
+ }
+ return "0";
+ }
+
+ private String getPlateColor(String plateNumber) {
+ if (StringUtils.isBlank(plateNumber)) {
+ return "蓝色";
+ }
+ String plateWithoutProvince = plateNumber.substring(1);
+ return plateWithoutProvince.length() == 7 ? "渐变绿" : "蓝色";
}
@Override
@@ -5127,6 +5521,27 @@
updateById(order);
}
+ @Override
+ public CreditPayCallVo creditPaySuccessCall(CreditPaySuccessCallDto dto) {
+ LambdaQueryWrapper<XpOrder> wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(XpOrder::getAuthOrderId, dto.getAuthOrderId());
+ XpOrder order = this.getOne(wrapper.last("LIMIT 1"));
+ if(dto.getPayStatus()==1){
+ order.setStatus(9);
+ order.setAppUserId(null);
+ this.updateById(order);
+ CreditPayCallVo vo = new CreditPayCallVo();
+ vo.setRetCode("0");
+ vo.setRetMsg("成功");
+
+ // 对接财务
+ this.xpFrdXfipEventPush(order,dto.getPayFee(),dto.getOrderId());
+
+ return vo;
+ }
+ return null;
+ }
+
/**
* 发票列表
@@ -5162,9 +5577,6 @@
ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size());
- R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList()));
- List<XpVehicle> vehicleList = r.getData();
-
// 数据组装
for (XpOrder xpOrder : list) {
XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
@@ -5187,7 +5599,9 @@
goodsDetail.setItemId(xpOrder.getOrderNumber());
goodsDetail.setCouponAmount(xpOrder.getCouponMoney());
goodsDetail.setCompanyCode("8000");
- xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetail));
+ JSONArray goodsDetailArray = new JSONArray();
+ goodsDetailArray.add(goodsDetail);
+ xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetailArray));
xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney()!=null?xpOrder.getOrderMoney():BigDecimal.ZERO);
xpInvoiceVo.setOrderBusAmount(xpOrder.getOrderMoney()!=null?xpOrder.getOrderMoney():BigDecimal.ZERO);
@@ -5220,6 +5634,16 @@
itinerary.setEndPoint(xpOrder.getEndAddress());
itinerary.setMileage(xpOrder.getMileageKilometers()!=null ? xpOrder.getMileageKilometers().toString() :"0");
+ UcUserInfo user = userResourcesClient.getBaseUserByUid(xpOrder.getAppUserId().toString());
+ itinerary.setUserName(user.getNickName());
+ itinerary.setUserAccount(user.getUid().toString());
+ itinerary.setPhone(user.getMobile());
+ itinerary.setPickupTime(xpOrder.getBoardingTime()!=null?xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):"");
+ itinerary.setDropOffTime(xpOrder.getTripEnd()!=null?xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):"");
+ itinerary.setOldPrice(xpOrder.getOrderMoney()!=null?xpOrder.getOrderMoney().toString():"0");
+ itinerary.setCurrency("CNY");
+
+
xpInvoiceVo.setItinerary(itinerary);
xpInvoiceVoList.add(xpInvoiceVo);
}
@@ -5246,9 +5670,6 @@
ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size());
- R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList()));
- List<XpVehicle> vehicleList = r.getData();
-
// 数据组装
for (XpOrder xpOrder : list) {
XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
@@ -5271,13 +5692,18 @@
goodsDetail.setItemId(xpOrder.getOrderNumber());
goodsDetail.setCouponAmount(xpOrder.getCouponMoney());
goodsDetail.setCompanyCode("8000");
- xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetail));
+ JSONArray goodsDetailArray = new JSONArray();
+ goodsDetailArray.add(goodsDetail);
+ xpInvoiceVo.setGoodsDetail(JSON.toJSONString(goodsDetailArray));
- xpInvoiceVo.setOrderTotalAmount(xpOrder.getPayMoney());
- xpInvoiceVo.setOrderBusAmount(xpOrder.getOrderMoney());
- xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
- xpInvoiceVo.setOrderFinishTime(xpOrder.getTripEnd()!=null?String.valueOf(xpOrder.getTripEnd()):"");
+ xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney()!=null?xpOrder.getOrderMoney():BigDecimal.ZERO);
+ xpInvoiceVo.setOrderBusAmount(xpOrder.getOrderMoney()!=null?xpOrder.getOrderMoney():BigDecimal.ZERO);
+
+ xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney()!=null?xpOrder.getCouponMoney():BigDecimal.ZERO);
+
+ xpInvoiceVo.setOrderFinishTime(xpOrder.getTripEnd()!=null?xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):"");
+
JSONObject extData = new JSONObject();
@@ -5302,6 +5728,16 @@
itinerary.setStartPoint(xpOrder.getStartAddress());
itinerary.setEndPoint(xpOrder.getEndAddress());
itinerary.setMileage(xpOrder.getMileageKilometers()!=null ? xpOrder.getMileageKilometers().toString() :"0");
+ UcUserInfo user = userResourcesClient.getBaseUserByUid(xpOrder.getAppUserId().toString());
+ itinerary.setUserName(user.getNickName());
+ itinerary.setUserAccount(user.getUid().toString());
+ itinerary.setPhone(user.getMobile());
+ itinerary.setPickupTime(xpOrder.getBoardingTime()!=null?xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):"");
+ itinerary.setDropOffTime(xpOrder.getTripEnd()!=null?xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):"");
+ itinerary.setOldPrice(xpOrder.getOrderMoney()!=null?xpOrder.getOrderMoney().toString():"0");
+ itinerary.setCurrency("CNY");
+
+
xpInvoiceVo.setItinerary(itinerary);
xpInvoiceVoList.add(xpInvoiceVo);
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpTestOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpTestOrderServiceImpl.java
index 0b18100..2ab8698 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpTestOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpTestOrderServiceImpl.java
@@ -229,7 +229,7 @@
xpOrder.setTestPlanId(query.getTestPlanId());
xpOrder.setOrderType(query.getOrderType());
xpOrder.setMileageKilometers(0.0);
- xpOrder.setOrderNumber("XP" + System.currentTimeMillis());
+ xpOrder.setOrderNumber(getOrderNumber());
xpOrder.setCityId(openCity.getId());
xpOrder.setPlacementLat(xpPoint.getPointLat());
xpOrder.setPlacementLon(xpPoint.getPointLon());
@@ -294,6 +294,12 @@
orderMissionClient.pushOrder(pushOrderDto);
}
}
+
+ private String getOrderNumber(){
+ int random = Double.valueOf(Math.random() * 1000).intValue();
+ return "XP" + random + System.currentTimeMillis();
+ }
+
private Boolean isInOperationTime(String operationStrategy) {
JSONArray jsonArray = JSONArray.parseArray(operationStrategy);
@@ -647,6 +653,7 @@
// 下发命令
PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setEndTaskId(order.getStatus() < 6 ? order.getXpuStartTaskId() : order.getXpuEndTaskId());
pushOrderDto.setOrderId("TEST" + order.getId().toString());
pushOrderDto.setVin(vin);
pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
@@ -689,6 +696,7 @@
//给XPU推送订单取消的报文
PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setEndTaskId(order.getStatus() < 6 ? order.getXpuStartTaskId() : order.getXpuEndTaskId());
pushOrderDto.setOrderId("TEST" + order.getId().toString());
pushOrderDto.setVin(vin);
pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
@@ -729,6 +737,7 @@
//给XPU推送订单取消的报文
PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setEndTaskId(order.getStatus() < 6 ? order.getXpuStartTaskId() : order.getXpuEndTaskId());
pushOrderDto.setOrderId("TEST" + order.getId().toString());
pushOrderDto.setVin(vin);
pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
@@ -1624,6 +1633,7 @@
XpVehicle xpVehicle = xpVehicleClient.queryById(xpTestOrder.getVehicleId()).getData();
String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setEndTaskId(xpTestOrder.getStatus() < 6 ? xpTestOrder.getXpuStartTaskId() : xpTestOrder.getXpuEndTaskId());
pushOrderDto.setVin(vin);
pushOrderDto.setOrderId("TEST" + xpTestOrder.getId());
pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/GDMapGeocodingUtil.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/GDMapGeocodingUtil.java
index 28172c0..f618699 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/GDMapGeocodingUtil.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/GDMapGeocodingUtil.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.common.core.utils.HttpUtils;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@@ -18,23 +19,17 @@
@Lazy
public class GDMapGeocodingUtil {
- private String key = "66ae577f63898dae3016d599fda57221";
+ @Value("${map.api-key}")
+ private String key;
+ @Value("${map.urls.route-price}")
+ private String routePriceUrl;
- public static void main(String[] args) {
- String url = "https://tsapi.amap.com/v1/route/price?key=" + "66ae577f63898dae3016d599fda57221" + "&extensions=all&start=" +"113.384932" + "," + "23.155455";
- HashMap<String, Object> params = new HashMap<>();
- params.put("extensions", "all");
- params.put("start", "113.384932" + "," + "23.155455");
- params.put("end", "113.388209" + "," + "23.163455");
- params.put("routeUserType",2);
- log.info("高德地图接口:{}", url);
- log.info("高德地图参数:{}", params);
- String post = HttpUtils.post(url, JSON.toJSONString(params));
- log.info("高德地图返回结果:"+ post);
- JSONObject jsonObject = JSON.parseObject(post);
- System.out.println(jsonObject);
- }
+ @Value("${map.urls.route-query}")
+ private String routeQueryUrl;
+
+ @Value("${map.urls.reverse-geocode}")
+ private String reverseGeocodeUrl;
/**
@@ -44,7 +39,7 @@
* @return
*/
public String routed(String routeID){
- String url = "https://tsapi.amap.com/v1/route/query/routeid?key=" + key;
+ String url = routeQueryUrl + "?key=" + key;
HashMap<String, Object> params = new HashMap<>();
params.put("routeID", routeID);
params.put("sdkVersion", "9.850.152.3.532");
@@ -64,7 +59,7 @@
* @throws Exception
*/
public Map<String, String> geocode(String lon, String lan) {
- String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan;
+ String url = reverseGeocodeUrl + "?key=" + key + "&location=" + lon + "," + lan;
String forObject = HttpUtils.sendGet(url);
JSONObject jsonObject = JSON.parseObject(forObject);
Map<String, String> map = new HashMap<>();
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/MinistryOfTransportOrderReporter.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/MinistryOfTransportOrderReporter.java
new file mode 100644
index 0000000..f485a67
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/MinistryOfTransportOrderReporter.java
@@ -0,0 +1,164 @@
+package com.xiaopeng.order.utils;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.xiaopeng.common.core.utils.StringUtils;
+import com.xiaopeng.common.redis.service.RedisService;
+import com.xiaopeng.order.config.MinistryTransportProperties;
+import com.xiaopeng.order.model.dto.RegulationOrderCreateInfoDTO;
+import com.xiaopeng.order.model.dto.RegulationOrderMatchInfoDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Component
+public class MinistryOfTransportOrderReporter {
+
+ public static final DateTimeFormatter DATA_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+
+ private static final DateTimeFormatter FILE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-ddHHmmssSSS");
+
+ private static final String TOKEN_CACHE_KEY = "ministry_of_transport:token";
+
+ private static final long TOKEN_EXPIRE_SECONDS = 20 * 60;
+
+ private static final long TOKEN_REFRESH_THRESHOLD_SECONDS = 5 * 60;
+
+ private final RedisService redisService;
+
+ private final MinistryTransportProperties ministryTransportProperties;
+
+ private final RestTemplate restTemplate;
+
+ public MinistryOfTransportOrderReporter(RedisService redisService,
+ MinistryTransportProperties ministryTransportProperties) {
+ this.redisService = redisService;
+ this.ministryTransportProperties = ministryTransportProperties;
+ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
+ requestFactory.setConnectTimeout(10000);
+ requestFactory.setReadTimeout(10000);
+ this.restTemplate = new RestTemplate(requestFactory);
+ }
+
+ public String pushOrderCreateInfo(RegulationOrderCreateInfoDTO item) {
+ return pushOrderInfo(item, "DDFQ");
+ }
+
+ public String pushOrderMatchInfo(RegulationOrderMatchInfoDTO item) {
+ return pushOrderInfo(item, "DDCG");
+ }
+
+ private String pushOrderInfo(Object item, String command) {
+ String token = getToken();
+ if (StringUtils.isBlank(token)) {
+ throw new RuntimeException("交通部token为空");
+ }
+ JSONObject body = new JSONObject();
+ JSONArray items = new JSONArray();
+ items.add(JSON.toJSON(item));
+ body.put("items", items);
+ String filename = ministryTransportProperties.getPlatform() + "_ORDER_" + command + "_REQ_" + LocalDateTime.now().format(FILE_TIME_FORMATTER) + ".json";
+ return uploadJsonFile(filename, body.toJSONString(), token);
+ }
+
+ private String getToken() {
+ String cachedToken = redisService.getCacheObject(TOKEN_CACHE_KEY);
+ if (StringUtils.isNotBlank(cachedToken)) {
+ Long expireTime = redisService.getExpire(TOKEN_CACHE_KEY);
+ if (expireTime != null && expireTime > TOKEN_REFRESH_THRESHOLD_SECONDS) {
+ return cachedToken;
+ }
+ }
+ JSONObject body = new JSONObject();
+ body.put("platform", ministryTransportProperties.getPlatform());
+ body.put("key", ministryTransportProperties.getKey());
+ String filename = ministryTransportProperties.getPlatform() + "_TOKEN_ACCESS_REQ_" + LocalDateTime.now().format(FILE_TIME_FORMATTER) + ".json";
+ String response = uploadJsonFile(filename, body.toJSONString(), ministryTransportProperties.getPlatform());
+ String token = parseToken(response);
+ redisService.setCacheObject(TOKEN_CACHE_KEY, token, TOKEN_EXPIRE_SECONDS, TimeUnit.SECONDS);
+ return token;
+ }
+
+ private String uploadJsonFile(String filename, String jsonBody, String auth) {
+ byte[] bytes = jsonBody.getBytes(StandardCharsets.UTF_8);
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+ headers.add("binfile-md5", md5Hex(bytes));
+ headers.add("binfile-auth", auth);
+ headers.add("binfile-gzip", "false");
+ headers.add("binfile-reqlen", String.valueOf(bytes.length));
+
+ HttpHeaders fileHeaders = new HttpHeaders();
+ fileHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ HttpEntity<ByteArrayResource> fileEntity = new HttpEntity<>(new ByteArrayResource(bytes) {
+ @Override
+ public String getFilename() {
+ return filename;
+ }
+ }, fileHeaders);
+
+ MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
+ body.add("binFile", fileEntity);
+ body.add("filename", filename);
+
+ ResponseEntity<String> response = restTemplate.postForEntity(
+ ministryTransportProperties.getUrl(),
+ new HttpEntity<>(body, headers),
+ String.class
+ );
+ String responseBody = response.getBody() == null ? "" : response.getBody();
+ log.info("交通部订单接口响应 status={}, filename={}, responseLength={}",
+ response.getStatusCodeValue(), filename, responseBody.length());
+ return responseBody;
+ }
+
+ private String parseToken(String tokenResponse) {
+ if (StringUtils.isBlank(tokenResponse)) {
+ throw new RuntimeException("交通部token响应为空");
+ }
+ JSONObject response = JSON.parseObject(tokenResponse);
+ String token = response.getString("token");
+ if (StringUtils.isNotBlank(token)) {
+ return token;
+ }
+ JSONArray items = response.getJSONArray("items");
+ if (items != null && !items.isEmpty()) {
+ token = items.getJSONObject(0).getString("token");
+ if (StringUtils.isNotBlank(token)) {
+ return token;
+ }
+ }
+ throw new RuntimeException("交通部token响应中未找到token: " + tokenResponse);
+ }
+
+ private String md5Hex(byte[] bytes) {
+ try {
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+ byte[] digest = md5.digest(bytes);
+ StringBuilder sb = new StringBuilder(digest.length * 2);
+ for (byte b : digest) {
+ sb.append(Character.forDigit((b >> 4) & 0xF, 16));
+ sb.append(Character.forDigit(b & 0xF, 16));
+ }
+ return sb.toString();
+ } catch (Exception e) {
+ throw new RuntimeException("计算交通部请求MD5失败", e);
+ }
+ }
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/XpPricingUtil.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/XpPricingUtil.java
index 2d5bdca..d94e351 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/XpPricingUtil.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/XpPricingUtil.java
@@ -2,8 +2,11 @@
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
+import com.xiaopeng.api.dto.WeatherDTO;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
+import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
+import com.xiaopeng.api.model.operation.XpOpenCity;
import com.xiaopeng.api.vo.order.XpPricingCardVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.redis.service.RedisService;
@@ -15,8 +18,11 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
+import java.util.List;
import java.util.concurrent.TimeUnit;
/**
@@ -34,6 +40,9 @@
@Autowired
private XpOrderClient xpOrderClient;
+
+ @Autowired
+ private XpMapClient xpMapClient;
/**
@@ -70,67 +79,77 @@
*/
public XpPricingCardVo calculationFixedPrice(String uid, JSONObject rule, JSONArray startingFareJson, double distance, double duration, long wait, Double waitMoney, Integer isDynamicPriceStatus, Long openCityId, String dynamicPricingJson) {
// 默认费率1
- double priceRate=1;
- if(isDynamicPriceStatus==1){
+ double priceRate = 100;
+ if (isDynamicPriceStatus == 1) {
// 先判断是否已经调价过了
Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid);
- if(userDynamicPriceObj!=null){
+ if (userDynamicPriceObj != null) {
// 是否调价过了
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
- }else {
- // 没有调过
- //是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
- if(dynamicPriceObj!=null){
- JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
- // 触发动态调价
- // value=时间
- String timeStr = dynamicPriceObj.toString();
- // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
- R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
- if(r.getCode()==200){
- int num = r.getData();
- // X单上升一次调价
- Integer orderNum = getOrderNum(jsonObject, 4);
- // 需要调价的次数
- int count = num / orderNum;
- if(count>0){
- // 计算每次上升的费率
- Integer upRate = getOrderNum(jsonObject, 5);
- BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
- for (int i = count; i > 0; i--) {
- // 当前费率+(费率*上升百分比)
- priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- }
-
- // 冷却时间
- Integer time = getOrderNum(jsonObject, 6);
- // 触发调价了
- redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
- }
+ } else {
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ Integer num1 = jsonObject.getInteger("num1");
+ String timeStr = LocalDateTime.now().minusMinutes(num1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+ Integer num = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId)).getData();
+ // X单上升一次调价
+ Integer orderNum = getOrderNum(jsonObject, 4);
+ // 需要调价的次数
+ int count = num / orderNum;
+ if (count > 0) {
+ // 计算每次上升的费率
+ Integer upRate = getOrderNum(jsonObject, 5);
+ BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+ for (int i = count; i > 0; i--) {
+ // 当前费率+(费率*上升百分比)
+ priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
-
+ if(priceRate > 1){
+ // 冷却时间
+ Integer time = getOrderNum(jsonObject, 6);
+ // 触发调价了
+ redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
+ }
}
}
+ log.info("供需后的费率 {}", priceRate);
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ // 天气预报动态调价
+ JSONArray ws = jsonObject.getJSONArray("weatherRules");
+ if (null != ws) {
+ WeatherDTO data = xpMapClient.wether(openCityId.toString()).getData();
+ List<WeatherDTO.Lives> lives = data.getLives();
+ if (lives != null && !lives.isEmpty()) {
+ String w = lives.get(0).getWeather();
+ for (Object o : ws) {
+ JSONObject ele = JSONObject.parseObject(o.toString());
+ if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+ double floatRate = ele.getDouble("ratio");
+ priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
+ break;
+ }
+ }
+ }
+ }
}
+ priceRate = new BigDecimal(priceRate).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+ log.info("浮动费率 {}", priceRate);
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
- double amount = 0;
-
double realDistance = distance;//实际公里
double realTime = duration ;//实际时间
double exceedDistance = (realDistance - rule.getDouble("num2")) < 0 ? 0 : realDistance - rule.getDouble("num2");//超出起步里程的公里
double exceedTime = (realTime - rule.getDouble("num3")) < 0 ? 0 : realTime - rule.getDouble("num3");//超过起步分钟数的时间
// 起步价
- Double startPrice = rule.getDouble("num1");
+ Double startPrice = rule.getDouble("num1") * priceRate;
// 超出公里数价格
- Double distancePrice = new BigDecimal(rule.getDouble("num4") * exceedDistance).setScale(2,RoundingMode.HALF_UP).doubleValue();
+ Double distancePrice = new BigDecimal(rule.getDouble("num4") * exceedDistance).multiply(BigDecimal.valueOf(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue();
// 超出时间价格
- Double durationPrice = new BigDecimal(rule.getDouble("num5") * exceedTime).setScale(2,RoundingMode.HALF_UP).doubleValue();
+ Double durationPrice = new BigDecimal(rule.getDouble("num5") * exceedTime).multiply(BigDecimal.valueOf(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue();
startPrice = new BigDecimal(startPrice).multiply(BigDecimal.valueOf(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
@@ -144,6 +163,8 @@
return xpPricingCardVo;
}
+
+
/**
* 计算基础价格
@@ -169,47 +190,55 @@
// 是否调价过了
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
}else {
- // 没有调过
- //是否触发动态调价 redis获取
- Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
- if(dynamicPriceObj!=null){
- JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
- // 触发动态调价
- // value=时间
- String timeStr = dynamicPriceObj.toString();
- // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
- R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
- if(r.getCode()==200){
- int num = r.getData();
- // X单上升一次调价
- Integer orderNum = getOrderNum(jsonObject, 4);
- // 需要调价的次数
- int count = num / orderNum;
- if(count>0){
- // 计算每次上升的费率
- Integer upRate = getOrderNum(jsonObject, 5);
- BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
- for (int i = count; i > 0; i--) {
- // 当前费率+(费率*上升百分比)
- priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- }
-
- // 冷却时间
- Integer time = getOrderNum(jsonObject, 6);
- // 触发调价了
- redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ Integer num1 = jsonObject.getInteger("num1");
+ String timeStr = LocalDateTime.now().minusMinutes(num1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+ R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
+ if(r.getCode()==200){
+ int num = r.getData();
+ // X单上升一次调价
+ Integer orderNum = getOrderNum(jsonObject, 4);
+ // 需要调价的次数
+ int count = num / orderNum;
+ if(count>0){
+ // 计算每次上升的费率
+ Integer upRate = getOrderNum(jsonObject, 5);
+ BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+ for (int i = count; i > 0; i--) {
+ // 当前费率+(费率*上升百分比)
+ priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
- }
+ // 冷却时间
+ Integer time = getOrderNum(jsonObject, 6);
+ // 触发调价了
+ redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
+ }
}
}
-
+ log.info("供需后的费率 {}", priceRate);
+ JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+ // 天气预报动态调价
+ JSONArray ws = jsonObject.getJSONArray("weatherRules");
+ if (null != ws) {
+ WeatherDTO data = xpMapClient.wether(openCityId.toString()).getData();
+ List<WeatherDTO.Lives> lives = data.getLives();
+ if (lives != null && !lives.isEmpty()) {
+ String w = lives.get(0).getWeather();
+ for (Object o : ws) {
+ JSONObject ele = JSONObject.parseObject(o.toString());
+ if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+ double floatRate = ele.getDouble("ratio");
+ priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
+ break;
+ }
+ }
+ }
+ }
}
-
-
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
- double amount = 0;
//等待费
Date date = new Date();
// 计算出是在那个时间段内
@@ -287,11 +316,10 @@
longDistanceThree = rule.getDouble("num34") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num29") + new BigDecimal(exceedDistance * rule.getDouble("num30")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * rule.getDouble("num31")).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num29"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num29")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
xpPricingCardVo.setTime("节假日");
@@ -302,13 +330,13 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num30")) + longDistanceOne + longDistanceTwo + longDistanceThree;
distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num31")));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * rule.getDouble("num31")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
} else {
@@ -338,11 +366,10 @@
longDistanceThree = rule.getDouble("num20") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num15") + new BigDecimal(exceedDistance * rule.getDouble("num16")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * rule.getDouble("num17")).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num15"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num15")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
xpPricingCardVo.setTime(rule.getString("num14"));
@@ -351,14 +378,13 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num16")) + longDistanceOne + longDistanceTwo + longDistanceThree;
- distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num17")));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * rule.getDouble("num17")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
} else {
@@ -410,11 +436,10 @@
longDistanceThree = rule.getDouble("num28") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num23") + new BigDecimal(exceedDistance * rule.getDouble("num24")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * rule.getDouble("num25")).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num23"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num23")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) {
xpPricingCardVo.setTime(rule.getString("num21"));
@@ -428,14 +453,13 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num24")) + longDistanceOne + longDistanceTwo + longDistanceThree;
- distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num25")));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * rule.getDouble("num25")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
} else {
//其他时间段的计算
@@ -465,11 +489,9 @@
longDistanceThree = rule.getDouble("num13") * (realDistance - rule.getDouble("num12"));
longDistanceThree = new BigDecimal(longDistanceThree).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
- amount = rule.getDouble("num1") + new BigDecimal(exceedDistance * rule.getDouble("num4")).setScale(2,RoundingMode.HALF_UP).doubleValue() + new BigDecimal(exceedTime * rule.getDouble("num5")).setScale(2,RoundingMode.HALF_UP).doubleValue() + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
-
// 起步价
- xpPricingCardVo.setStartPrice(rule.getDouble("num1"));
+ xpPricingCardVo.setStartPrice(new BigDecimal(rule.getDouble("num1")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时间段
xpPricingCardVo.setTime(rule.getString("startTime") + " - " + rule.getString("endTime"));
@@ -483,31 +505,21 @@
// 里程费
double distancePrice = (exceedDistance * rule.getDouble("num4")) + longDistanceOne + longDistanceTwo + longDistanceThree;
- distancePrice = new BigDecimal(distancePrice).setScale(2,RoundingMode.HALF_UP).doubleValue();
- xpPricingCardVo.setDistancePrice(distancePrice);
+ xpPricingCardVo.setDistancePrice(new BigDecimal(distancePrice).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
// 时长
xpPricingCardVo.setDuration(realTime);
// 时长费
- xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num5")));
+ xpPricingCardVo.setDurationPrice(new BigDecimal(exceedTime * rule.getDouble("num5")).multiply(new BigDecimal(priceRate)).setScale(2,RoundingMode.HALF_UP).doubleValue());
}
}
}
// 订单总额
- Double startPrice = xpPricingCardVo.getStartPrice();
- amount=new BigDecimal(amount).setScale(2,RoundingMode.HALF_UP).doubleValue();
- // 先减去起步价重新计算
- amount = amount - startPrice;
- // 动态计算费用
- startPrice= new BigDecimal(startPrice).multiply(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
- amount = amount+startPrice;
- xpPricingCardVo.setTotalPrice(amount);
-
-
-
+ double amount = xpPricingCardVo.getStartPrice() + xpPricingCardVo.getDistancePrice() + xpPricingCardVo.getDurationPrice();
+ xpPricingCardVo.setTotalPrice(new BigDecimal(amount).setScale(2,RoundingMode.HALF_UP).doubleValue());
return xpPricingCardVo;
}
/**
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/holiday/HolidayUtil.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/holiday/HolidayUtil.java
index 715b6b7..5f40c16 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/holiday/HolidayUtil.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/holiday/HolidayUtil.java
@@ -7,6 +7,7 @@
import com.xiaopeng.common.core.utils.HttpUtils;
import com.xiaopeng.common.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.Duration;
@@ -23,6 +24,9 @@
@Autowired
private RedisService redisService;
+ @Value("${holiday.api.url}")
+ private String holidayApiUrl;
+
public boolean isHoliday(LocalDate now) {
@@ -30,7 +34,7 @@
if (redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now) != null && ("1").equals(redisService.getCacheObject(CacheConstants.IS_HOLIDAY+now).toString())) {
return true;
}
- String result = HttpUtil.get("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtil.get(holidayApiUrl + now);
JSONObject jsonObject = JSONObject.parseObject(result);
Object data = jsonObject.get("data");
JSONArray parse = JSONArray.parse(data.toString());
@@ -57,7 +61,7 @@
if (cacheObject!=null) {
return Integer.valueOf(cacheObject.toString());
}
- String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=" +now);
+ String result = HttpUtils.sendGet(holidayApiUrl + now);
// String result = HttpUtils.sendGet("https://publicapi.xiaoai.me/holiday/day?date=2026-01-04");
JSONObject jsonObject = JSONObject.parseObject(result);
diff --git a/xp-robotaxi-order-boot/src/main/resources/application-local.yml b/xp-robotaxi-order-boot/src/main/resources/application-local.yml
index 9a4d0c2..373e80c 100644
--- a/xp-robotaxi-order-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-order-boot/src/main/resources/application-local.yml
@@ -5,7 +5,9 @@
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
token:
- secret: tttttt
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
@@ -139,6 +141,35 @@
key-generators:
snowflake:
type: SNOWFLAKE
+
+ministry:
+ transport:
+ company-id: 4401XPQCB67N
+ platform: XPQCB67N
+ key: gEhROt7lg4DEBanR
+ url: https://wycapi.jtj.gz.gov.cn/api/app/common/binapi
+ address-code: 440106
+ fare-type: AA01
+ depart-city-default: 440100
+ dest-city-default: 440100
+ protocol-version: V2.0
+ driver-license-id: 440106199001010011
+ driver-phone: 13900139000
+ vehicle-cert-no: 穗交运管许可440100000001
+ driver-name: 张三
+ driver-id-no: 440106199001010011
+ driver-cert-no: 穗网约字440100000001
+
+map:
+ api-key: 66ae577f63898dae3016d599fda57221
+ urls:
+ route-price: https://tsapi.amap.com/v1/route/price
+ route-query: https://tsapi.amap.com/v1/route/query/routeid
+ reverse-geocode: https://restapi.amap.com/v3/geocode/regeo
+
+holiday:
+ api:
+ url: https://publicapi.xiaoai.me/holiday/day?date=
single-table:
default-data-source-name: xp0
props:
diff --git a/xp-robotaxi-payment-boot/src/main/java/com/xiaopeng/payment/wx/utils/WxUtils.java b/xp-robotaxi-payment-boot/src/main/java/com/xiaopeng/payment/wx/utils/WxUtils.java
index 10ed791..5ad8eec 100644
--- a/xp-robotaxi-payment-boot/src/main/java/com/xiaopeng/payment/wx/utils/WxUtils.java
+++ b/xp-robotaxi-payment-boot/src/main/java/com/xiaopeng/payment/wx/utils/WxUtils.java
@@ -69,7 +69,7 @@
byte[] resultByte = cipher.doFinal(dataByte);
if (null != resultByte && resultByte.length > 0) {
String result = new String(resultByte, "UTF-8");
- log.info("解密原串:{}",result);
+ log.info("微信小程序用户数据解密成功");
return WxJsonUtils.parseObject(result, AppletUserDecodeData.class);
}
throw new RuntimeException("解密的数据为空");
@@ -88,8 +88,6 @@
*/
public static void verifySignature(String rawData, String sessionKey, String signature) {
String serverSignature = SHA1.getSHA1(rawData + sessionKey);
- System.out.println(rawData + sessionKey);
- log.info(rawData + ">>>>>>:" + sessionKey + " === " + serverSignature + " ======" + signature);
if (!signature.equals(serverSignature)) {
throw new RuntimeException("数据验签不通过");
}
@@ -116,7 +114,6 @@
throw new RuntimeException("读取微信支付接口数据流出现异常!");
} finally {
reader.close();
- WxUtils.info(sb.toString());
}
return sb.toString();
}
diff --git a/xp-robotaxi-payment-boot/src/main/resources/application-local.yml b/xp-robotaxi-payment-boot/src/main/resources/application-local.yml
index 2089271..0011fdb 100644
--- a/xp-robotaxi-payment-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-payment-boot/src/main/resources/application-local.yml
@@ -4,6 +4,10 @@
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
shardingsphere:
mode:
type: Standalone
diff --git a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/SubscribeMessageUtil.java b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/SubscribeMessageUtil.java
index 1823518..4ba7783 100644
--- a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/SubscribeMessageUtil.java
+++ b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/SubscribeMessageUtil.java
@@ -8,6 +8,7 @@
import com.alibaba.fastjson.JSONObject;
import com.xiaopeng.api.dto.account.UserResourcesDto;
import com.xiaopeng.api.feignClient.account.SSOClient;
+import com.xiaopeng.api.vo.account.WechatAccessTokenResVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.StringUtils;
@@ -273,7 +274,7 @@
String getToken(Boolean isRefresh){
- UserResourcesDto wechatAccessToken = ssoClient.getWechatAccessToken(appId, wxAppletsAppid, isRefresh);
+ WechatAccessTokenResVo wechatAccessToken = ssoClient.getWechatAccessToken(appId, wxAppletsAppid, isRefresh);
if(null == wechatAccessToken){
log.info("获取微信access_token失败");
throw new ServiceException("获取微信access_token失败");
@@ -282,7 +283,7 @@
log.info("获取微信access_token失败:{}", wechatAccessToken.getMsg());
throw new ServiceException("获取微信access_token失败");
}
- String accessToken = JSON.parseObject(wechatAccessToken.getData().toString()).getString("accessToken");
+ String accessToken = wechatAccessToken.getData().getAccessToken();
return accessToken;
}
@@ -311,13 +312,13 @@
HttpResponse execute = post.execute();
if(execute.getStatus() != 200){
log.info("发送消息失败:{}", execute.body());
- throw new RuntimeException("发送消息失败");
+ return R.fail(execute.body());
}
JSONObject jsonObject = JSON.parseObject(execute.body());
Integer errcode = jsonObject.getInteger("errcode");
if(0 != errcode){
log.info("发送消息失败:{}", jsonObject.getString("errmsg"));
- throw new RuntimeException(jsonObject.getString("errmsg"));
+ return R.fail(jsonObject.getString("errmsg"));
}
return R.ok();
}
diff --git a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
index d347d99..dd7df2e 100644
--- a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
+++ b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
@@ -4,6 +4,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.vo.XpTaskVO;
+import com.xiaopeng.api.vo.pushMessage.SendCouponMessageVo;
import com.xiaopeng.api.vo.pushMessage.UpdateEndAddStatusVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.controller.BaseController;
@@ -418,4 +419,28 @@
}
}
+
+
+ /**
+ * 推送优惠券消息
+ * @param vo
+ * @return
+ */
+ @PostMapping("/logan/inner/websocket/coupon/sendCouponMessage")
+ public R<?> sendCouponMessage(@RequestBody SendCouponMessageVo vo){
+ String message = vo.getMessage();
+ if (message.trim().isEmpty()) {
+ return R.fail("消息内容不能为空");
+ }
+ String appUserId = vo.getAppUserId().toString();
+ if (appUserId.trim().isEmpty()) {
+ return R.fail("用户id不能为空");
+ }
+ int deviceCount = webSocketUserService.sendMessageToUser(appUserId, message);
+ if (deviceCount > 0) {
+ return R.ok("消息发送成功,发送到 " + deviceCount + " 个设备");
+ } else {
+ return R.fail("用户不在线或发送失败");
+ }
+ }
}
\ No newline at end of file
diff --git a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketAuthHandler.java b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketAuthHandler.java
index a8b8814..7b4599a 100644
--- a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketAuthHandler.java
+++ b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketAuthHandler.java
@@ -11,6 +11,7 @@
import io.jsonwebtoken.Jwts;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@@ -32,9 +33,8 @@
@Autowired
private RedisService redisService;
- // 令牌秘钥
-// @Value("${token.secret}")
- private String secret = "iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam";
+ @Value("${token.secret:${spring.token.secret:}}")
+ private String secret;
/**
* 验证用户认证信息
diff --git a/xp-robotaxi-push-message-boot/src/main/resources/application-local.yml b/xp-robotaxi-push-message-boot/src/main/resources/application-local.yml
index d92ae5d..c51a7ce 100644
--- a/xp-robotaxi-push-message-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-push-message-boot/src/main/resources/application-local.yml
@@ -4,6 +4,10 @@
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
@@ -122,4 +126,4 @@
iosAppKey: 335666344
regionId: cn-hangzhou
channelId: robotaxi_message
- iosChannelId: robotaxi_message
\ No newline at end of file
+ iosChannelId: robotaxi_message
diff --git a/xp-robotaxi-remote-driving-boot/src/main/resources/application-local.yml b/xp-robotaxi-remote-driving-boot/src/main/resources/application-local.yml
index f35b26e..d09c560 100644
--- a/xp-robotaxi-remote-driving-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-remote-driving-boot/src/main/resources/application-local.yml
@@ -4,6 +4,10 @@
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
shardingsphere:
mode:
type: Standalone
diff --git a/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/MinistryTransportProperties.java b/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/MinistryTransportProperties.java
new file mode 100644
index 0000000..5eae827
--- /dev/null
+++ b/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/config/MinistryTransportProperties.java
@@ -0,0 +1,19 @@
+package com.xiaopeng.trafficControl.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "ministry.transport")
+public class MinistryTransportProperties {
+
+ private String companyId;
+
+ private String platform;
+
+ private String key;
+
+ private String url;
+}
diff --git a/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/utils/MinistryOfTransport.java b/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/utils/MinistryOfTransport.java
index 1aab373..6db9a5f 100644
--- a/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/utils/MinistryOfTransport.java
+++ b/xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/utils/MinistryOfTransport.java
@@ -8,6 +8,7 @@
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.xiaopeng.trafficControl.config.MinistryTransportProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@@ -37,17 +38,14 @@
*
* 接口地址:https://wycapi.jtj.gz.gov.cn/api/app/common/binapi
*/
-
- private final String companyId = "4401XPQCB67N";//公司标识
-
- private final String platform = "XPQC";
-
- private final String key = "gEhROt7lg4DEBanR";
-
- private final String url = "https://wycapi.jtj.gz.gov.cn/api/app/common/binapi";
-
@Value("${xp.file.path}")
private String filePath;
+
+ private final MinistryTransportProperties ministryTransportProperties;
+
+ public MinistryOfTransport(MinistryTransportProperties ministryTransportProperties) {
+ this.ministryTransportProperties = ministryTransportProperties;
+ }
/**
@@ -57,7 +55,7 @@
public String getToken(){
//通过上传文件的方式获取token
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
- String fileName = platform + "_TOKEN_ACCESS_REQ_" + format + ".json";
+ String fileName = ministryTransportProperties.getPlatform() + "_TOKEN_ACCESS_REQ_" + format + ".json";
File file = FileUtil.file(filePath + fileName);
if(!file.exists()){
file.getParentFile().mkdirs();
@@ -72,14 +70,14 @@
JSONObject body = new JSONObject();
JSONArray items = new JSONArray();
JSONObject jsonObject = new JSONObject();
- jsonObject.put("platform", platform);
- jsonObject.put("key", key);
+ jsonObject.put("platform", ministryTransportProperties.getPlatform());
+ jsonObject.put("key", ministryTransportProperties.getKey());
items.add(jsonObject);
body.put("items", items);
- log.info("获取token请求参数 {}", body.toJSONString());
+ log.info("获取token请求参数已生成");
file = FileUtil.writeUtf8String(body.toJSONString(), file);
String md5 = MD5.create().digestHex(file);
- HttpRequest post = HttpUtil.createPost(url);
+ HttpRequest post = HttpUtil.createPost(ministryTransportProperties.getUrl());
post.contentType("multipart/form-data;boundary=inputstream");
post.header("binfile-md5", md5);
post.header("binfile-gzip", "false");
@@ -88,7 +86,7 @@
post.form("filename", fileName);
HttpResponse execute = post.execute();
if(!execute.isOk()){
- log.info("获取token失败:{}", execute.body());
+ log.info("获取token失败,status={}", execute.getStatus());
return execute.body();
}
InputStream inputStream = execute.bodyStream();
@@ -97,7 +95,7 @@
resultFile.getParentFile().mkdirs();
FileUtil.writeFromStream(inputStream, resultFile);
String responseContent = FileUtil.readUtf8String(resultFile);
- log.info("获取token成功 {}", responseContent);
+ log.info("获取token成功");
return responseContent;
}
diff --git a/xp-robotaxi-traffic-control-boot/src/main/resources/application-local.yml b/xp-robotaxi-traffic-control-boot/src/main/resources/application-local.yml
index 4f40872..67dbdae 100644
--- a/xp-robotaxi-traffic-control-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-traffic-control-boot/src/main/resources/application-local.yml
@@ -4,6 +4,10 @@
on-profile: local
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
@@ -112,3 +116,10 @@
seata:
enabled: false
+
+ministry:
+ transport:
+ company-id: 4401XPQCB67N
+ platform: XPQC
+ key: gEhROt7lg4DEBanR
+ url: https://wycapi.jtj.gz.gov.cn/api/app/common/binapi
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MinistryTransportProperties.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MinistryTransportProperties.java
new file mode 100644
index 0000000..7609ac6
--- /dev/null
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MinistryTransportProperties.java
@@ -0,0 +1,91 @@
+package com.xiaopeng.vehicleConvoy.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "ministry.transport")
+public class MinistryTransportProperties {
+
+ private String companyId;
+
+ private String symbol;
+
+ private String protocolVersion;
+
+ private String platform;
+
+ private String key;
+
+ private String url;
+
+ private String companyName;
+
+ private String identifier;
+
+ private String contactPhone;
+
+ private String platformAddressCode;
+
+ private String businessScope;
+
+ private String contactAddress;
+
+ private String economicType;
+
+ private String regCapital;
+
+ private String legalName;
+
+ private String legalId;
+
+ private String legalPhone;
+
+ private String legalPhotoFile;
+
+ private String legalPhotoId;
+
+ private String identifierPhotoFile;
+
+ private String platformState;
+
+ private String serviceItem;
+
+ private String servicePromise;
+
+ private String operationScaleVehicleNum;
+
+ private String operationScaleDriverNum;
+
+ private String vehicleAddressCode;
+
+ private String ownerName;
+
+ private String transAgency;
+
+ private String transArea;
+
+ private String fareType;
+
+ private String driverAddressCode;
+
+ private String driverRegionCode;
+
+ private String driverName;
+
+ private String driverIdCard;
+
+ private String driverCertCard;
+
+ private String driverPhone;
+
+ private String licenseId;
+
+ private String vehicleCertNo;
+
+ private String operateAddressCode;
+
+ private String operateIdentifier;
+}
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java
index 0441780..991b841 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java
@@ -152,7 +152,7 @@
return null;
}
- log.debug("解析空调状态数据: msgId={}, content={}", callback.getMsgRef(), JSON.toJSONString(callback.getMsgContent()));
+ log.info("解析空调状态数据: msgId={}, content={}", callback.getMsgRef(), JSON.toJSONString(callback.getMsgContent()));
// 解析msgContent为Map结构
Map<String, Object> msgContent = (Map<String, Object>) callback.getMsgContent();
@@ -160,14 +160,14 @@
// 检查返回码
Integer code = (Integer) msgContent.get("code");
if (code == null || code != 200) {
- log.warn("空调状态回调返回错误码: msgId={}, code={}", callback.getMsgRef(), code);
+ log.info("空调状态回调返回错误码: msgId={}, code={}", callback.getMsgRef(), code);
return null;
}
// 获取instant数据
Map<String, Object> instant = (Map<String, Object>) msgContent.get("instant");
if (instant == null) {
- log.warn("回调数据中缺少instant字段: msgId={}", callback.getMsgRef());
+ log.info("回调数据中缺少instant字段: msgId={}", callback.getMsgRef());
return null;
}
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/HttpTestController.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/HttpTestController.java
index 966d73e..3fcd0db 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/HttpTestController.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/HttpTestController.java
@@ -2,6 +2,7 @@
import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.vehicleConvoy.config.MinistryTransportProperties;
import com.xiaopeng.vehicleConvoy.model.dto.*;
import com.xiaopeng.vehicleConvoy.util.MinistryOfTransport;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -47,6 +48,57 @@
@Resource
private MinistryOfTransport ministryOfTransport;
+ @Resource
+ private MinistryTransportProperties ministryTransportProperties;
+
+ private String addressCode() {
+ return ministryTransportProperties.getOperateAddressCode();
+ }
+
+ private String cityCode() {
+ return ministryTransportProperties.getVehicleAddressCode();
+ }
+
+ private String companyIdentifier() {
+ return ministryTransportProperties.getOperateIdentifier();
+ }
+
+ private String licenseId() {
+ return ministryTransportProperties.getLicenseId();
+ }
+
+ private String driverCertNo() {
+ return ministryTransportProperties.getDriverCertCard();
+ }
+
+ private String vehicleCertNo() {
+ return ministryTransportProperties.getVehicleCertNo();
+ }
+
+ private String driverPhone() {
+ return ministryTransportProperties.getDriverPhone();
+ }
+
+ private String driverName() {
+ return ministryTransportProperties.getDriverName();
+ }
+
+ private String driverIdCard() {
+ return ministryTransportProperties.getDriverIdCard();
+ }
+
+ private String ownerName() {
+ return ministryTransportProperties.getOwnerName();
+ }
+
+ private String transAgency() {
+ return ministryTransportProperties.getTransAgency();
+ }
+
+ private String fareType() {
+ return ministryTransportProperties.getFareType();
+ }
+
@ResponseBody
@RequestMapping("/base/v0.1/test/auth/token")
public R<String> testPush() {
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
index 88449b4..3893ee5 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -1117,6 +1117,9 @@
if(null == vehicleDoorStatus){
return R.fail("查询车内温度失败");
}
+ if(null == vehicleDoorStatus.getRearLeftHvacTempFloat()){
+ return R.ok("25");
+ }
return R.ok(vehicleDoorStatus.getRearLeftHvacTempFloat().toString());
}
@@ -1124,10 +1127,11 @@
@ApiOperation(value = "通过订单id查询当前车辆车门状态", tags = {"小程序-业务流程"})
@GetMapping("/api/v1/mini-program/order/queryVehicleTrunkOpenStatus")
- public R<VehicleTemperatureDto> queryVehicleTrunkOpenStatus(@RequestParam Long orderId, HttpServletRequest request) {
+ @XpClientCheck(checkToken = false, checkOtpToken = true)
+ public R<Integer> queryVehicleTrunkOpenStatus(@RequestParam Long orderId, HttpServletRequest request) {
String uid = request.getHeader("XP-Uid");
- VehicleTemperatureDto vehicleTemperatureDto = xpVehicleService.queryTemperatureByOrderId(orderId,uid);
- return R.ok(vehicleTemperatureDto);
+ Boolean trunkOpenStatus = xpVehicleService.queryTrunkOpenStatusByOrderId(orderId, uid);
+ return R.ok(trunkOpenStatus ? 1 : 0);
}
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
index 709ac50..9271b41 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
@@ -259,4 +259,12 @@
* @param dto
*/
void reportVehicleLocation(VehiclePositionDto dto, Integer officialPartnerId);
+
+ /**
+ * 上报车辆营运下线信息到交通部
+ *
+ * @param vehicles 车辆列表
+ * @param scene 场景说明
+ */
+ void reportVehicleOperateLogoutToMinistry(List<XpVehicle> vehicles, String scene);
}
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/AsyncVehicleStateServiceImpl.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/AsyncVehicleStateServiceImpl.java
index 8777396..27a5c26 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/AsyncVehicleStateServiceImpl.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/AsyncVehicleStateServiceImpl.java
@@ -8,17 +8,20 @@
import com.xiaopeng.common.core.exception.base.BaseException;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.vehicleConvoy.service.AsyncVehicleStateService;
-import com.xiaopeng.vehicleConvoy.util.CompletableFutureTimeoutUtil.TimeoutBuilder;
import com.xiaopeng.vehicleConvoy.util.VehicleControlUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
@@ -34,12 +37,36 @@
@Resource
private RedisService redisService;
- // 存储等待中的CompletableFuture
- private final ConcurrentHashMap<String, CompletableFuture<VehicleTemperatureDto>> pendingRequests = new ConcurrentHashMap<>();
+ @Value("${vehicle.state.query.timeout.seconds:2}")
+ private int queryTimeoutSeconds = 2; // 查询超时时间,默认2秒
+
+ // 用于异步调度的线程池
+ private ScheduledExecutorService scheduler;
// 缓存键前缀
private static final String STATE_QUERY_PREFIX = "vehicle_state_query:";
private static final String STATE_RESULT_PREFIX = "vehicle_state_result:";
+
+ @PostConstruct
+ public void init() {
+ // 初始化调度器,使用较少的线程数以节省资源
+ this.scheduler = Executors.newScheduledThreadPool(2);
+ }
+
+ @PreDestroy
+ public void destroy() {
+ if (scheduler != null && !scheduler.isShutdown()) {
+ scheduler.shutdown();
+ try {
+ if (!scheduler.awaitTermination(5, TimeUnit.SECONDS)) {
+ scheduler.shutdownNow();
+ }
+ } catch (InterruptedException e) {
+ scheduler.shutdownNow();
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
@Override
public CompletableFuture<VehicleTemperatureDto> queryVehicleStateAsync(String uid, String vin) {
@@ -61,7 +88,6 @@
// 3. 创建CompletableFuture
CompletableFuture<VehicleTemperatureDto> future = new CompletableFuture<>();
- pendingRequests.put(msgId, future);
// 4. 存储查询信息到Redis
StateQueryInfo queryInfo = new StateQueryInfo();
@@ -73,33 +99,88 @@
String cacheKey = STATE_QUERY_PREFIX + msgId;
redisService.setCacheObject(cacheKey, queryInfo, 300L, TimeUnit.SECONDS);
- // 5. 添加超时和清理处理 - 使用工具类,超级简单!
- return TimeoutBuilder.of(future)
- .timeout(1, TimeUnit.SECONDS)
- .onTimeout("车辆状态查询超时,1秒内未收到回调")
- .build()
- .whenComplete((result, throwable) -> {
- // 自动清理资源
- pendingRequests.remove(msgId);
- redisService.deleteObject(cacheKey);
+ // 5. 启动轮询任务检查Redis结果
+ startPollingTask(msgId, vin, future);
- if (throwable != null) {
- if (throwable.getMessage().contains("超时")) {
- log.warn("车辆状态查询超时: uid={}, vin={}, msgId={}", uid, vin, msgId);
- } else {
- log.warn("车辆状态查询异常: uid={}, vin={}, msgId={}, error={}",
- uid, vin, msgId, throwable.getMessage());
- }
- } else {
- log.info("车辆状态查询成功: uid={}, vin={}, msgId={}", uid, vin, msgId);
- }
- });
+ return future;
} catch (Exception e) {
log.error("异步查询车辆状态失败: uid={}, vin={}", uid, vin, e);
CompletableFuture<VehicleTemperatureDto> errorFuture = new CompletableFuture<>();
errorFuture.completeExceptionally(e);
return errorFuture;
+ }
+ }
+
+ /**
+ * 启动轮询任务检查Redis中的结果(高性能版本)
+ */
+ private void startPollingTask(String msgId, String vin, CompletableFuture<VehicleTemperatureDto> future) {
+ String resultKey = STATE_RESULT_PREFIX + msgId;
+ String cacheKey = STATE_QUERY_PREFIX + msgId;
+
+ // 500ms后第一次检查
+ scheduler.schedule(() -> {
+ if (future.isDone()) {
+ return; // 如果Future已完成,直接返回
+ }
+
+ try {
+ VehicleTemperatureDto result = redisService.getCacheObject(resultKey);
+ if (result != null) {
+ log.info("500ms轮询获取到结果: msgId={}", msgId);
+ result.setVin(vin);
+ future.complete(result);
+ cleanupResources(msgId, cacheKey, resultKey);
+ return;
+ }
+
+ // 如果第一次没有结果,安排第二次检查(1秒后)
+ scheduler.schedule(() -> {
+ if (future.isDone()) {
+ return; // 如果Future已完成,直接返回
+ }
+
+ try {
+ VehicleTemperatureDto result2 = redisService.getCacheObject(resultKey);
+ if (result2 != null) {
+ log.info("1s轮询获取到结果: msgId={}", msgId);
+ result2.setVin(vin);
+ future.complete(result2);
+ } else {
+ // 超时处理
+ future.completeExceptionally(new RuntimeException("车辆状态查询超时," + queryTimeoutSeconds + "秒内未收到回调"));
+ }
+ cleanupResources(msgId, cacheKey, resultKey);
+ } catch (Exception e) {
+ log.error("第二次轮询检查Redis异常: msgId={}", msgId, e);
+ if (!future.isDone()) {
+ future.completeExceptionally(e);
+ }
+ cleanupResources(msgId, cacheKey, resultKey);
+ }
+ }, 500, TimeUnit.MILLISECONDS); // 再等500ms,总共1秒
+
+ } catch (Exception e) {
+ log.error("第一次轮询检查Redis异常: msgId={}", msgId, e);
+ if (!future.isDone()) {
+ future.completeExceptionally(e);
+ }
+ cleanupResources(msgId, cacheKey, resultKey);
+ }
+ }, 500, TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * 清理资源
+ */
+ private void cleanupResources(String msgId, String cacheKey, String resultKey) {
+ try {
+ redisService.deleteObject(cacheKey);
+ redisService.deleteObject(resultKey);
+ log.debug("清理资源完成: msgId={}", msgId);
+ } catch (Exception e) {
+ log.error("清理资源异常: msgId={}", msgId, e);
}
}
@@ -113,41 +194,24 @@
log.info("收到车辆状态查询回调: msgId={}, data={}", msgId, JSON.toJSONString(stateData));
try {
- CompletableFuture<VehicleTemperatureDto> future = pendingRequests.get(msgId); // 这里用get而不是remove
- if (future == null) {
- log.warn("未找到对应的状态查询请求: msgId={}", msgId);
- return;
- }
-
- // 验证查询信息
+ // 获取查询信息
String cacheKey = STATE_QUERY_PREFIX + msgId;
StateQueryInfo queryInfo = redisService.getCacheObject(cacheKey);
- if (queryInfo == null) {
- log.warn("查询信息已过期或不存在: msgId={}", msgId);
- future.completeExceptionally(new BaseException("查询信息已过期"));
- return;
- }
- // 设置VIN信息
- if (stateData != null) {
+ if (queryInfo != null && stateData != null) {
+ // 设置VIN信息
stateData.setVin(queryInfo.getVin());
+
+ // 直接将结果保存到Redis
+ String resultKey = STATE_RESULT_PREFIX + msgId;
+ redisService.setCacheObject(resultKey, stateData, 300L, TimeUnit.SECONDS);
+ log.info("回调结果已保存到Redis: msgId={}", msgId);
+ } else {
+ log.warn("未找到对应的查询信息或回调数据为空: msgId={}", msgId);
}
-
- // 存储结果并完成Future
- String resultKey = STATE_RESULT_PREFIX + msgId;
- redisService.setCacheObject(resultKey, stateData, 300L, TimeUnit.SECONDS);
-
- future.complete(stateData); // 完成Future,会自动触发whenComplete清理
-
- log.info("车辆状态查询回调处理完成: msgId={}, uid={}, vin={}",
- msgId, queryInfo.getUid(), queryInfo.getVin());
} catch (Exception e) {
log.error("处理车辆状态回调异常: msgId={}", msgId, e);
- CompletableFuture<VehicleTemperatureDto> future = pendingRequests.get(msgId);
- if (future != null) {
- future.completeExceptionally(e);
- }
}
}
@@ -159,11 +223,7 @@
log.info("取消车辆状态查询: msgId={}", msgId);
- CompletableFuture<VehicleTemperatureDto> future = pendingRequests.remove(msgId);
- if (future != null) {
- future.cancel(true);
- }
-
+ // 清理Redis缓存
redisService.deleteObject(STATE_QUERY_PREFIX + msgId);
redisService.deleteObject(STATE_RESULT_PREFIX + msgId);
}
@@ -175,4 +235,4 @@
private String msgId;
private LocalDateTime createTime;
}
-}
+}
\ No newline at end of file
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
index fb1d6a1..8c9ac10 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -59,6 +59,7 @@
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.evi.oss.service.AliOssService;
+import com.xiaopeng.vehicleConvoy.config.MinistryTransportProperties;
import com.xiaopeng.vehicleConvoy.constant.I18nKeyConstant;
import com.xiaopeng.vehicleConvoy.mapper.XpFleetOperationsMapper;
import com.xiaopeng.vehicleConvoy.mapper.XpVehicleMapper;
@@ -72,6 +73,7 @@
import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService;
import com.xiaopeng.vehicleConvoy.service.IXpVehicleAnnualRecordService;
import com.xiaopeng.vehicleConvoy.service.IXpVehicleService;
+import com.xiaopeng.vehicleConvoy.util.MinistryOfTransport;
import com.xiaopeng.vehicleConvoy.util.OfficialPartnerUtil;
import com.xiaopeng.vehicleConvoy.util.VehicleControlUtil;
import lombok.extern.slf4j.Slf4j;
@@ -156,6 +158,9 @@
@Resource
private UserVehicleClient userVehicleClient;
+ @Autowired
+ private MinistryTransportProperties ministryTransportProperties;
+
@Resource
private UserResourcesClient userResourcesClient;
@Resource
@@ -172,6 +177,9 @@
@Resource
private XpTargetedServiceClient targetedServiceClient;
+
+ @Resource
+ private MinistryOfTransport ministryOfTransport;
@Value("${vehicle.control.distance-threshold:100}")
private int distanceThreshold;
@@ -640,6 +648,8 @@
xpVehicleAnnualRecord.setVehicleId(xpVehicle.getId());
xpVehicleAnnualRecordService.save(xpVehicleAnnualRecord);
}
+
+// pushVehicleBaseInfoToMinistry(this.getById(xpVehicle.getId()), vin, officialPartnerId, "新增车辆");
return xpVehicle;
}
@@ -698,6 +708,8 @@
log.error("[ADC推送] 编辑车辆{}变更围栏{}推送失败,不影响主流程", vin, dto.getElectronicId(), e);
}
}
+
+// pushVehicleBaseInfoToMinistry(this.getById(dto.getId()), vin, officialPartnerId, "编辑车辆");
}
private void validateAndNormalizeIdentityFields(String vehicleCode, String vehicleVin, String plateNumber, String vehicleColor, Long excludeId) {
@@ -768,6 +780,307 @@
return trimmed.isEmpty() ? null : trimmed;
}
+ private void pushVehicleBaseInfoToMinistry(XpVehicle xpVehicle, String vin, Integer officialPartnerId, String scene) {
+ if (officialPartnerId != null || xpVehicle == null) {
+ return;
+ }
+ try {
+ RegulationVehicleBaseInfoDTO regulationDto = buildRegulationVehicleBaseInfoDto(xpVehicle, vin);
+ String response = ministryOfTransport.pushVehicleBaseInfo(regulationDto);
+ log.info("{}后上报交通部CLJB完成, vehicleId={}, vin={}, response={}",
+ scene, xpVehicle.getId(), vin, response);
+ } catch (Exception e) {
+ log.error("{}后上报交通部CLJB失败, vehicleId={}, vin={}",
+ scene, xpVehicle.getId(), vin, e);
+ }
+ }
+
+ private void pushVehicleInsuranceInfoToMinistry(XpVehicle xpVehicle, Integer officialPartnerId, String scene) {
+ if (officialPartnerId != null || xpVehicle == null) {
+ return;
+ }
+ try {
+ RegulationVehicleInsuranceInfoDTO regulationDto = buildRegulationVehicleInsuranceInfoDto(xpVehicle);
+ String response = ministryOfTransport.pushVehicleInsuranceInfo(regulationDto);
+ log.info("{}后上报交通部CLBX完成, vehicleId={}, vin={}, response={}",
+ scene, xpVehicle.getId(), SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin()), response);
+ } catch (Exception e) {
+ log.error("{}后上报交通部CLBX失败, vehicleId={}, vin={}",
+ scene, xpVehicle.getId(), SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin()), e);
+ }
+ }
+
+ private RegulationVehicleBaseInfoDTO buildRegulationVehicleBaseInfoDto(XpVehicle xpVehicle, String vin) {
+ RegulationVehicleBaseInfoDTO regulationDto = new RegulationVehicleBaseInfoDTO();
+ XpVehicleModel vehicleModel = getVehicleModel(xpVehicle.getVehicleModel());
+ String modelName = vehicleModel == null ? trimToNull(xpVehicle.getVehicleModel()) : trimToNull(vehicleModel.getName());
+ String seat = vehicleModel == null ? null : trimToNull(vehicleModel.getSeat());
+ LocalDateTime now = LocalDateTime.now();
+
+ regulationDto.setAddress(ministryTransportProperties.getVehicleAddressCode());
+ regulationDto.setVehicleNo(trimToNull(xpVehicle.getPlateNumber()));
+ regulationDto.setPlateColor(getPlateColor(xpVehicle.getPlateNumber()));
+ regulationDto.setSeats(defaultIfBlank(seat, "5"));
+ regulationDto.setBrand("小鹏");
+ regulationDto.setModel(defaultIfBlank(modelName, "未知车型"));
+ regulationDto.setVehicleType("小型轿车");
+ regulationDto.setOwnerName(ministryTransportProperties.getOwnerName());
+ regulationDto.setOwnerType("1");
+ regulationDto.setVehicleColor(trimToNull(xpVehicle.getVehicleColor()));
+ regulationDto.setEngineId(defaultIfBlank(trimToNull(xpVehicle.getVehicleCode()), vin));
+ regulationDto.setVin(vin);
+ regulationDto.setCertifyDateA(formatDate(now));
+ regulationDto.setFuelType("纯电动");
+ regulationDto.setEngineDisplace("0");
+ regulationDto.setEnginePower("0");
+ regulationDto.setWheelBase("0");
+ regulationDto.setPhotoId(defaultIfBlank(trimToNull(xpVehicle.getVehicleCode()), vin));
+ regulationDto.setTransAgency(ministryTransportProperties.getTransAgency());
+ regulationDto.setTransArea(ministryTransportProperties.getTransArea());
+ regulationDto.setTransDateStart(formatDate(now));
+ regulationDto.setTransDateStop(formatDate(defaultIfNull(xpVehicle.getQualificationExpireTime(), now.plusYears(1))));
+ regulationDto.setCertifyDateB(formatDate(now));
+ regulationDto.setFixState("1");
+ regulationDto.setNextFixDate(formatDate(defaultIfNull(xpVehicle.getAnnualInspectionDate(), now.plusYears(1))));
+ regulationDto.setCheckState("1");
+ regulationDto.setCheckDate(formatDate(defaultIfNull(xpVehicle.getAnnualInspectionDate(), now)));
+ regulationDto.setGpsImei(defaultIfBlank(trimToNull(xpVehicle.getXpuId()), vin));
+ regulationDto.setGpsInstallDate(formatDate(now));
+ regulationDto.setRegisterDate(formatDate(now));
+ regulationDto.setCommercialType("1");
+ regulationDto.setFareType(ministryTransportProperties.getFareType());
+ regulationDto.setUpdateTime(now.format(MinistryOfTransport.DATA_TIME_FORMATTER));
+ return regulationDto;
+ }
+
+ private RegulationVehicleInsuranceInfoDTO buildRegulationVehicleInsuranceInfoDto(XpVehicle xpVehicle) {
+ RegulationVehicleInsuranceInfoDTO regulationDto = new RegulationVehicleInsuranceInfoDTO();
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime insuranceExpireTime = defaultIfNull(xpVehicle.getInsuranceEndTime(), now.plusYears(1));
+
+ regulationDto.setVehicleNo(trimToNull(xpVehicle.getPlateNumber()));
+ regulationDto.setPlateColor(getPlateColor(xpVehicle.getPlateNumber()));
+ regulationDto.setInsurCom(defaultIfBlank(trimToNull(xpVehicle.getInsuranceCompany()), "未知保险公司"));
+ regulationDto.setInsurNum("无");
+ regulationDto.setInsurType("交强险");
+ regulationDto.setInsurCount("0");
+ regulationDto.setInsurEff(formatDate(insuranceExpireTime.minusYears(1)));
+ regulationDto.setInsurExp(formatDate(insuranceExpireTime));
+ regulationDto.setFlag("1");
+ regulationDto.setUpdateTime(now.format(MinistryOfTransport.DATA_TIME_FORMATTER));
+ return regulationDto;
+ }
+
+ private XpVehicleModel getVehicleModel(String vehicleModelId) {
+ if (StringUtils.isBlank(vehicleModelId)) {
+ return null;
+ }
+ R<List<XpVehicleModel>> result = xpVehicleModelClient.listByIds(Collections.singleton(vehicleModelId));
+ if (result == null || CollUtil.isEmpty(result.getData())) {
+ return null;
+ }
+ return result.getData().get(0);
+ }
+
+ /**
+ * 根据车牌号判断车牌颜色
+ * 规则:除去第一个汉字后,6位为蓝色,7位为渐变绿
+ *
+ * @param plateNumber 车牌号
+ * @return 车牌颜色
+ */
+ private String getPlateColor(String plateNumber) {
+ if (StringUtils.isBlank(plateNumber)) {
+ return "蓝色";
+ }
+ // 去除第一个汉字(省份简称)
+ String plateWithoutProvince = plateNumber.substring(1);
+ // 判断位数
+ if (plateWithoutProvince.length() == 7) {
+ return "渐变绿";
+ } else {
+ return "蓝色";
+ }
+ }
+
+ private LocalDateTime defaultIfNull(LocalDateTime value, LocalDateTime defaultValue) {
+ return value == null ? defaultValue : value;
+ }
+
+ private String defaultIfBlank(String value, String defaultValue) {
+ return StringUtils.isBlank(value) ? defaultValue : value;
+ }
+
+ private String formatDate(LocalDateTime time) {
+ return time == null ? null : time.format(MinistryOfTransport.DATA_TIME_FORMATTER);
+ }
+
+ private void pushDriverPositionInfoToMinistry(XpVehicle xpVehicle, VehiclePositionDto dto, String scene) {
+ if (xpVehicle == null || dto == null) {
+ return;
+ }
+ try {
+ RegulationDriverPositionInfoDTO regulationDto = buildRegulationDriverPositionInfoDto(xpVehicle, dto);
+ String response = ministryOfTransport.pushDriverPositionInfo(regulationDto);
+ log.info("{}后上报交通部JSYDW完成, vehicleId={}, vin={}, response={}",
+ scene, xpVehicle.getId(), SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin()), response);
+ } catch (Exception e) {
+ log.error("{}后上报交通部JSYDW失败, vehicleId={}, vin={}",
+ scene, xpVehicle.getId(), SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin()), e);
+ }
+ }
+
+ private RegulationDriverPositionInfoDTO buildRegulationDriverPositionInfoDto(XpVehicle xpVehicle, VehiclePositionDto dto) {
+ RegulationDriverPositionInfoDTO regulationDto = new RegulationDriverPositionInfoDTO();
+ regulationDto.setAddress(ministryTransportProperties.getDriverAddressCode());
+ regulationDto.setDriverRegionCode(ministryTransportProperties.getDriverRegionCode());
+ regulationDto.setVehicleNo(trimToNull(xpVehicle.getPlateNumber()));
+ regulationDto.setPlateColor(getPlateColor(xpVehicle.getPlateNumber()));
+ regulationDto.setPositionTime(LocalDateTime.now().format(MinistryOfTransport.DATA_TIME_FORMATTER));
+ regulationDto.setLongitude(formatCoordinate(dto.getLongitude()));
+ regulationDto.setLatitude(formatCoordinate(dto.getLatitude()));
+ regulationDto.setSpeed(formatNumber(dto.getSpeed(), 0));
+ regulationDto.setDirection(formatNumber(dto.getCourse(), 0));
+ regulationDto.setElevation(formatNumber(dto.getAlt(), 0));
+ regulationDto.setMileage(dto.getTotalOdometer() == null ? "0" : String.valueOf(dto.getTotalOdometer()));
+ regulationDto.setEncrypt("1");
+ regulationDto.setBizStatus(dto.getOrderId() == null ? "0" : "1");
+ regulationDto.setOrderId(dto.getOrderId() == null ? null : String.valueOf(dto.getOrderId()));
+ regulationDto.setLicenseId(ministryTransportProperties.getLicenseId());
+ regulationDto.setDriverName(ministryTransportProperties.getDriverName());
+ regulationDto.setDriverCertCard(ministryTransportProperties.getDriverCertCard());
+ return regulationDto;
+ }
+
+ private String formatCoordinate(Double value) {
+ if (value == null) {
+ return "0";
+ }
+ return BigDecimal.valueOf(value)
+ .multiply(BigDecimal.valueOf(1_000_000L))
+ .setScale(0, RoundingMode.HALF_UP)
+ .toPlainString();
+ }
+
+ private String formatNumber(Number value, int scale) {
+ if (value == null) {
+ return "0";
+ }
+ return BigDecimal.valueOf(value.doubleValue())
+ .setScale(scale, RoundingMode.HALF_UP)
+ .toPlainString();
+ }
+
+ private List<Long> parseVehicleIds(String idStr) {
+ if (StringUtils.isBlank(idStr)) {
+ return Collections.emptyList();
+ }
+ return Arrays.stream(idStr.split(","))
+ .map(String::trim)
+ .filter(StringUtils::isNotBlank)
+ .map(Long::valueOf)
+ .collect(Collectors.toList());
+ }
+
+ private VehiclePosition findVehiclePosition(String vin) {
+ if (StringUtils.isBlank(vin)) {
+ return null;
+ }
+ return mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+ }
+
+ private void pushVehicleOperateLoginToMinistry(XpVehicle xpVehicle, String scene) {
+ if (xpVehicle == null || xpVehicle.getOfficialPartnerId() != null) {
+ return;
+ }
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
+ try {
+ RegulationVehicleOperateLoginInfoDTO regulationDto = buildRegulationVehicleOperateLoginInfoDto(xpVehicle, vin);
+ String response = ministryOfTransport.pushVehicleOperateLoginInfo(regulationDto);
+ log.info("{}后上报交通部CLYYSX完成, vehicleId={}, vin={}, response={}",
+ scene, xpVehicle.getId(), vin, response);
+ } catch (Exception e) {
+ log.error("{}后上报交通部CLYYSX失败, vehicleId={}, vin={}",
+ scene, xpVehicle.getId(), vin, e);
+ }
+ }
+
+ private void pushVehicleOperateLogoutToMinistry(XpVehicle xpVehicle, String scene) {
+ if (xpVehicle == null || xpVehicle.getOfficialPartnerId() != null) {
+ return;
+ }
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
+ try {
+ RegulationVehicleOperateLogoutInfoDTO regulationDto = buildRegulationVehicleOperateLogoutInfoDto(xpVehicle, vin);
+ String response = ministryOfTransport.pushVehicleOperateLogoutInfo(regulationDto);
+ log.info("{}后上报交通部CLYYXX完成, vehicleId={}, vin={}, response={}",
+ scene, xpVehicle.getId(), vin, response);
+ } catch (Exception e) {
+ log.error("{}后上报交通部CLYYXX失败, vehicleId={}, vin={}",
+ scene, xpVehicle.getId(), vin, e);
+ }
+ }
+
+ @Override
+ public void reportVehicleOperateLogoutToMinistry(List<XpVehicle> vehicles, String scene) {
+ if (CollectionUtils.isEmpty(vehicles)) {
+ return;
+ }
+ for (XpVehicle vehicle : vehicles) {
+// pushVehicleOperateLogoutToMinistry(vehicle, scene);
+ }
+ }
+
+ private RegulationVehicleOperateLoginInfoDTO buildRegulationVehicleOperateLoginInfoDto(XpVehicle xpVehicle, String vin) {
+ RegulationVehicleOperateLoginInfoDTO regulationDto = new RegulationVehicleOperateLoginInfoDTO();
+ VehiclePosition vehiclePosition = findVehiclePosition(vin);
+ GeoJsonPoint point = vehiclePosition == null ? null : vehiclePosition.getPoint();
+ LocalDateTime now = LocalDateTime.now();
+
+ regulationDto.setAddress(ministryTransportProperties.getOperateAddressCode());
+ regulationDto.setIdentifier(ministryTransportProperties.getOperateIdentifier());
+ regulationDto.setDriverName(ministryTransportProperties.getDriverName());
+ regulationDto.setDriverIDCard(ministryTransportProperties.getDriverIdCard());
+ regulationDto.setDriverCertCard(ministryTransportProperties.getDriverCertCard());
+ regulationDto.setDriverPhone(ministryTransportProperties.getDriverPhone());
+ regulationDto.setLicenseId(ministryTransportProperties.getLicenseId());
+ regulationDto.setVehicleNo(trimToNull(xpVehicle.getPlateNumber()));
+ regulationDto.setPlateColor(getPlateColor(xpVehicle.getPlateNumber()));
+ regulationDto.setLoginTime(formatDate(now));
+ regulationDto.setLongitude(formatCoordinate(point == null ? null : point.getX()));
+ regulationDto.setLatitude(formatCoordinate(point == null ? null : point.getY()));
+ regulationDto.setEncrypt("1");
+ return regulationDto;
+ }
+
+ private RegulationVehicleOperateLogoutInfoDTO buildRegulationVehicleOperateLogoutInfoDto(XpVehicle xpVehicle, String vin) {
+ RegulationVehicleOperateLogoutInfoDTO regulationDto = new RegulationVehicleOperateLogoutInfoDTO();
+ VehiclePosition vehiclePosition = findVehiclePosition(vin);
+ GeoJsonPoint point = vehiclePosition == null ? null : vehiclePosition.getPoint();
+ LocalDateTime now = LocalDateTime.now();
+
+ regulationDto.setAddress(ministryTransportProperties.getOperateAddressCode());
+ regulationDto.setIdentifier(ministryTransportProperties.getOperateIdentifier());
+ regulationDto.setDriverName(ministryTransportProperties.getDriverName());
+ regulationDto.setDriverIDCard(ministryTransportProperties.getDriverIdCard());
+ regulationDto.setDriverPhone(ministryTransportProperties.getDriverPhone());
+ regulationDto.setDriverCertCard(ministryTransportProperties.getDriverCertCard());
+ regulationDto.setLicenseId(ministryTransportProperties.getLicenseId());
+ regulationDto.setVehicleNo(trimToNull(xpVehicle.getPlateNumber()));
+ regulationDto.setPlateColor(getPlateColor(xpVehicle.getPlateNumber()));
+ regulationDto.setLoginTime(formatDate(defaultIfNull(xpVehicle.getUpdateTime(), now)));
+ regulationDto.setLogoutTime(formatDate(now));
+ regulationDto.setLongitude(formatCoordinate(point == null ? null : point.getX()));
+ regulationDto.setLatitude(formatCoordinate(point == null ? null : point.getY()));
+ regulationDto.setEncrypt("1");
+ regulationDto.setDriveCount("0");
+ regulationDto.setDriveMile("0");
+ regulationDto.setDriveTime("0");
+ regulationDto.setPrice("0");
+ regulationDto.setFactPrice("0");
+ return regulationDto;
+ }
+
@Override
@Transactional
@ShardingSphereTransactionType(TransactionType.BASE)
@@ -806,6 +1119,14 @@
XpVehicleAnnualRecord xpVehicleAnnualRecord = BeanUtil.copyProperties(dto, XpVehicleAnnualRecord.class, "id");
xpVehicleAnnualRecord.setVehicleId(dto.getId());
xpVehicleAnnualRecordService.save(xpVehicleAnnualRecord);
+
+// pushVehicleBaseInfoToMinistry(vehicle,
+// SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin()),
+// vehicle.getOfficialPartnerId(),
+// "完善车辆资料");
+// pushVehicleInsuranceInfoToMinistry(vehicle,
+// vehicle.getOfficialPartnerId(),
+// "完善车辆资料");
}
/**
@@ -953,12 +1274,12 @@
@Override
public void batchOperation(String idStr) {
- if (StringUtils.isBlank(idStr)) {
+ List<Long> vehicleIds = parseVehicleIds(idStr);
+ if (CollectionUtils.isEmpty(vehicleIds)) {
return;
}
- List<String> ids = Arrays.asList(idStr.split(","));
// 查询车辆完整信息
- List<XpVehicle> vehicles = this.listByIds(ids);
+ List<XpVehicle> vehicles = this.listByIds(vehicleIds);
List<Long> vehicleIdList = vehicles.stream()
.map(XpVehicle::getId)
.filter(Objects::nonNull)
@@ -1037,23 +1358,34 @@
// 校验通过,批量转为运营状态(vehicleType: 1→2)
LambdaUpdateWrapper<XpVehicle> wrapper = new LambdaUpdateWrapper<>();
- wrapper.in(XpVehicle::getId, ids)
+ wrapper.in(XpVehicle::getId, vehicleIds)
.set(XpVehicle::getVehicleType, 2)
.set(XpVehicle::getOperatingStatus, 1);
- this.update(wrapper);
+ boolean updated = this.update(wrapper);
+ if (updated) {
+ for (XpVehicle vehicle : vehicles) {
+// pushVehicleOperateLoginToMinistry(vehicle, "批量开始运营");
+ }
+ }
}
@Override
public void batchStock(String idStr) {
- if (StringUtils.isBlank(idStr)) {
+ List<Long> vehicleIds = parseVehicleIds(idStr);
+ if (CollectionUtils.isEmpty(vehicleIds)) {
return;
}
- List<String> ids = Arrays.asList(idStr.split(","));
+ List<XpVehicle> vehicles = this.listByIds(vehicleIds).stream()
+ .filter(vehicle -> Integer.valueOf(2).equals(vehicle.getVehicleType()))
+ .collect(Collectors.toList());
// 批量将运营车辆转为在库状态(vehicleType: 2→1)
LambdaUpdateWrapper<XpVehicle> wrapper = new LambdaUpdateWrapper<>();
- wrapper.in(XpVehicle::getId, ids)
+ wrapper.in(XpVehicle::getId, vehicleIds)
.set(XpVehicle::getVehicleType, 1);
- this.update(wrapper);
+ boolean updated = this.update(wrapper);
+ if (updated) {
+// reportVehicleOperateLogoutToMinistry(vehicles, "批量收车下线");
+ }
}
@Override
@@ -1194,10 +1526,11 @@
List<String> collect = page.getRecords().stream().map(XpVehicle::getVehicleModel).collect(Collectors.toList());
List<XpVehicleModel> vehicleModels = xpVehicleModelClient.listByIds(collect).getData();
for (XpVehicle record : page.getRecords()) {
- XpVehicleModel xpVehicleModel = vehicleModels.stream().filter(item -> item.getId().toString().equals(record.getVehicleModel())).findFirst().orElse(null);
- if(null != xpVehicleModel){
- record.setVehicleModelName(xpVehicleModel.getName());
+ if(null != record && StringUtils.isNotEmpty(record.getVehicleModel())){
+ XpVehicleModel xpVehicleModel = vehicleModels.stream().filter(item -> item.getId().toString().equals(record.getVehicleModel())).findFirst().orElse(null);
+ record.setVehicleModelName(null != xpVehicleModel ? xpVehicleModel.getName() : "");
}
+
}
decryptVehicles(page.getRecords());
@@ -1522,6 +1855,7 @@
throw new RuntimeException(e);
}
String cacheObject = redisService.getCacheObject("HVAC:" + msgId);
+ log.info("查询空调状态:{}", cacheObject);
if(StringUtils.isEmpty(cacheObject)){
return false;
}
@@ -1553,14 +1887,11 @@
XpVehicle vehicle = this.getById(xpOrder.getVehicleId());
VehiclesCommandVo vehiclesCommandVo = new VehiclesCommandVo();
vehiclesCommandVo.setVin(vehicle.getVehicleVin());
- vehiclesCommandVo.setCommandCode(open ? VehiclesCommandEnum.HVAC_ON.getCommand() : VehiclesCommandEnum.HVAC_OFF.getCommand());
+ vehiclesCommandVo.setCommandCode(open ? VehiclesCommandEnum.HVAC_OFF.getCommand() : VehiclesCommandEnum.HVAC_ON.getCommand());
String msgId = vehicleControlUtil.vehiclesCommand(vehiclesCommandVo, Long.valueOf(uid));
log.info("空调控制结果:{}", msgId);
- if (StringUtils.isEmpty(msgId)) {
- return 0;
- } else {
- return 1;
- }
+ open = queryVehicleAirConditionerSwitch(dto.getOrderId(), uid);
+ return open ? 1 : 0;
}
@@ -1690,11 +2021,12 @@
if(null == vehicle){
throw new ServiceException("无效数据");
}
- if(!vehicle.getOfficialPartnerId().equals(officialPartnerId)){
+ if(!Objects.equals(vehicle.getOfficialPartnerId(), officialPartnerId)){
throw new ServiceException("无效数据");
}
VehiclePosition vehiclePosition = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(dto.getVin())), VehiclePosition.class);
if(null == vehiclePosition){
+ vehiclePosition = new VehiclePosition();
BeanUtil.copyProperties(dto, vehiclePosition);
vehiclePosition.setPoint(new GeoJsonPoint(dto.getLongitude(), dto.getLatitude()));
vehiclePosition.setAddTime(System.currentTimeMillis());
@@ -1712,6 +2044,9 @@
.set("addTime", System.currentTimeMillis());
mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(dto.getVin())), update, VehiclePosition.class);
}
+
+// pushDriverPositionInfoToMinistry(vehicle, dto, "上报车辆实时位置");
+
Long orderId = dto.getOrderId();
Double longitude = dto.getLongitude();
Double latitude = dto.getLatitude();
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/task/VehicleDocumentExpiryTask.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/task/VehicleDocumentExpiryTask.java
index 3d7442f..05ef9c9 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/task/VehicleDocumentExpiryTask.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/task/VehicleDocumentExpiryTask.java
@@ -13,6 +13,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
+import java.util.List;
/**
* 运营车辆年检/保险/运营资质过期检查定时任务
@@ -31,6 +32,12 @@
public void checkAndStockExpiredVehicles() {
LocalDate today = LocalDate.now(ZONE_GMT8);
LocalDateTime todayStart = today.atStartOfDay();
+ List<XpVehicle> expiredVehicles = xpVehicleService.lambdaQuery()
+ .eq(XpVehicle::getVehicleType, 2)
+ .and(w -> w.lt(XpVehicle::getAnnualInspectionDate, todayStart)
+ .or().lt(XpVehicle::getInsuranceEndTime, todayStart)
+ .or().lt(XpVehicle::getQualificationExpireTime, todayStart))
+ .list();
LambdaUpdateWrapper<XpVehicle> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(XpVehicle::getVehicleType, 2)
@@ -41,6 +48,9 @@
.set(XpVehicle::getStatus, 3);
boolean updated = xpVehicleService.update(updateWrapper);
+ if (updated) {
+// xpVehicleService.reportVehicleOperateLogoutToMinistry(expiredVehicles, "证件过期自动下线");
+ }
log.info("运营车辆证件过期检查任务执行完成,todayStart={}, updated={}", todayStart, updated);
}
}
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/MinistryOfTransport.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/MinistryOfTransport.java
index 27e7a8e..89fe601 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/MinistryOfTransport.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/MinistryOfTransport.java
@@ -7,11 +7,14 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
+import java.util.concurrent.TimeUnit;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.common.core.utils.StringUtils;
+import com.xiaopeng.common.redis.service.RedisService;
+import com.xiaopeng.vehicleConvoy.config.MinistryTransportProperties;
import com.xiaopeng.vehicleConvoy.model.dto.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
@@ -22,8 +25,11 @@
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
/**
@@ -44,25 +50,34 @@
*
* 接口地址:https://wycapi.jtj.gz.gov.cn/api/app/common/binapi
*/
+ public static String DEFAULT_COMPANY_ID = "4401XPQCB67N";
- public static final String DEFAULT_COMPANY_ID = "4401XPQCB67N";
+ public static String DEFAULT_SYMBOL = "XPQCB67N_S0612018007357G";
- public static final String DEFAULT_SYMBOL = "XPQCB67N_S0612018007357G";
-
- public static final String DEFAULT_PROTOCOL_VERSION = "V2.0";
-
- private final String companyId = DEFAULT_COMPANY_ID;//公司标识
-
- private final String platform = "XPQCB67N";
-
- private final String key = "gEhROt7lg4DEBanR";
-
- private final String url = "https://wycapi.jtj.gz.gov.cn/api/app/common/binapi";
+ public static String DEFAULT_PROTOCOL_VERSION = "V2.0";
private static final DateTimeFormatter FILE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-ddHHmmssSSS");
public static final DateTimeFormatter DATA_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+ private static final String TOKEN_CACHE_KEY = "ministry_of_transport:token";
+
+ private static final long TOKEN_EXPIRE_SECONDS = 20 * 60;
+
+ private static final long TOKEN_REFRESH_THRESHOLD_SECONDS = 5 * 60;
+
+ @Autowired
+ private RedisService redisService;
+
+ @Autowired
+ private MinistryTransportProperties ministryTransportProperties;
+
+ @PostConstruct
+ public void initDefaultConstants() {
+ DEFAULT_COMPANY_ID = defaultIfBlank(ministryTransportProperties.getCompanyId(), DEFAULT_COMPANY_ID);
+ DEFAULT_SYMBOL = defaultIfBlank(ministryTransportProperties.getSymbol(), DEFAULT_SYMBOL);
+ DEFAULT_PROTOCOL_VERSION = defaultIfBlank(ministryTransportProperties.getProtocolVersion(), DEFAULT_PROTOCOL_VERSION);
+ }
/**
* 获取token
@@ -70,16 +85,39 @@
*/
public String getToken(){
try {
+ String cachedToken = redisService.getCacheObject(TOKEN_CACHE_KEY);
+
+ if (StringUtils.isNotBlank(cachedToken)) {
+ Long expireTime = redisService.getExpire(TOKEN_CACHE_KEY);
+ if (expireTime > TOKEN_REFRESH_THRESHOLD_SECONDS) {
+ return cachedToken;
+ } else {
+ log.info("token即将过期,剩余{}秒,开始刷新", expireTime);
+ }
+ } else {
+ log.info("未找到缓存token,开始获取新token");
+ }
+
String format = LocalDateTime.now().format(FILE_TIME_FORMATTER);
- String filename = platform + "_TOKEN_ACCESS_REQ_" + format + ".json";
+ String filename = ministryTransportProperties.getPlatform() + "_TOKEN_ACCESS_REQ_" + format + ".json";
JSONObject body = new JSONObject();
- body.put("platform", platform);
- body.put("key", key);
- return uploadJsonFile(filename, body.toJSONString(), platform);
+ body.put("platform", ministryTransportProperties.getPlatform());
+ body.put("key", ministryTransportProperties.getKey());
+ String response = uploadJsonFile(filename, body.toJSONString(), ministryTransportProperties.getPlatform());
+
+ String token = parseToken(response);
+ redisService.setCacheObject(TOKEN_CACHE_KEY, token, TOKEN_EXPIRE_SECONDS, TimeUnit.SECONDS);
+ log.info("成功获取新token并缓存,有效期{}秒", TOKEN_EXPIRE_SECONDS);
+
+ return token;
}catch (Exception e){
log.error("获取交通部token失败", e);
}
return null;
+ }
+
+ private String defaultIfBlank(String value, String defaultValue) {
+ return StringUtils.isBlank(value) ? defaultValue : value;
}
/**
@@ -581,47 +619,47 @@
body.put("items", items);
String format = LocalDateTime.now().format(FILE_TIME_FORMATTER);
- String filename = platform + "_"+ type +"_"+ command +"_REQ_" + format + ".json";
+ String filename = ministryTransportProperties.getPlatform() + "_"+ type +"_"+ command +"_REQ_" + format + ".json";
return uploadJsonFile(filename, body.toJSONString(), token);
}
private JSONObject buildPlatformBaseInfo() {
JSONObject item = new JSONObject();
- item.put("symbol", DEFAULT_SYMBOL);
- item.put("companyId", companyId);
- item.put("companyName", "广州易点智慧出行科技有限公司");
- item.put("identifier", "91440101MA5AWEB67N");
- item.put("contactPhone", "18306304567");
- item.put("address", "440000");
- item.put("businessScope", "网络预约出租汽车客运");
- item.put("contactAddress", "广州市天河区岑村丰庄大街10号T2");
- item.put("economicType", "159");
- item.put("regCapital", "壹仟万元(人民币)");
- item.put("legalName", "陈志远");
- item.put("legalId", "445221199101121937");
- item.put("legalPhone", "15915905487");
- item.put("legalPhoto", encodePdf("陈志远新复印件.pdf"));
- item.put("legalPhotoId", "");
- item.put("identifierPhoto", encodePdf("易点智慧出行-营副-20250716.pdf"));
- item.put("state", "0");
+ item.put("symbol", ministryTransportProperties.getSymbol());
+ item.put("companyId", ministryTransportProperties.getCompanyId());
+ item.put("companyName", ministryTransportProperties.getCompanyName());
+ item.put("identifier", ministryTransportProperties.getIdentifier());
+ item.put("contactPhone", ministryTransportProperties.getContactPhone());
+ item.put("address", ministryTransportProperties.getPlatformAddressCode());
+ item.put("businessScope", ministryTransportProperties.getBusinessScope());
+ item.put("contactAddress", ministryTransportProperties.getContactAddress());
+ item.put("economicType", ministryTransportProperties.getEconomicType());
+ item.put("regCapital", ministryTransportProperties.getRegCapital());
+ item.put("legalName", ministryTransportProperties.getLegalName());
+ item.put("legalId", ministryTransportProperties.getLegalId());
+ item.put("legalPhone", ministryTransportProperties.getLegalPhone());
+ item.put("legalPhoto", encodePdf(ministryTransportProperties.getLegalPhotoFile()));
+ item.put("legalPhotoId", ministryTransportProperties.getLegalPhotoId());
+ item.put("identifierPhoto", encodePdf(ministryTransportProperties.getIdentifierPhotoFile()));
+ item.put("state", ministryTransportProperties.getPlatformState());
item.put("flag", "1");
item.put("updateTime", LocalDateTime.now().format(DATA_TIME_FORMATTER));
- item.put("serviceItem", "网络预约出租汽车服务");
- item.put("servicePromise", "严格遵守国家及地方有关网络预约出租汽车经营的法律法规及行业规范,依法取得相关许可,证照齐全、亮证经营");
- item.put("protocolVersion", DEFAULT_PROTOCOL_VERSION);
+ item.put("serviceItem", ministryTransportProperties.getServiceItem());
+ item.put("servicePromise", ministryTransportProperties.getServicePromise());
+ item.put("protocolVersion", ministryTransportProperties.getProtocolVersion());
return item;
}
private JSONObject buildPlatformOperationScaleInfo() {
JSONObject item = new JSONObject();
- item.put("symbol", DEFAULT_SYMBOL);
- item.put("companyId", companyId);
- item.put("vehicleNum", "1"); //TODO 后续补充完整
- item.put("driverNum", "1"); //TODO 后续补充完整
+ item.put("symbol", ministryTransportProperties.getSymbol());
+ item.put("companyId", ministryTransportProperties.getCompanyId());
+ item.put("vehicleNum", ministryTransportProperties.getOperationScaleVehicleNum());
+ item.put("driverNum", ministryTransportProperties.getOperationScaleDriverNum());
item.put("flag", "1");
item.put("updateTime", LocalDateTime.now().format(DATA_TIME_FORMATTER));
- item.put("protocolVersion", DEFAULT_PROTOCOL_VERSION);
+ item.put("protocolVersion", ministryTransportProperties.getProtocolVersion());
return item;
}
@@ -909,7 +947,7 @@
try {
byte[] bytes = jsonBody.getBytes("UTF-8");
String md5 = hash(new ByteArrayInputStream(bytes));
- HttpPost post = new HttpPost(url);
+ HttpPost post = new HttpPost(ministryTransportProperties.getUrl());
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
post.addHeader("binfile-md5", md5);
post.addHeader("binfile-auth", auth);
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/resources/application-local.yml b/xp-robotaxi-vehicle-convoy-boot/src/main/resources/application-local.yml
index 2b907f0..94504b7 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/resources/application-local.yml
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/resources/application-local.yml
@@ -1,6 +1,10 @@
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ token:
+ secret: iymGhx1XkAAHrex2Zf4ASbiD9P2ksTam
+
+ # 以下为本地数据库/中间件配置,后续迁移至 Nacos
redis:
database: 99
host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
@@ -190,3 +194,46 @@
snowflake:
type: SNOWFLAKE
+ministry:
+ transport:
+ company-id: 4401XPQCB67N
+ symbol: XPQCB67N_S0612018007357G
+ protocol-version: V2.0
+ platform: XPQCB67N
+ key: gEhROt7lg4DEBanR
+ url: https://wycapi.jtj.gz.gov.cn/api/app/common/binapi
+ company-name: 广州易点智慧出行科技有限公司
+ identifier: 91440101MA5AWEB67N
+ contact-phone: 18306304567
+ platform-address-code: 440000
+ business-scope: 网络预约出租汽车客运
+ contact-address: 广州市天河区岑村丰庄大街10号T2
+ economic-type: 159
+ reg-capital: 壹仟万元(人民币)
+ legal-name: 陈志远
+ legal-id: 445221199101121937
+ legal-phone: 15915905487
+ legal-photo-file: 陈志远新复印件.pdf
+ legal-photo-id: ""
+ identifier-photo-file: 易点智慧出行-营副-20250716.pdf
+ platform-state: "0"
+ service-item: 网络预约出租汽车服务
+ service-promise: 严格遵守国家及地方有关网络预约出租汽车经营的法律法规及行业规范,依法取得相关许可,证照齐全、亮证经营
+ operation-scale-vehicle-num: "1"
+ operation-scale-driver-num: "1"
+ vehicle-address-code: 440100
+ owner-name: 广州易点智慧出行科技有限公司
+ trans-agency: 广州市交通运输主管部门
+ trans-area: 广州市
+ fare-type: AA01
+ driver-address-code: 440100
+ driver-region-code: 440100
+ driver-name: 张三
+ driver-id-card: 440106199001010011
+ driver-cert-card: 穗网约字440100000001
+ driver-phone: 13900139000
+ license-id: 440106199001010011
+ vehicle-cert-no: 穗交运管许可440100000001
+ operate-address-code: 440106
+ operate-identifier: 91440101MA5AWEB67N
+
--
Gitblit v1.7.1