xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -8,6 +8,7 @@ import com.xiaopeng.account.model.dto.XpOperationsUserDTO; import com.xiaopeng.account.model.query.XpOperationsUserPageQuery; import com.xiaopeng.account.model.query.XpOperationsUserQuery; import com.xiaopeng.account.service.IXpOperationsRoleService; import com.xiaopeng.account.service.IXpOperationsUserService; import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO; import com.xiaopeng.api.model.account.XpOperationsUser; @@ -97,7 +98,7 @@ if (CollectionUtils.isEmpty(ids)) { return R.ok(new ArrayList<>()); } List<XpOperationsUserWithRoleVO> result = xpOperationsRoleMapper.selectUsersWithRoleByIds(ids); List<XpOperationsUserWithRoleVO> result = xpOperationsUserService.selectUsersWithRoleByIds(ids); return R.ok(result); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpOperationsUserService.java
@@ -114,4 +114,11 @@ * @param file */ void importOperationsUser(MultipartFile file); /** * 根据ID列表批量查询用户及角色信息 * @param ids * @return */ List<XpOperationsUserWithRoleVO> selectUsersWithRoleByIds(List<Long> ids); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
@@ -1,6 +1,7 @@ package com.xiaopeng.account.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -14,6 +15,7 @@ import com.xiaopeng.account.model.dto.XpOperationsUserDTO; import com.xiaopeng.account.model.query.XpOperationsUserPageQuery; import com.xiaopeng.account.model.query.XpOperationsUserQuery; import com.xiaopeng.account.service.ISysRoleService; import com.xiaopeng.account.service.IXpOperationsRoleService; import com.xiaopeng.account.service.IXpOperationsUserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -43,6 +45,7 @@ import java.io.InputStream; import java.time.LocalDateTime; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** @@ -75,6 +78,8 @@ private IXpQualificationAuditService xpQualificationAuditService; @Autowired private SysRoleMapper sysRoleMapper; @Autowired private ISysRoleService iSysRoleService; @Override public List<XpOperationsUser> listByName(String nickName) { @@ -159,19 +164,13 @@ // 8. 查询角色信息 List<XpOperationsUserWithRoleVO> userWithRoles = xpOperationsRoleMapper.selectUsersWithRoleByIds(Collections.singletonList(userId)); if (!CollectionUtils.isEmpty(userWithRoles)) { List<XpOperationsUserProfileVO.RoleInfoVO> roleVOs = userWithRoles.stream() .filter(r -> r.getRoleId() != null) .map(r -> { XpOperationsUserProfileVO.RoleInfoVO roleVO = new XpOperationsUserProfileVO.RoleInfoVO(); roleVO.setRoleId(r.getRoleId()); roleVO.setRoleName(r.getRoleName()); return roleVO; }) XpOperationsUserWithRoleVO operationsUserWithRoleVO = userWithRoles.get(0); if (CollUtil.isNotEmpty(operationsUserWithRoleVO.getRoles())) { List<XpOperationsUserProfileVO.RoleInfoVO> roleVOs = operationsUserWithRoleVO.getRoles().stream() .map(item -> BeanUtil.copyProperties(item, XpOperationsUserProfileVO.RoleInfoVO.class)) .collect(Collectors.toList()); vo.setRoles(roleVOs); } return vo; } @@ -378,4 +377,73 @@ ExcelUtil<ExportOperationsUserVo> util = new ExcelUtil<ExportOperationsUserVo>(ExportOperationsUserVo.class); util.importTemplateExcel(response, "运维人员管理列表"); } @Override public List<XpOperationsUserWithRoleVO> selectUsersWithRoleByIds(List<Long> ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } List<XpOperationsUser> operationsUsers = listByIds(ids); if (CollUtil.isEmpty(operationsUsers)) { return Collections.emptyList(); } // 查询用户角色信息 List<Long> userIds = operationsUsers.stream() .map(XpOperationsUser::getId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); if (CollUtil.isEmpty(userIds)) { return Collections.emptyList(); } // 获取关联角色ids List<XpOperationsRole> operationsRoles = xpOperationsRoleMapper.selectList( Wrappers.lambdaQuery(XpOperationsRole.class) .in(XpOperationsRole::getOperationsUserId, userIds) ); // userId -> 该用户关联的 roleId 列表 Map<Long, List<Long>> userRoleIdsMap = CollUtil.isNotEmpty(operationsRoles) ? operationsRoles.stream() .filter(r -> r.getOperationsUserId() != null && r.getRoleId() != null) .collect(Collectors.groupingBy( XpOperationsRole::getOperationsUserId, Collectors.mapping(XpOperationsRole::getRoleId, Collectors.collectingAndThen(Collectors.toList(), list -> list.stream().distinct().collect(Collectors.toList()))) )) : Collections.emptyMap(); // 一次性查出所有角色 List<Long> roleIds = userRoleIdsMap.values().stream() .flatMap(Collection::stream) .distinct() .collect(Collectors.toList()); Map<Long, SysRole> roleMap = CollUtil.isNotEmpty(roleIds) ? iSysRoleService.listByIds(roleIds).stream() .collect(Collectors.toMap(SysRole::getId, Function.identity(), (a, b) -> a)) : Collections.emptyMap(); // 组装 VO:每个用户对应角色列表 return operationsUsers.stream().map(u -> { Long uid = u.getId(); List<Long> roleIdList = userRoleIdsMap.getOrDefault(uid, Collections.emptyList()); List<SysRole> roles = roleIdList.stream() .map(roleMap::get) .filter(Objects::nonNull) .collect(Collectors.toList()); // 根据你的 VO 字段调整 XpOperationsUserWithRoleVO vo = BeanUtil.copyProperties(u, XpOperationsUserWithRoleVO.class); vo.setRoles(roles); return vo; }).collect(Collectors.toList()); } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpElectronicFence.java
@@ -4,13 +4,13 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserWithRoleVO.java
@@ -1,10 +1,13 @@ package com.xiaopeng.api.vo.account; import com.xiaopeng.api.model.account.SysRole; import com.xiaopeng.api.model.account.XpOperationsUser; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * 运维人员及角色信息视图对象 @@ -16,9 +19,6 @@ @ApiModel("运维人员及角色信息视图对象") public class XpOperationsUserWithRoleVO extends XpOperationsUser { @ApiModelProperty(value = "角色id") private Long roleId; @ApiModelProperty(value = "角色名称") private String roleName; @ApiModelProperty(value = "关联角色") private List<SysRole> roles; } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpClockInServiceImpl.java
@@ -1,8 +1,10 @@ package com.xiaopeng.maintenance.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.feignClient.account.XpOperationUserClient; import com.xiaopeng.api.model.account.SysRole; import com.xiaopeng.api.model.account.XpOperationsRole;import com.xiaopeng.api.model.account.XpOperationsUser;import com.xiaopeng.api.model.maintenance.XpCheckLocation; import com.xiaopeng.api.model.maintenance.XpClockIn; import com.xiaopeng.api.model.maintenance.XpShift; @@ -41,6 +43,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; /** @@ -253,17 +256,19 @@ List<String> appUserIdList = clockInStatistics.stream().map(ClockInStatisticsDto::getAppUserId).collect(Collectors.toList()); List<Long> ids = appUserIdList.stream().map(Long::parseLong).collect(Collectors.toList()); List<XpOperationsUserWithRoleVO> data = xpOperationUserClient.listByIdsWithRole(ids).getData(); Map<Long, XpOperationsUserWithRoleVO> userMap = data.stream().collect(Collectors.toMap(XpOperationsUserWithRoleVO::getId, Function.identity())); //将查询结果组装成map对象,用于循环中提取数据 for (ClockInStatisticsDto clockInStatistic : clockInStatistics) { String appUserId = clockInStatistic.getAppUserId(); //运维账号可以拥有多个角色 List<XpOperationsUserWithRoleVO> collect = data.stream().filter(x->x.getId().equals(Long.parseLong(appUserId))).collect(Collectors.toList()); if(!collect.isEmpty()){ XpOperationsUserWithRoleVO xpOperationsUserWithRoleVO = collect.get(0); clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName()); if(CollUtil.isNotEmpty(userMap)){ XpOperationsUserWithRoleVO vo = userMap.get(Long.parseLong(appUserId)); if (Objects.nonNull(vo)) { clockInStatistic.setName(vo.getNickName()); String roleName = vo.getRoles().stream().map(SysRole::getRoleName).collect(Collectors.joining(";")); clockInStatistic.setRoleName(roleName); } } String roleName = collect.stream().map(XpOperationsUserWithRoleVO::getRoleName).collect(Collectors.joining(";")); clockInStatistic.setRoleName(roleName); Integer shouldClockInDays = clockInStatistic.getShouldClockInDays(); Integer clockInDays = clockInStatistic.getClockInDays(); clockInStatistic.setNotClockInDays(shouldClockInDays - clockInDays); @@ -311,16 +316,18 @@ List<String> appUserIdList = clockInStatistics.stream().map(ClockInStatisticsDto::getAppUserId).collect(Collectors.toList()); List<Long> ids = appUserIdList.stream().map(Long::parseLong).collect(Collectors.toList()); List<XpOperationsUserWithRoleVO> data = xpOperationUserClient.listByIdsWithRole(ids).getData(); Map<Long, XpOperationsUserWithRoleVO> userMap = data.stream().collect(Collectors.toMap(XpOperationsUserWithRoleVO::getId, Function.identity())); for (ClockInStatisticsDto clockInStatistic : clockInStatistics) { String appUserId = clockInStatistic.getAppUserId(); //运维账号可以拥有多个角色 List<XpOperationsUserWithRoleVO> collect = data.stream().filter(x->x.getId().equals(Long.parseLong(appUserId))).collect(Collectors.toList()); if(!collect.isEmpty()){ XpOperationsUserWithRoleVO xpOperationsUserWithRoleVO = collect.get(0); clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName()); if(CollUtil.isNotEmpty(userMap)){ XpOperationsUserWithRoleVO vo = userMap.get(Long.parseLong(appUserId)); if (Objects.nonNull(vo)) { clockInStatistic.setName(vo.getNickName()); String roleName = vo.getRoles().stream().map(SysRole::getRoleName).collect(Collectors.joining(";")); clockInStatistic.setRoleName(roleName); } } String roleName = collect.stream().map(XpOperationsUserWithRoleVO::getRoleName).collect(Collectors.joining(";")); clockInStatistic.setRoleName(roleName); Integer shouldClockInDays = clockInStatistic.getShouldClockInDays(); Integer clockInDays = clockInStatistic.getClockInDays(); clockInStatistic.setNotClockInDays(shouldClockInDays - clockInDays); @@ -356,7 +363,7 @@ //将查询结果组装成map对象,用于循环中提取数据 for (ClockInStatisticsDetailsDto clockInStatistic : clockInStatisticsDetails) { clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName()); clockInStatistic.setRoleName(xpOperationsUserWithRoleVO.getRoleName()); clockInStatistic.setRoleName(xpOperationsUserWithRoleVO.getRoles().stream().map(SysRole::getRoleName).collect(Collectors.joining(";"))); } pageInfo.setRecords(clockInStatisticsDetails); return pageInfo; @@ -385,7 +392,7 @@ //将查询结果组装成map对象,用于循环中提取数据 for (ClockInStatisticsDetailsDto clockInStatistic : clockInStatisticsDetails) { clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName()); clockInStatistic.setRoleName(xpOperationsUserWithRoleVO.getRoleName()); clockInStatistic.setRoleName(xpOperationsUserWithRoleVO.getRoles().stream().map(SysRole::getRoleName).collect(Collectors.joining(";"))); } ExcelUtil<ClockInStatisticsDetailsDto> excel = new ExcelUtil<ClockInStatisticsDetailsDto>(ClockInStatisticsDetailsDto.class); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/dto/XpTradingStrategyEditDTO.java
@@ -1,5 +1,6 @@ package com.xiaopeng.operation.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.api.model.operation.XpTradingStrategyCity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -37,9 +38,11 @@ private Boolean isLongValid; @ApiModelProperty(value = "豁免开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime exemptionStartTime; @ApiModelProperty(value = "豁免结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime exemptionEndTime; @ApiModelProperty(value = "豁免角色 逗号分割 0=全部 1=新客 2=老客 3=流失召回 4=媒体") xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -508,8 +508,8 @@ */ private void cancelOrder(XpOrder order) { // 1. 更新订单状态为已取消(0) order.setStatus(0); this.updateById(order); lambdaUpdate().set(XpOrder::getStatus, 0) .eq(XpOrder::getId, order.getId()).update(); // 2. 保存取消记录 XpOrderCancel orderCancel = new XpOrderCancel(); xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpFleetServiceImpl.java
@@ -8,6 +8,7 @@ import com.xiaopeng.api.feignClient.maintenance.XpCheckLocationClient; import com.xiaopeng.api.feignClient.operation.XpElectronicClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.account.SysRole; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.maintenance.XpCheckLocation; import com.xiaopeng.api.model.operation.XpElectronicFence; @@ -452,7 +453,7 @@ vo.setNickName(user.getNickName()); vo.setPhoneNumber(user.getPhoneNumber()); vo.setJobNumber(user.getUniqueNumber()); vo.setRoleName(user.getRoleName()); vo.setRoleName(user.getRoles().stream().map(SysRole::getRoleName).collect(Collectors.joining(","))); records.add(vo); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleAnnualRecordServiceImpl.java
@@ -39,6 +39,7 @@ wrapper.ge(XpVehicleAnnualRecord::getCreateTime, LocalDateTime.of(query.getEndTime(), LocalTime.MAX)); } wrapper.like(StringUtils.isNotBlank(query.getOperationsUserName()), XpVehicleAnnualRecord::getCreateBy, query.getOperationsUserName()); wrapper.orderByDesc(XpVehicleAnnualRecord::getCreateTime); return this.page(page, wrapper); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -502,8 +502,7 @@ // 批量将运营车辆转为在库状态(vehicleType: 2→1) LambdaUpdateWrapper<XpVehicle> wrapper = new LambdaUpdateWrapper<>(); wrapper.in(XpVehicle::getId, ids) .set(XpVehicle::getVehicleType, 1) .set(XpVehicle::getOperatingStatus, null); .set(XpVehicle::getVehicleType, 1); this.update(wrapper); }