xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
@@ -78,7 +78,7 @@ @PostMapping("base/v1/operationPasswordLogin") public R<?> operationPasswordLogin(@RequestBody AppLoginPasswordDTO appLoginPasswordDTO, HttpServletRequest request) { // 用户登录 LoginOperationUser userInfo = sysLoginService.operationPasswordLogin(appLoginPasswordDTO.getPhoneNumber(), appLoginPasswordDTO.getPassword(), 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(); @@ -94,7 +94,7 @@ @PostMapping("base/v1/verificationCodeLogin") public R<?> verificationCodeLogin(@RequestBody AppLoginCodeDTO appLoginCodeDTO, HttpServletRequest request) { // 用户登录 LoginOperationUser userInfo = sysLoginService.verificationCodeLogin(appLoginCodeDTO.getPhoneNumber(), appLoginCodeDTO.getVerificationCode(), 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(); xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
@@ -7,7 +7,6 @@ import com.xiaopeng.api.dto.operation.UpdatePasswordDTO; import com.xiaopeng.api.model.account.SysUser; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.operation.SysMenu; import com.xiaopeng.api.vo.account.LoginOperationUser; import com.xiaopeng.api.vo.account.LoginUser; import com.xiaopeng.common.core.constant.CacheConstants; @@ -26,9 +25,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 登录校验方法 @@ -150,7 +147,7 @@ recordLogService.recordLogininfor(request, sysUser.getId().intValue(), username, Constants.LOGIN_SUCCESS_STATUS, "注册成功"); } public LoginOperationUser operationPasswordLogin(String phoneNumber, String password, HttpServletRequest request) { public LoginOperationUser operationPasswordLogin(String phoneNumber, String password, Integer deviceType, HttpServletRequest request) { LoginOperationUser loginOperationUser = new LoginOperationUser(); phoneNumber = phoneNumber.trim(); // 查询运维用户信息 @@ -171,9 +168,12 @@ } passwordService.validateOperationsUser(operationsUser, password, request); loginOperationUser.setXpOperationsUser(operationsUser); //更新用户登录设备类型 operationsUser.setDeviceType(deviceType); operationsUserService.updateById(operationsUser); return loginOperationUser; } public LoginOperationUser verificationCodeLogin(String phoneNumber, String code, HttpServletRequest request) { public LoginOperationUser verificationCodeLogin(String phoneNumber, String code, Integer deviceType, HttpServletRequest request) { LoginOperationUser loginOperationUser = new LoginOperationUser(); phoneNumber = phoneNumber.trim(); // 查询运维用户信息 @@ -201,6 +201,9 @@ } loginOperationUser.setXpOperationsUser(operationsUser); //更新用户登录设备类型 operationsUser.setDeviceType(deviceType); operationsUserService.updateById(operationsUser); return loginOperationUser; } public Boolean verificationCodeUpdate(UpdatePasswordDTO updatePasswordDTO, HttpServletRequest request) { xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/AppLoginCodeDTO.java
@@ -13,4 +13,7 @@ private String phoneNumber; @ApiModelProperty(value = "验证码") private String verificationCode; @ApiModelProperty(value = "设备类型 1-Android 2-iOS") private Integer deviceType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/AppLoginPasswordDTO.java
@@ -13,4 +13,7 @@ private String phoneNumber; @ApiModelProperty(value = "密码") private String password; @ApiModelProperty(value = "设备类型 1-Android 2-iOS") private Integer deviceType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpOperationsUser.java
@@ -69,4 +69,6 @@ @ApiModelProperty(value = "培训结业证") private String trainingGraduationCertificate; @ApiModelProperty(value = "设备类型 1-Android 2-iOS") private Integer deviceType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpCruisePlan.java
@@ -1,10 +1,13 @@ package com.xiaopeng.api.model.operation; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -24,7 +27,7 @@ @Accessors(chain = true) @TableName("xp_cruise_plan") @ApiModel(value="XpCruisePlan对象", description="巡游计划") public class XpCruisePlan implements Serializable { public class XpCruisePlan extends BaseModel { private static final long serialVersionUID = 1L; @@ -35,20 +38,13 @@ @ApiModelProperty(value = "计划名称") private String planName; @ApiModelProperty(value = "是否删除 0=未删除 1=已删除") private Boolean isDeleted; @ApiModelProperty(value = "关联点位数") @TableField(exist = false) private Integer pointNum; @ApiModelProperty(value = "创建时间") private LocalDateTime createTime; @ApiModelProperty(value = "修改时间") private LocalDateTime updateTime; @ApiModelProperty(value = "创建人") private String createBy; @ApiModelProperty(value = "修改人") private String updateBy; @ApiModelProperty(value = "关联车辆数") @TableField(exist = false) private Integer vehicleNum; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpCruisePlanPoint.java
@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -38,23 +40,10 @@ @ApiModelProperty(value = "点位ID") private Integer pointId; @ApiModelProperty(value = " 排序") @ApiModelProperty(value = "排序") private Integer sortOrder; @ApiModelProperty(value = "是否删除 0=未删除 1=已删除") private Boolean isDeleted; @ApiModelProperty(value = "创建时间") private LocalDateTime createTime; @ApiModelProperty(value = "修改时间") private LocalDateTime updateTime; @ApiModelProperty(value = "创建人") private String createBy; @ApiModelProperty(value = "修改人") private String updateBy; @ApiModelProperty(value = "是否停车 0-否 1-是") private Integer stopFlag; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpCruisePlanVehicle.java
@@ -5,6 +5,8 @@ import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -28,30 +30,10 @@ private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "巡游计划ID") private Long cruisePlanId; @ApiModelProperty(value = "车辆ID") private Long vehicleId; @ApiModelProperty(value = "是否删除 0=未删除 1=已删除") private Boolean isDeleted; @ApiModelProperty(value = "创建时间") private LocalDateTime createTime; @ApiModelProperty(value = "修改时间") private LocalDateTime updateTime; @ApiModelProperty(value = "创建人") private String createBy; @ApiModelProperty(value = "修改人") private String updateBy; } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
@@ -1,6 +1,16 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.api.model.operation.XpCruisePlan; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.operation.query.CruisePlanQuery; import com.xiaopeng.operation.service.IXpCruisePlanService; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -14,6 +24,15 @@ * @since 2026-02-26 */ @RestController @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpCruisePlanController { private final IXpCruisePlanService xpCruisePlanService; @ApiOperation(value = "获取巡游计划分页列表", tags = {"管理后台-巡游计划"}) @PostMapping(value = {"/api/v1/xp-cruise-plan/pageList"}) public R<PageInfo<XpCruisePlan>> getPageList(@RequestBody CruisePlanQuery query){ return R.ok(xpCruisePlanService.getPageList(query)); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/CruisePlanQuery.java
New file @@ -0,0 +1,22 @@ package com.xiaopeng.operation.query; import com.xiaopeng.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * @author MiTao * @date 2026-02-26 14:32 * */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "巡游计划分页查询对象") public class CruisePlanQuery extends BasePage { @ApiModelProperty(value = "反馈内容") private String planName; } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/UserFeedBackQuery.java
@@ -15,6 +15,7 @@ @EqualsAndHashCode(callSuper = true) @ApiModel(value = "用户反馈分页查询对象") public class UserFeedBackQuery extends BasePage { @ApiModelProperty(value = "反馈内容") private String feedbackContent; xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpCruisePlanService.java
@@ -2,6 +2,8 @@ import com.xiaopeng.api.model.operation.XpCruisePlan; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.operation.query.CruisePlanQuery; /** * <p> @@ -13,4 +15,10 @@ */ public interface IXpCruisePlanService extends IService<XpCruisePlan> { /** * 获取巡游计划分页列表 * @param query * @return */ PageInfo<XpCruisePlan> getPageList(CruisePlanQuery query); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpCruisePlanServiceImpl.java
@@ -1,10 +1,26 @@ package com.xiaopeng.operation.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xiaopeng.api.model.operation.XpCruisePlan; import com.xiaopeng.api.model.operation.XpCruisePlanPoint; import com.xiaopeng.api.model.operation.XpCruisePlanVehicle; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.operation.mapper.XpCruisePlanMapper; import com.xiaopeng.operation.query.CruisePlanQuery; import com.xiaopeng.operation.service.IXpCruisePlanPointService; import com.xiaopeng.operation.service.IXpCruisePlanService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.operation.service.IXpCruisePlanVehicleService; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> @@ -15,6 +31,32 @@ * @since 2026-02-26 */ @Service @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpCruisePlanServiceImpl extends ServiceImpl<XpCruisePlanMapper, XpCruisePlan> implements IXpCruisePlanService { private final IXpCruisePlanPointService xpCruisePlanPointService; private final IXpCruisePlanVehicleService xpCruisePlanVehicleService; @Override public PageInfo<XpCruisePlan> getPageList(CruisePlanQuery query) { PageInfo<XpCruisePlan> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); Page<XpCruisePlan> page = lambdaQuery() .like(StringUtils.isNotBlank(query.getPlanName()), XpCruisePlan::getPlanName, query.getPlanName()) .orderByDesc(XpCruisePlan::getCreateTime) .page(pageInfo); //收集巡游计划ID List<Long> planIds = page.getRecords().stream().map(XpCruisePlan::getId).collect(Collectors.toList()); // 批量查询巡游计划点位和车辆信息,并组装到巡游计划对象中 Map<Long, List<XpCruisePlanPoint>> pointMap = CollUtil.isNotEmpty(planIds) ? xpCruisePlanPointService.lambdaQuery().in(XpCruisePlanPoint::getCruisePlanId, planIds) .list().stream().collect(Collectors.groupingBy(XpCruisePlanPoint::getCruisePlanId)) : Collections.emptyMap(); Map<Long, List<XpCruisePlanVehicle>> vehicleMap = CollUtil.isNotEmpty(planIds) ? xpCruisePlanVehicleService.lambdaQuery().in(XpCruisePlanVehicle::getCruisePlanId, planIds) .list().stream().collect(Collectors.groupingBy(XpCruisePlanVehicle::getCruisePlanId)) : Collections.emptyMap(); page.getRecords().forEach(plan -> { plan.setPointNum(pointMap.get(plan.getId()).size()); plan.setVehicleNum(vehicleMap.get(plan.getId()).size()); }); pageInfo.setRecords(page.getRecords()); return pageInfo; } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -4,7 +4,7 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -12,6 +12,7 @@ import com.google.common.collect.ImmutableMap; import com.xiaopeng.api.dto.account.GetUserCouponDto; import com.xiaopeng.api.dto.account.UseUserCouponDto; import com.xiaopeng.api.dto.account.UserResourcesDto; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.GetOrderNumDto; @@ -23,6 +24,7 @@ import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO; import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; import com.xiaopeng.api.feignClient.account.UserResourcesClient; import com.xiaopeng.api.feignClient.account.XpAppUserClient; import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; @@ -43,6 +45,7 @@ import com.xiaopeng.api.model.vehicleConvoy.XpFleet; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.OrderType; import com.xiaopeng.api.vo.account.GetUserListByUidsVo; import com.xiaopeng.api.vo.account.UserCouponVo; import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.OrderOperationType; import com.xiaopeng.api.vo.operation.RouteVo; @@ -50,6 +53,7 @@ import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo; import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo; import com.xiaopeng.common.core.constant.CacheConstants; import com.xiaopeng.common.core.constant.HttpStatus; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.enums.OrderStatusEnum; import com.xiaopeng.common.core.enums.PushMessageTypeEnum; @@ -122,7 +126,7 @@ @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpOrderServiceImpl extends ServiceImpl<XpOrderMapper, XpOrder> implements IXpOrderService { private final XpAppUserClient xpAppUserClient; private final UserResourcesClient userResourcesClient; private final XpPointClient xpPointClient; private final XpVehicleClient xpVehicleClient; private final XpAppUserCouponClient xpAppUserCouponClient; @@ -212,13 +216,13 @@ } // 4. 批量查询关联数据 Map<Long, XpAppUser> userMap = batchGetUsers(userIds); JSONObject jsonObject = batchGetUsers(userIds); Map<Long, XpVehicle> vehicleMap = batchGetVehicles(vehicleIds); Map<Long, XpFleet> fleetMap = batchGetFleets(fleetIds); // 5. 组装 VO List<XpOrderPageVO> voList = pageResult.getRecords().stream() .map(order -> convertToPageVO(order, userMap, vehicleMap, fleetMap)) .map(order -> convertToPageVO(order, jsonObject, vehicleMap, fleetMap)) .collect(Collectors.toList()); // 6. 返回分页结果 @@ -241,11 +245,11 @@ // 3. 获取用户信息 if (Objects.nonNull(order.getAppUserId())) { Map<Long, XpAppUser> userMap = batchGetUsers(Collections.singleton(order.getAppUserId())); XpAppUser user = userMap.get(order.getAppUserId()); if (Objects.nonNull(user)) { vo.setNickName(user.getNickName()); vo.setPhoneNumber(user.getPhoneNumber()); JSONObject jsonObject = batchGetUsers(Collections.singleton(order.getAppUserId())); JSONObject userInfo = jsonObject.getJSONObject(order.getAppUserId().toString()); if (Objects.nonNull(userInfo)) { vo.setNickName(userInfo.getString("nickName")); vo.setPhoneNumber(userInfo.getString("mobile")); } } @@ -320,13 +324,13 @@ } // 4. 批量查询关联数据 Map<Long, XpAppUser> userMap = batchGetUsers(userIds); JSONObject jsonObject = batchGetUsers(userIds); Map<Long, XpVehicle> vehicleMap = batchGetVehicles(vehicleIds); Map<Long, XpFleet> fleetMap = batchGetFleets(fleetIds); // 5. 组装 VO return orderList.stream() .map(order -> convertToPageVO(order, userMap, vehicleMap, fleetMap)) .map(order -> convertToPageVO(order, jsonObject, vehicleMap, fleetMap)) .collect(Collectors.toList()); } @@ -355,20 +359,22 @@ /** * 批量获取用户信息 */ private Map<Long, XpAppUser> batchGetUsers(Set<Long> userIds) { private JSONObject batchGetUsers(Set<Long> userIds) { if (CollectionUtils.isEmpty(userIds)) { return new HashMap<>(); return new JSONObject(); } try { R<List<XpAppUser>> result = xpAppUserClient.listByIds(new ArrayList<>(userIds)); if (Objects.nonNull(result) && Objects.nonNull(result.getData())) { return result.getData().stream() .collect(Collectors.toMap(XpAppUser::getId, Function.identity(), (a, b) -> a)); GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo(); getUserListByUidsVo.setUids(new ArrayList<>(userIds)); getUserListByUidsVo.setGetPreCarOwner(Boolean.TRUE); UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo); if (userListByUids.getCode().equals(HttpStatus.SUCCESS)) { return JSONObject.parseObject(userListByUids.getData().toString()); } } catch (Exception e) { log.error("批量获取用户信息失败: {}", e.getMessage()); } return new HashMap<>(); return new JSONObject(); } /** @@ -452,7 +458,7 @@ * 转换为分页列表 VO */ private XpOrderPageVO convertToPageVO(XpOrder order, Map<Long, XpAppUser> userMap, JSONObject jsonObject, Map<Long, XpVehicle> vehicleMap, Map<Long, XpFleet> fleetMap) { XpOrderPageVO vo = new XpOrderPageVO(); @@ -467,10 +473,10 @@ vo.setStatus(order.getStatus()); // 用户信息 if (Objects.nonNull(order.getAppUserId()) && userMap.containsKey(order.getAppUserId())) { XpAppUser user = userMap.get(order.getAppUserId()); vo.setNickName(user.getNickName()); vo.setPhoneNumber(user.getPhoneNumber()); if (Objects.nonNull(order.getAppUserId()) && jsonObject.containsKey(order.getAppUserId().toString())) { JSONObject userInfo = jsonObject.getJSONObject(order.getAppUserId().toString()); vo.setNickName(userInfo.getString("nickName")); vo.setPhoneNumber(userInfo.getString("mobile")); } // 车辆信息