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; import com.xiaopeng.account.mapper.XpOperationsRoleMapper; 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.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.web.page.PageInfo; import com.xiaopeng.common.security.service.TokenService; import com.xiaopeng.evi.oss.service.AliOssService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; /** *

* 运维人员 前端控制器 *

* * @author mitao * @since 2026-02-03 */ @RestController @RequestMapping("") public class XpOperationsUserController { private final IXpOperationsUserService xpOperationsUserService; private final XpOperationsRoleMapper xpOperationsRoleMapper; private final TokenService tokenService; private final XpFleetClient xpFleetClient; private final AliOssService aliOssService; @Resource private IXpQualificationAuditService xpQualificationAuditService; @Resource private ISysRoleService sysRoleService; @Resource private SysGroupMenuClient groupMenuClient; @Autowired public XpOperationsUserController(IXpOperationsUserService xpOperationsUserService, XpOperationsRoleMapper xpOperationsRoleMapper, TokenService tokenService, XpFleetClient xpFleetClient, AliOssService aliOssService) { this.xpOperationsUserService = xpOperationsUserService; this.xpOperationsRoleMapper = xpOperationsRoleMapper; this.tokenService = tokenService; this.xpFleetClient = xpFleetClient; this.aliOssService = aliOssService; } /** * 根据ID列表批量查询运维用户信息 * * @param ids 用户ID列表 * @return 用户列表 */ @PostMapping("/logan/inner/xpOperationsUser/listByIds") public R> listByIds(@RequestBody List ids) { return R.ok(xpOperationsUserService.listByIds(ids)); } @PostMapping("/logan/inner/xpOperationsUser/pageListByIds") public R> pageListByIds(@RequestBody OptionalUsersPageListQuery q) { return R.ok(xpOperationsUserService.pageListByIds(q)); } @PostMapping("/logan/inner/xpOperationsUser/findList") public R> findList(@RequestBody XpOperationsUserQueryDTO query) { return R.ok(xpOperationsUserService.findList(query)); } /** * 根据ID查询运维用户信息 * @return 用户列表 */ @GetMapping("/logan/inner/xpOperationsUser/queryById") R queryById(@RequestParam Long id) { XpOperationsUser operationsUser = xpOperationsUserService.getById(id); XpOperationsRole operationsUserId = xpOperationsRoleMapper.selectOne(new QueryWrapper().eq("operations_user_id", id)); SysRole sysRole = sysRoleService.getById(operationsUserId.getRoleId()); operationsUser.setRoleName(sysRole.getRoleName()); return R.ok(operationsUser); } /** * 根据昵称查询运维用户信息 * * @param nickName 昵称 * @return 运维用户列表 */ @PostMapping("/logan/inner/xpOperationsUser/listByName") public R> listByName(@RequestParam("nickName") String nickName) { return R.ok(xpOperationsUserService.listByName(nickName)); } @GetMapping("/logan/inner/xpOperationsUser/profile") public R profile(@RequestParam("id")Long id) { return R.ok(xpOperationsUserService.getUserProfile(id)); } /** * 根据用户ID列表批量查询用户及角色信息(内部接口) * * @param ids 用户ID列表 * @return 用户及角色信息列表 */ @ApiOperation(value = "批量查询用户及角色信息", tags = {"内部接口"}) @PostMapping("/logan/inner/xpOperationsUser/listByIdsWithRole") public R> listByIdsWithRole(@RequestBody List ids) { if (CollectionUtils.isEmpty(ids)) { return R.ok(new ArrayList<>()); } List result = xpOperationsUserService.selectUsersWithRoleByIds(ids); return R.ok(result); } /** * 根据条件查询用户及角色信息(内部接口) * * @param dto 查询条件 * @return 用户及角色信息列表 */ @ApiOperation(value = "根据条件查询用户及角色信息", tags = {"内部接口"}) @PostMapping("/logan/inner/xpOperationsUser/queryByConditions") public R> queryByConditions(@RequestBody XpOperationsUserQueryDTO dto) { List result = xpOperationsRoleMapper.selectUsersByConditions( dto.getNickName(), dto.getPhoneNumber(), dto.getRoleId() ); return R.ok(result); } /** * 根据条件查询用户及角色信息 * * @param query 查询条件 * @return 用户及角色信息列表 */ @ApiOperation(value = "根据条件查询用户分页列表", tags = {"管理后台-车队管理"}) @PostMapping("/api/v1/xpOperationsUser/queryByConditions") public R> getList(@RequestBody XpOperationsUserPageQuery query) { return R.ok(xpOperationsUserService.selectUserPageByConditions(query)); } /** * 获取运维人员个人中心首页信息 * * @return 个人中心首页信息 */ @ApiOperation(value = "获取个人中心首页信息", tags = {"运维APP-个人中心"}) @GetMapping("/maintenance-app/api/v1/userInfo") public R getProfile() { // 通过TokenService获取当前登录用户ID Long currentUserId = tokenService.getLoginOperationUser().getId(); // 查询个人中心信息 XpOperationsUserProfileVO profile = xpOperationsUserService.getUserProfile(currentUserId); return R.ok(profile); } /** * 运维APP-个人中心-证件上传 * * @param dto * @return */ @ApiOperation(value = "个人中心-证件上传", tags = {"运维APP-个人中心"}) @PostMapping("/maintenance-app/api/v1/saveCertificate") public R saveCertificate(@Valid @RequestBody XpOperationsUserDTO dto) { xpOperationsUserService.saveCertificate(dto); return R.ok(); } @ApiOperation(value = "个人中心-查询证件上传详情", tags = {"运维APP-个人中心"}) @PostMapping("/maintenance-app/api/v1/getCertificate") public R getCertificate() { Long id = tokenService.getLoginOperationUser().getId(); XpQualificationAudit xpQualificationAudit = xpQualificationAuditService.getOne(new QueryWrapper().eq("operations_user_id", id) .last(" order by create_time desc limit 1")); return R.ok(xpQualificationAudit); } @ApiOperation(value = "运维人员管理分页列表", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/pageList") public R> pageList(@RequestBody XpOperationsUserQuery query) { LoginUser loginUser = tokenService.getLoginUser(); PageInfo pageList = xpOperationsUserService.pageList(query); if(!loginUser.getPhoneDesensitization()){ for (XpOperationsUserVO record : pageList.getRecords()) { record.setPhoneNumber(DesensitizedUtil.mobilePhone(record.getPhoneNumber())); } } return R.ok(pageList); } @ApiOperation(value = "运维人员管理不分页列表", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/listAll") public R> listAll() { List listAll = xpOperationsUserService.list(); for (XpOperationsUser xpOperationsUser : listAll) { // todo 需要上传工单id,根据距离进行排序 } return R.ok(listAll); } /** * 获取所有启用状态的运维用户(内部接口) * @return 启用状态的用户列表 */ @ApiOperation(value = "获取所有启用状态的运维用户", tags = {"内部接口"}) @GetMapping("/logan/inner/xpOperationsUser/listAllEnabled") public R> listAllEnabled() { List users = xpOperationsUserService.lambdaQuery() .eq(XpOperationsUser::getStatus, true) .list(); return R.ok(users); } @ApiOperation(value = "运维人员管理新增", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/add") public R add(@RequestBody XpOperationsUserAddDTO dto) { return xpOperationsUserService.addOperationsUser(dto); } @ApiOperation(value = "运维人员管理编辑", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/edit") public R edit(@RequestBody XpOperationsUserAddDTO dto) { return xpOperationsUserService.editOperationsUser(dto); } @ApiOperation(value = "运维人员管理启用禁用", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/enableDisableById") public R enableDisableById(@RequestBody EnableDisableDTO dto) { xpOperationsUserService.enableDisableById(dto); return R.ok(); } @ApiOperation(value = "运维人员管理删除", tags = {"管理后台-运维执行"}) @DeleteMapping("/api/v1/operationsUser/deleteById") public R deleteById(@RequestParam Long id) { try { R fleetResult = xpFleetClient.getFleetByOperationsUserId(id); if (fleetResult == null) { throw new ServiceException("请求失败,请稍后重试", I18nKeyConstant.REQUEST_FAILED); } XpFleet fleet = fleetResult.getData(); if (fleet != null && fleet.getId() != null) { String fleetName = com.xiaopeng.common.core.utils.StringUtils.isBlank(fleet.getFleetName()) ? String.valueOf(fleet.getId()) : fleet.getFleetName(); throw new ServiceException( "删除失败,该人员已关联车队:" + fleetName, I18nKeyConstant.OPERATIONS_USER_DELETE_FLEET_BOUND, new Object[]{fleetName} ); } } catch (ServiceException e) { throw e; } catch (Exception e) { throw new ServiceException("请求失败,请稍后重试", I18nKeyConstant.REQUEST_FAILED); } xpOperationsUserService.removeById(id); return R.ok(); } @ApiOperation(value = "运维人员管理重置密码", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/rePassword") public R rePassword(@RequestBody RePasswordDTO dto) { xpOperationsUserService.rePassword(dto); return R.ok(); } @ApiOperation(value = "运维人员管理详情", tags = {"管理后台-运维执行"}) @GetMapping("/api/v1/operationsUser/detailById") public R detailById(@RequestParam Long id) { LoginUser loginUser = tokenService.getLoginUser(); XpOperationsUserVO xpOperationsUserVO = xpOperationsUserService.detailById(id); if (xpOperationsUserVO.getAvatar() != null) { JSONObject jsonObject = JSONObject.parseObject(xpOperationsUserVO.getAvatar()); if(jsonObject!=null){ String downloadUrl = null; try { // 1 downloadUrl= aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); } catch (Exception e) { e.printStackTrace(); } jsonObject.put("url", downloadUrl); xpOperationsUserVO.setAvatar(jsonObject.toJSONString()); } } if (xpOperationsUserVO.getIdCardFront() != null) { JSONObject jsonObject = JSONObject.parseObject(xpOperationsUserVO.getIdCardFront()); if(jsonObject!=null){ String downloadUrl = null; try { // 1 downloadUrl= aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); } catch (Exception e) { e.printStackTrace(); } jsonObject.put("url", downloadUrl); xpOperationsUserVO.setIdCardFront(jsonObject.toJSONString()); } } if (xpOperationsUserVO.getIdCardBack() != null) { JSONObject jsonObject = JSONObject.parseObject(xpOperationsUserVO.getIdCardBack()); if(jsonObject!=null){ String downloadUrl = null; try { // 1 downloadUrl= aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); } catch (Exception e) { e.printStackTrace(); } jsonObject.put("url", downloadUrl); xpOperationsUserVO.setIdCardBack(jsonObject.toJSONString()); } } if (xpOperationsUserVO.getDriverLicense() != null) { JSONObject jsonObject = JSONObject.parseObject(xpOperationsUserVO.getDriverLicense()); if(jsonObject!=null){ String downloadUrl = null; try { // 1 downloadUrl= aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); } catch (Exception e) { e.printStackTrace(); } jsonObject.put("url", downloadUrl); xpOperationsUserVO.setDriverLicense(jsonObject.toJSONString()); } } if (xpOperationsUserVO.getCertificateOfNoCriminalRecord() != null) { JSONObject jsonObject = JSONObject.parseObject(xpOperationsUserVO.getCertificateOfNoCriminalRecord()); if(jsonObject!=null){ String downloadUrl = null; try { // 1 downloadUrl= aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); } catch (Exception e) { e.printStackTrace(); } jsonObject.put("url", downloadUrl); xpOperationsUserVO.setCertificateOfNoCriminalRecord(jsonObject.toJSONString()); } } if(!loginUser.getPhoneDesensitization()){ xpOperationsUserVO.setPhoneNumber(DesensitizedUtil.mobilePhone(xpOperationsUserVO.getPhoneNumber())); } return R.ok(xpOperationsUserVO); } @ApiOperation(value = "运维人员管理导出列表", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/exportOperationsUser") public void exportOperationsUser(@RequestBody XpOperationsUserQuery query, HttpServletResponse response) { xpOperationsUserService.exportOperationsUser(query, response); } @ApiOperation(value = "运维人员管理导出模板", tags = {"管理后台-运维执行"}) @GetMapping("/api/v1/operationsUser/exportTemplate") public void exportTemplate(HttpServletResponse response) { xpOperationsUserService.exportTemplate(response); } @ApiOperation(value = "运维人员管理导入数据", tags = {"管理后台-运维执行"}) @PostMapping("/api/v1/operationsUser/importOperationsUser") public R importOperationsUser(@RequestParam("file") MultipartFile file) { xpOperationsUserService.importOperationsUser(file); return R.ok(); } /** * 根据手机号模糊查询用户(内部接口) * * @param phoneNumber 手机号 * @return 用户信息列表 */ @ApiOperation(value = "根据手机号模糊查询用户及角色信息", tags = {"内部接口"}) @PostMapping("/logan/inner/xpOperationsUser/getByPhoneNumber") public R> getByPhoneNumber(@RequestParam String phoneNumber) { List result = xpOperationsUserService.getByPhoneNumber(phoneNumber); return R.ok(result); } /** * 根据手机号精确查询运维用户(内部接口) * * @param phoneNumber 手机号 * @return 运维用户信息,不存在返回null */ @ApiOperation(value = "根据手机号精确查询运维用户", tags = {"内部接口"}) @GetMapping("/logan/inner/xpOperationsUser/getByExactPhone") public R getByExactPhone(@RequestParam("phoneNumber") String phoneNumber) { XpOperationsUser user = xpOperationsUserService.lambdaQuery() .eq(XpOperationsUser::getPhoneNumber, phoneNumber) .last("LIMIT 1") .one(); return R.ok(user); } }