From 80f6c17c34dae2c5f9f861e274f4e8d5e2394d5c Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期三, 25 二月 2026 18:00:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java |  154 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 149 insertions(+), 5 deletions(-)

diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
index 1bf9550..bc46af0 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
@@ -1,26 +1,33 @@
 package com.xiaopeng.account.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xiaopeng.account.constant.I18nKeyConstant;
+import com.xiaopeng.account.mapper.SysRoleMapper;
 import com.xiaopeng.account.mapper.XpOperationsRoleMapper;
 import com.xiaopeng.account.mapper.XpOperationsUserMapper;
+import com.xiaopeng.account.model.dto.EnableDisableDTO;
+import com.xiaopeng.account.model.dto.RePasswordDTO;
+import com.xiaopeng.account.model.dto.XpOperationsUserAddDTO;
 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xiaopeng.account.service.IXpQualificationAuditService;
 import com.xiaopeng.api.feignClient.maintenance.XpClockInClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
-import com.xiaopeng.api.model.account.XpOperationsUser;
-import com.xiaopeng.api.model.account.XpQualificationAudit;
+import com.xiaopeng.api.model.account.*;
 import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
-import com.xiaopeng.api.vo.account.FleetInfoVO;
-import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO;
-import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
+import com.xiaopeng.api.vo.account.*;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.exception.ServiceException;
 import com.xiaopeng.common.core.web.page.PageInfo;
+import com.xiaopeng.common.security.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -52,12 +59,16 @@
 
     @Autowired
     private XpOperationsRoleMapper xpOperationsRoleMapper;
+    @Autowired
+    private IXpOperationsRoleService xpOperationsRoleService;
 
     @Autowired
     private XpClockInClient xpClockInClient;
 
     @Autowired
     private IXpQualificationAuditService xpQualificationAuditService;
+    @Autowired
+    private SysRoleMapper sysRoleMapper;
 
     @Override
     public List<XpOperationsUser> listByName(String nickName) {
@@ -168,4 +179,137 @@
         xpQualificationAudit.setAuditStatus(1);
         xpQualificationAuditService.save(xpQualificationAudit);
     }
+
+    @Override
+    public PageInfo<XpOperationsUserVO> pageList(XpOperationsUserQuery query) {
+        PageInfo<XpOperationsUserVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<XpOperationsUserVO> list = this.baseMapper.pageList(pageInfo, query);
+
+        if(CollectionUtils.isEmpty(list)){
+            return pageInfo;
+        }
+
+        // 查询角色名称
+        List<Long> operationsUserIds = list.stream().map(XpOperationsUserVO::getId).collect(Collectors.toList());
+
+        // 查询用户信息
+        List<XpOperationsRole> xpOperationsRoles = xpOperationsRoleMapper.selectList(Wrappers.lambdaQuery(XpOperationsRole.class)
+                .in(XpOperationsRole::getOperationsUserId, operationsUserIds));
+
+        if(!CollectionUtils.isEmpty(xpOperationsRoles)){
+            List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList());
+            // 查询列表关联的所有角色
+            List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery(SysRole.class)
+                    .in(SysRole::getId, roleIds));
+            if(!CollectionUtils.isEmpty(sysRoles)){
+
+                // 角色匹配账号id
+                Map<Long, List<SysRole>> map = new HashMap<>();
+                for (XpOperationsRole xpOperationsRole : xpOperationsRoles) {
+                    List<SysRole> sysRoleList = sysRoles.stream().filter(sysRole -> sysRole.getId().equals(xpOperationsRole.getRoleId())).collect(Collectors.toList());
+                    map.put(xpOperationsRole.getOperationsUserId(), sysRoleList);
+                }
+                // 角色名称匹配
+                for (XpOperationsUserVO xpOperationsUserVO : list) {
+                    xpOperationsUserVO.setSysRoles(map.get(xpOperationsUserVO.getId()));
+                }
+            }
+        }
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public R<String> addOperationsUser(XpOperationsUserAddDTO dto) {
+        long userCount = this.count(Wrappers.lambdaQuery(XpOperationsUser.class)
+                .eq(XpOperationsUser::getPhoneNumber, dto.getPhoneNumber()));
+        if (StringUtils.isNotBlank(dto.getPhoneNumber()) && userCount>0) {
+            throw new ServiceException("登录账号重复", I18nKeyConstant.ACCOUNT_DUPLICATE);
+        }
+        //校验编号是否唯一
+        long numberCount = this.count(Wrappers.lambdaQuery(XpOperationsUser.class)
+                .eq(XpOperationsUser::getUniqueNumber, dto.getUniqueNumber()));
+        if (numberCount > 0) {
+            throw new ServiceException("用户编号已存在", I18nKeyConstant.ACCOUNT_UNIQUE_NUMBER_DUPLICATE);
+        }
+        // 密码加密
+        dto.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
+        // 保存
+        this.save(dto);
+        // 存储角色
+        List<Long> roleIds = dto.getRoleIds();
+        if(!CollectionUtils.isEmpty(roleIds)){
+            List<XpOperationsRole> xpOperationsRoles = roleIds.stream().map(roleId -> {
+                XpOperationsRole xpOperationsRole = new XpOperationsRole();
+                xpOperationsRole.setOperationsUserId(dto.getId());
+                xpOperationsRole.setRoleId(roleId);
+                return xpOperationsRole;
+            }).collect(Collectors.toList());
+            xpOperationsRoleService.saveBatch(xpOperationsRoles);
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R<String> editOperationsUser(XpOperationsUserAddDTO dto) {
+        XpOperationsUser operationsUser = this.getOne(Wrappers.lambdaQuery(XpOperationsUser.class)
+                .eq(XpOperationsUser::getPhoneNumber, dto.getPhoneNumber())
+                .last("LIMIT 1"));
+
+        if (StringUtils.isNotBlank(dto.getPhoneNumber()) && (Objects.nonNull(operationsUser) && !dto.getId().equals(operationsUser.getId()) )) {
+            throw new ServiceException("手机号已开通账号", I18nKeyConstant.ACCOUNT_PHONE_DUPLICATE);
+        }
+        if (dto.getPassword() != null && !dto.getPassword().isEmpty()) {
+            dto.setPassword(null);
+        }
+        this.updateById(dto);
+
+        //删除旧的角色数据,添加新的角色
+        xpOperationsRoleService.remove(new LambdaQueryWrapper<XpOperationsRole>().eq(XpOperationsRole::getOperationsUserId, dto.getId()));
+        // 存储角色
+        List<Long> roleIds = dto.getRoleIds();
+        if(!CollectionUtils.isEmpty(roleIds)){
+            List<XpOperationsRole> xpOperationsRoles = roleIds.stream().map(roleId -> {
+                XpOperationsRole xpOperationsRole = new XpOperationsRole();
+                xpOperationsRole.setOperationsUserId(dto.getId());
+                xpOperationsRole.setRoleId(roleId);
+                return xpOperationsRole;
+            }).collect(Collectors.toList());
+            xpOperationsRoleService.saveBatch(xpOperationsRoles);
+        }
+        return R.ok();
+    }
+
+    @Override
+    public void enableDisableById(EnableDisableDTO dto) {
+        XpOperationsUser operationsUser = this.getById(dto.getId());
+        operationsUser.setStatus(dto.getStatus());
+        this.updateById(operationsUser);
+    }
+
+    @Override
+    public void rePassword(RePasswordDTO dto) {
+        XpOperationsUser operationsUser = this.getById(dto.getId());
+        // 密码加密
+        operationsUser.setPassword(SecurityUtils.encryptPassword(dto.getNewPassword()));
+        this.updateById(operationsUser);
+    }
+
+    @Override
+    public XpOperationsUserVO detailById(Long id) {
+        // 查询用户信息
+        XpOperationsUser xpOperationsUser = this.getById(id);
+        XpOperationsUserVO xpOperationsUserVO = new XpOperationsUserVO();
+        BeanUtils.copyProperties(xpOperationsUser, xpOperationsUserVO);
+        // 查询角色
+        List<XpOperationsRole> xpOperationsRoles = xpOperationsRoleMapper.selectList(Wrappers.lambdaQuery(XpOperationsRole.class)
+                .eq(XpOperationsRole::getOperationsUserId, id));
+        if(!CollectionUtils.isEmpty(xpOperationsRoles)){
+            List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList());
+            List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery(SysRole.class)
+                    .in(SysRole::getId, roleIds));
+            xpOperationsUserVO.setSysRoles(sysRoles);
+        }
+        return xpOperationsUserVO;
+    }
 }

--
Gitblit v1.7.1