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-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java |  127 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 122 insertions(+), 5 deletions(-)

diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
index 6866bdb..1d409f9 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -1,6 +1,7 @@
 package com.xiaopeng.account.controller;
 
 
+import cn.hutool.core.util.DesensitizedUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.xiaopeng.account.constant.I18nKeyConstant;
@@ -11,20 +12,29 @@
 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.IXpOperationsUserService;
 import com.xiaopeng.account.service.IXpQualificationAuditService;
 import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO;
+import com.xiaopeng.api.feignClient.account.SysGroupMenuClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient;
+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.account.XpQualificationAudit;
 import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
 import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
+import com.xiaopeng.api.vo.account.LoginUser;
 import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO;
 import com.xiaopeng.api.vo.account.XpOperationsUserVO;
 import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.exception.ServiceException;
+import com.xiaopeng.common.core.utils.SensitiveDataCryptoUtil;
 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.security.service.TokenService;
 import com.xiaopeng.evi.oss.service.AliOssService;
 import io.swagger.annotations.ApiOperation;
@@ -37,7 +47,12 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
+import com.xiaopeng.common.log.annotation.AdminOperationLog;
+import com.xiaopeng.common.log.enums.AdminBusinessType;
+import com.xiaopeng.common.log.enums.AdminOperationType;
 
 /**
  * <p>
@@ -64,6 +79,11 @@
     @Resource
     private IXpQualificationAuditService xpQualificationAuditService;
 
+    @Resource
+    private ISysRoleService sysRoleService;
+    @Resource
+    private SysGroupMenuClient groupMenuClient;
+
     @Autowired
     public XpOperationsUserController(IXpOperationsUserService xpOperationsUserService,
                                       XpOperationsRoleMapper xpOperationsRoleMapper,
@@ -84,11 +104,13 @@
      */
     @PostMapping("/logan/inner/xpOperationsUser/listByIds")
     public R<List<XpOperationsUser>> listByIds(@RequestBody List<Long> ids) {
-        return R.ok(xpOperationsUserService.listByIds(ids));
+        List<XpOperationsUser> users = xpOperationsUserService.listByIds(ids);
+        users.forEach(user -> user.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(user.getPhoneNumber())));
+        return R.ok(users);
     }
 
     @PostMapping("/logan/inner/xpOperationsUser/pageListByIds")
-    public R<List<XpOperationsUserWithRoleVO>> pageListByIds(@RequestBody OptionalUsersPageListQuery q) {
+    public R<PageInfo<XpOperationsUserWithRoleVO>> pageListByIds(@RequestBody OptionalUsersPageListQuery q) {
         return R.ok(xpOperationsUserService.pageListByIds(q));
     }
 
@@ -103,7 +125,32 @@
      */
     @GetMapping("/logan/inner/xpOperationsUser/queryById")
     R<XpOperationsUser> queryById(@RequestParam Long id) {
-        return R.ok(xpOperationsUserService.getById(id));
+        XpOperationsUser operationsUser = xpOperationsUserService.getById(id);
+        XpOperationsRole operationsUserId = xpOperationsRoleMapper.selectOne(new QueryWrapper<XpOperationsRole>().eq("operations_user_id", id));
+        SysRole sysRole = sysRoleService.getById(operationsUserId.getRoleId());
+        operationsUser.setRoleName(sysRole.getRoleName());
+        operationsUser.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(operationsUser.getPhoneNumber()));
+        return R.ok(operationsUser);
+    }
+
+    /**
+     * 根据ID查询运维用户信息
+     * @return 用户列表
+     */
+    @GetMapping("/logan/inner/xpOperationsUser/queryByIds")
+    R<List<XpOperationsUser>> queryByIds(@RequestParam String operationsUserId) {
+        List<Long> ids = Arrays.stream(operationsUserId.split(","))
+                .map(Long::parseLong)
+                .collect(Collectors.toList());
+        List<XpOperationsUser> operationsUser = xpOperationsUserService.listByIds(ids);
+        for (XpOperationsUser xpOperationsUser : operationsUser) {
+            XpOperationsRole role = xpOperationsRoleMapper.selectOne(new QueryWrapper<XpOperationsRole>().eq("operations_user_id", xpOperationsUser.getId()));
+            SysRole sysRole = sysRoleService.getById(role.getRoleId());
+            xpOperationsUser.setRoleName(sysRole.getRoleName());
+            xpOperationsUser.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(xpOperationsUser.getPhoneNumber()));
+        }
+
+        return R.ok(operationsUser);
     }
 
     /**
@@ -152,8 +199,10 @@
         List<XpOperationsUserWithRoleVO> result = xpOperationsRoleMapper.selectUsersByConditions(
                 dto.getNickName(),
                 dto.getPhoneNumber(),
+                SensitiveDataCryptoUtil.queryValues(dto.getPhoneNumber()),
                 dto.getRoleId()
         );
+        result.forEach(user -> user.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(user.getPhoneNumber())));
         return R.ok(result);
     }
 
@@ -216,7 +265,13 @@
     @ApiOperation(value = "运维人员管理分页列表", tags = {"管理后台-运维执行"})
     @PostMapping("/api/v1/operationsUser/pageList")
     public R<PageInfo<XpOperationsUserVO>> pageList(@RequestBody XpOperationsUserQuery query) {
+        LoginUser loginUser = tokenService.getLoginUser();
         PageInfo<XpOperationsUserVO> pageList = xpOperationsUserService.pageList(query);
+        if(!loginUser.getPhoneDesensitizationExempt()){
+            for (XpOperationsUserVO record : pageList.getRecords()) {
+                record.setPhoneNumber(DesensitizedUtil.mobilePhone(record.getPhoneNumber()));
+            }
+        }
         return R.ok(pageList);
     }
 
@@ -224,6 +279,10 @@
     @PostMapping("/api/v1/operationsUser/listAll")
     public R<List<XpOperationsUser>> listAll() {
         List<XpOperationsUser> listAll = xpOperationsUserService.list();
+        listAll.forEach(user -> user.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(user.getPhoneNumber())));
+        for (XpOperationsUser xpOperationsUser : listAll) {
+            // todo 需要上传工单id,根据距离进行排序
+        }
         return R.ok(listAll);
     }
 
@@ -237,23 +296,42 @@
         List<XpOperationsUser> users = xpOperationsUserService.lambdaQuery()
                 .eq(XpOperationsUser::getStatus, true)
                 .list();
+        users.forEach(user -> user.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(user.getPhoneNumber())));
         return R.ok(users);
     }
 
     @ApiOperation(value = "运维人员管理新增", tags = {"管理后台-运维执行"})
     @PostMapping("/api/v1/operationsUser/add")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.ADD,
+            content = "新增运维人员",
+            appendRequestData = true
+    )
     public R<String> add(@RequestBody XpOperationsUserAddDTO dto) {
         return xpOperationsUserService.addOperationsUser(dto);
     }
 
     @ApiOperation(value = "运维人员管理编辑", tags = {"管理后台-运维执行"})
     @PostMapping("/api/v1/operationsUser/edit")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.EDIT,
+            content = "编辑运维人员",
+            appendRequestData = true
+    )
     public R<String> edit(@RequestBody XpOperationsUserAddDTO dto) {
         return xpOperationsUserService.editOperationsUser(dto);
     }
 
     @ApiOperation(value = "运维人员管理启用禁用", tags = {"管理后台-运维执行"})
     @PostMapping("/api/v1/operationsUser/enableDisableById")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.SWITCH_STATUS,
+            content = "运维人员管理启用禁用",
+            appendRequestData = true
+    )
     public R<String> enableDisableById(@RequestBody EnableDisableDTO dto) {
         xpOperationsUserService.enableDisableById(dto);
         return R.ok();
@@ -261,6 +339,12 @@
 
     @ApiOperation(value = "运维人员管理删除", tags = {"管理后台-运维执行"})
     @DeleteMapping("/api/v1/operationsUser/deleteById")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.DELETE,
+            content = "删除运维人员",
+            appendRequestData = true
+    )
     public R<String> deleteById(@RequestParam Long id) {
         try {
             R<XpFleet> fleetResult = xpFleetClient.getFleetByOperationsUserId(id);
@@ -289,6 +373,12 @@
 
     @ApiOperation(value = "运维人员管理重置密码", tags = {"管理后台-运维执行"})
     @PostMapping("/api/v1/operationsUser/rePassword")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.RESET_PASSWORD,
+            content = "重置运维人员密码",
+            appendRequestData = true
+    )
     public R<String> rePassword(@RequestBody RePasswordDTO dto) {
         xpOperationsUserService.rePassword(dto);
         return R.ok();
@@ -297,6 +387,7 @@
     @ApiOperation(value = "运维人员管理详情", tags = {"管理后台-运维执行"})
     @GetMapping("/api/v1/operationsUser/detailById")
     public R<XpOperationsUserVO> detailById(@RequestParam Long id) {
+        LoginUser loginUser = tokenService.getLoginUser();
         XpOperationsUserVO xpOperationsUserVO = xpOperationsUserService.detailById(id);
         if (xpOperationsUserVO.getAvatar() != null) {
             JSONObject jsonObject = JSONObject.parseObject(xpOperationsUserVO.getAvatar());
@@ -371,7 +462,9 @@
                 xpOperationsUserVO.setCertificateOfNoCriminalRecord(jsonObject.toJSONString());
             }
         }
-
+        if(!loginUser.getPhoneDesensitizationExempt()){
+            xpOperationsUserVO.setPhoneNumber(DesensitizedUtil.mobilePhone(xpOperationsUserVO.getPhoneNumber()));
+        }
 
         return R.ok(xpOperationsUserVO);
     }
@@ -379,6 +472,12 @@
 
     @ApiOperation(value = "运维人员管理导出列表", tags = {"管理后台-运维执行"})
     @PostMapping("/api/v1/operationsUser/exportOperationsUser")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.EXPORT,
+            content = "导出运维人员列表",
+            appendRequestData = true
+    )
     public void exportOperationsUser(@RequestBody XpOperationsUserQuery query, HttpServletResponse response) {
         xpOperationsUserService.exportOperationsUser(query, response);
     }
@@ -386,6 +485,12 @@
 
     @ApiOperation(value = "运维人员管理导出模板", tags = {"管理后台-运维执行"})
     @GetMapping("/api/v1/operationsUser/exportTemplate")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.EXPORT,
+            content = "导出运维人员模板",
+            appendRequestData = false
+    )
     public void exportTemplate(HttpServletResponse response) {
         xpOperationsUserService.exportTemplate(response);
     }
@@ -393,6 +498,12 @@
 
     @ApiOperation(value = "运维人员管理导入数据", tags = {"管理后台-运维执行"})
     @PostMapping("/api/v1/operationsUser/importOperationsUser")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.OPERATIONS_USER_MANAGEMENT,
+            operationType = AdminOperationType.IMPORT,
+            content = "导入运维人员数据",
+            appendRequestData = false
+    )
     public R<String> importOperationsUser(@RequestParam("file") MultipartFile file) {
         xpOperationsUserService.importOperationsUser(file);
         return R.ok();
@@ -420,10 +531,16 @@
     @ApiOperation(value = "根据手机号精确查询运维用户", tags = {"内部接口"})
     @GetMapping("/logan/inner/xpOperationsUser/getByExactPhone")
     public R<XpOperationsUser> getByExactPhone(@RequestParam("phoneNumber") String phoneNumber) {
+        if (com.xiaopeng.common.core.utils.StringUtils.isBlank(phoneNumber)) {
+            return R.ok();
+        }
         XpOperationsUser user = xpOperationsUserService.lambdaQuery()
-                .eq(XpOperationsUser::getPhoneNumber, phoneNumber)
+                .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(phoneNumber))
                 .last("LIMIT 1")
                 .one();
+        if (user != null) {
+            user.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(user.getPhoneNumber()));
+        }
         return R.ok(user);
     }
 }

--
Gitblit v1.7.1