From 08ef63eb44102f05c21e5370fd096a7f0cfee20c Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 27 二月 2026 10:05:03 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java |   89 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 89 insertions(+), 0 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 bc46af0..63fbf3c 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
@@ -26,6 +26,7 @@
 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.utils.poi.ExcelUtil;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.common.security.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -35,7 +36,12 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -312,4 +318,87 @@
         }
         return xpOperationsUserVO;
     }
+
+
+    /**
+     * 导出运维人员列表
+     * @param query
+     */
+    @Override
+    public void exportOperationsUser(XpOperationsUserQuery query, HttpServletResponse response) {
+        List<ExportOperationsUserVo> list = this.baseMapper.exportOperationsUser(query);
+
+        // 查询角色名称
+        List<Long> operationsUserIds = list.stream().map(ExportOperationsUserVo::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 (ExportOperationsUserVo xpOperationsUserVO : list) {
+                    xpOperationsUserVO.setRoleName(map.get(xpOperationsUserVO.getId()).stream().map(SysRole::getRoleName).collect(Collectors.joining(";")));
+                }
+            }
+        }
+        ExcelUtil<ExportOperationsUserVo> util = new ExcelUtil<ExportOperationsUserVo>(ExportOperationsUserVo.class);
+        util.exportExcel(response, list, "运维人员管理列表");
+    }
+
+
+    /**
+     * 导入运维人员数据
+     * @param file
+     */
+    @Override
+    public void importOperationsUser(MultipartFile file) {
+        ExcelUtil<ExportOperationsUserVo> util = new ExcelUtil<ExportOperationsUserVo>(ExportOperationsUserVo.class);
+        try {
+            List<ExportOperationsUserVo> list = util.importExcel(file.getInputStream());
+            for (ExportOperationsUserVo exportOperationsUserVo : list) {
+                XpOperationsUser xpOperationsUser = new XpOperationsUser();
+                xpOperationsUser.setNickName(exportOperationsUserVo.getNickName());
+                xpOperationsUser.setUniqueNumber(exportOperationsUserVo.getUniqueNumber());
+                xpOperationsUser.setAvatar(exportOperationsUserVo.getAvatar());
+                xpOperationsUser.setPhoneNumber(exportOperationsUserVo.getPhoneNumber());
+                xpOperationsUser.setRemarks(exportOperationsUserVo.getRemarks());
+                xpOperationsUser.setStatus(true);
+                xpOperationsUser.setIdCardFront(exportOperationsUserVo.getIdCardFront());
+                xpOperationsUser.setIdCardBack(exportOperationsUserVo.getIdCardBack());
+                xpOperationsUser.setDriverLicense(exportOperationsUserVo.getDriverLicense());
+                xpOperationsUser.setCertificateOfNoCriminalRecord(exportOperationsUserVo.getCertificateOfNoCriminalRecord());
+                xpOperationsUser.setTrainingGraduationCertificate(exportOperationsUserVo.getTrainingGraduationCertificate());
+                xpOperationsUser.setDeleted(false);
+                xpOperationsUser.setCreateTime(LocalDateTime.now());
+                xpOperationsUser.setUpdateTime(LocalDateTime.now());
+                this.save(xpOperationsUser);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    /**
+     * 导出模板
+     * @param response
+     */
+    @Override
+    public void exportTemplate(HttpServletResponse response) {
+        ExcelUtil<ExportOperationsUserVo> util = new ExcelUtil<ExportOperationsUserVo>(ExportOperationsUserVo.class);
+        util.exportExcel(response);
+    }
 }

--
Gitblit v1.7.1