From 1208e02fe79912e1888a3c3449ffa82dfaed30a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E8=BE=89?= <2830717623@qq.com> Date: Tue, 1 Sep 2026 17:14:23 +0800 Subject: [PATCH] =?UTF-8?q?yms=E7=A7=9F=E6=88=B7=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mhd/common/core/enums/RoleEnum.java | 3 +- .../service/CommonApplicationService.java | 10 +- .../service/UserApplicationService.java | 148 +++++++++++++++--- .../factory/UserRoleFactory.java | 10 +- .../service/UserDomainService.java | 8 +- .../mhd/user/interfaces/facade/UserAPI.java | 16 ++ 6 files changed, 167 insertions(+), 28 deletions(-) diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java index e1f4b27ed..841ba0ded 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java @@ -16,7 +16,8 @@ public enum RoleEnum { STORE_ADMIN("店铺管理员", "store_admin"), OWNER_CARGO("货主", "ownerCargo"), SUPPLIER("供应商", "supplier"), - CUSTOMER("客户", "customer"); + CUSTOMER("客户", "customer"), + TENANT("租户", "tenant"); private String name; private String code; diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java index 04c8c3236..4968160c9 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java @@ -129,8 +129,14 @@ public class CommonApplicationService { * @param userDO */ public void checkAccountInfo(UserDO userDO) { - //获取当前登录用户的最高组织 - Long topOrganizationId = SecurityUtils.getLoginUser().getUserPo().getTopOrganizationId(); + //获取当前登录用户的最高组织,远程Feign调用无loginUser时从userDO取 + Long topOrganizationId; + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + } else { + topOrganizationId = userDO.getTopOrganizationId(); + } checkUserInfo(topOrganizationId, userDO); } diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java index e4372185b..1f44ce5eb 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java @@ -735,14 +735,20 @@ public class UserApplicationService { */ public void addUserInfo(UserDO userDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.USER_NULL); + UserPo loginUserPo = null; + if (ObjectUtil.isNotNull(loginUser)) { + loginUserPo = loginUser.getUserPo(); } - UserPo loginUserPo = loginUser.getUserPo(); CheckDO checkDO = userFactory.getCheckDo(userDO); //用户密码传值 if (StringUtils.isNotEmpty(userDO.getUserPassword())) { - String userPassword = AESUtil.decrypt(userDO.getUserPassword()); + String userPassword; + if (ObjectUtil.isNotNull(loginUser)) { + userPassword = AESUtil.decrypt(userDO.getUserPassword()); + } else { + // Feign调用传入的是明文密码,无需AES解密 + userPassword = userDO.getUserPassword(); + } checkDO.setUserPassword(userPassword); } //用户信息格式校验 @@ -750,9 +756,15 @@ public class UserApplicationService { String salt = OConvertUtils.randomGen(8); userDO.setUserSalt(salt); regCheck(checkDO); - //用户密码传值 + //用户密码加密入库 if (StringUtils.isNotEmpty(userDO.getUserPassword())) { - String userPassword = AESUtil.decrypt(userDO.getUserPassword()); + String userPassword; + if (ObjectUtil.isNotNull(loginUser)) { + userPassword = AESUtil.decrypt(userDO.getUserPassword()); + } else { + // Feign调用传入的是明文密码,无需AES解密 + userPassword = userDO.getUserPassword(); + } //加密算法,PBEWithMD5AndDES, String passwordEncode = PasswordUtil.encrypt(userDO.getUserAccount(), userPassword, salt); userDO.setUserPassword(passwordEncode); @@ -783,11 +795,13 @@ public class UserApplicationService { String idCardDes = DesensitizedUtil.desensitizedIdNumber(idCard); userDO.setUserIdcardNumberDes(idCardDes); } - userDO.setCreateBy(loginUserPo.getUserId()); - userDO.setCreateByName(loginUserPo.getUserName()); - if (loginUserPo.getUserAccountType() != null && loginUserPo.getUserAccountType() == 5) { - userDO.setCreateBy(loginUserPo.getCreateBy()); - userDO.setCreateByName(loginUserPo.getCreateByName()); + if (ObjectUtil.isNotNull(loginUserPo)) { + userDO.setCreateBy(loginUserPo.getUserId()); + userDO.setCreateByName(loginUserPo.getUserName()); + if (loginUserPo.getUserAccountType() != null && loginUserPo.getUserAccountType() == 5) { + userDO.setCreateBy(loginUserPo.getCreateBy()); + userDO.setCreateByName(loginUserPo.getCreateByName()); + } } userDO.setCreateTime(new Date()); //用户状态:0-无状态,1-正常,2-锁定 @@ -1379,6 +1393,66 @@ public class UserApplicationService { } } + /** + * 远程Feign调用新增用户(无token),仅操作USER表基本字段 + * 调用方需传入:organizationId、userAccount、userPassword(明文)、userName + */ + @Transactional(rollbackFor = Exception.class) + public UserPo addUserByFeign(UserDO userDO) { + // 1. 获取一级组织 + AjaxResult organizationInfo = productServiceFeign.getTopOrganization(userDO.getOrganizationId()); + String code = organizationInfo.get("code").toString(); + if (!"200".equals(code)) { + throw new DigitalLogisticsException(UserError.USER_ACCOUNT_REG_ERROR); + } + String data = organizationInfo.get("data").toString(); + if (ObjectUtil.isNotNull(data)) { + userDO.setTopOrganizationId(Long.parseLong(data)); + } + // 2. 获取组织名称 + AjaxResult orgInfoResult = productServiceFeign.getInfo(userDO.getOrganizationId()); + if ("200".equals(orgInfoResult.get("code").toString())) { + Object orgData = orgInfoResult.get("data"); + if (ObjectUtil.isNotNull(orgData)) { + OrganizationPo organizationPo = BeanUtil.toBean(orgData, OrganizationPo.class); + if (ObjectUtil.isNotNull(organizationPo)) { + userDO.setOrganizationName(organizationPo.getOrganizationName()); + } + } + } + // 3. 密码加密(调用方传入明文,无需AES解密) + if (StringUtils.isNotEmpty(userDO.getUserPassword())) { + String salt = OConvertUtils.randomGen(8); + userDO.setUserSalt(salt); + String passwordEncode = PasswordUtil.encrypt(userDO.getUserAccount(), userDO.getUserPassword(), salt); + userDO.setUserPassword(passwordEncode); + } + // 4. 根据userId判断新增还是更新 + if (ObjectUtil.isNotNull(userDO.getUserId())) { + // 有userId,更新已有用户 + UserEntity updateEntity = new UserEntity(); + BeanUtils.copyProperties(userDO, updateEntity); + userMapper.updateById(updateEntity); + UserPo userPo = userMapper.selectByUserId(userDO.getUserId()); + return userPo; + } else { + // 无userId,新增用户 + userDO.setCreateTime(new Date()); + userDO.setUserStatus(1); + userDO.setUserAuthStatus(1); + userDO.setDelFlag(1); + userDO.setRoleCode(RoleEnum.MUST.getCode()); + userDO.setRoleName(RoleEnum.MUST.getName()); + if (ObjectUtil.isNull(userDO.getUserAccount()) && ObjectUtil.isNotNull(userDO.getUserPhone())) { + userDO.setUserAccount(userDO.getUserPhone()); + } + UserEntity userEntity = userDomainService.addUser(userDO); + UserPo userPo = new UserPo(); + BeanUtils.copyProperties(userEntity, userPo); + return userPo; + } + } + /** * @Description 新增用户 * @Author Alex @@ -1388,18 +1462,31 @@ public class UserApplicationService { public UserPo addUserYG(UserDO userDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); String password = userDO.getPlainPassword(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.TIMEOUT); + // 远程Feign调用时可能无loginUser,优先从loginUser取组织信息,否则使用userDO自身携带的数据 + if (ObjectUtil.isNotNull(loginUser)) { + userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + } else if (ObjectUtil.isNotNull(userDO.getOrganizationId()) && ObjectUtil.isNull(userDO.getTopOrganizationId())) { + // 无loginUser时,提前获取一级组织ID,供后续checkAccountInfo使用 + AjaxResult topOrgResult = productServiceFeign.getTopOrganization(userDO.getOrganizationId()); + if ("200".equals(topOrgResult.get("code").toString())) { + String topOrgData = topOrgResult.get("data").toString(); + if (ObjectUtil.isNotNull(topOrgData)) { + userDO.setTopOrganizationId(Long.parseLong(topOrgData)); + } + } } - userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); //2023年3月24日 bug修改 增加登录账号/手机号唯一性校验 commonApplicationService.checkAccountInfo(userDO); if (ObjectUtil.isNotNull(userDO.getUserId())) { return updateUser(userDO); } else { if (ObjectUtil.isNull(userDO.getOrganizationId())) { - userDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); - userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + if (ObjectUtil.isNotNull(loginUser)) { + userDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + } else { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } } else { // 如果前端传递了 organizationId,根据 organizationId 查询组织信息,获取正确的组织名称 AjaxResult orgInfoResult = productServiceFeign.getInfo(userDO.getOrganizationId()); @@ -1441,7 +1528,14 @@ public class UserApplicationService { //组装新增用户信息 addUserInfo(userDO); + // 远程Feign调用无loginUser时,强制分配默认普通角色,不走管理员 + if (ObjectUtil.isNull(loginUser)) { + userDO.setRoleCode(RoleEnum.TENANT.getCode()); + userDO.setRoleName(RoleEnum.TENANT.getName()); + userDO.setUserAccountType(null); + } UserEntity userEntity = userDomainService.addUser(userDO); + if (ObjectUtil.isNotNull(loginUser)) { if (isCustomerManagementPresetRole(userEntity.getRoleCode())) { // 保持插入结果,不再改 role_code / user_role } else if ((StringUtils.isEmpty(userEntity.getRoleCode()) || !RoleEnum.PLAT_ADMIN.getCode().equals(userEntity.getRoleCode())) && @@ -1480,6 +1574,22 @@ public class UserApplicationService { userDomainService.updateUser(userDO); } } + } // end of loginUser != null check + else { + RoleDo roleDo = new RoleDo(); + roleDo.setRoleCode(userEntity.getRoleCode()); + roleDo.setOrganizationId(userEntity.getOrganizationId()); + RoleEntity roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo); + if (roleEntity != null) { + UserRoleDo userRoleDo = new UserRoleDo(); + userRoleDo.setUserId(userEntity.getUserId()); + userRoleDo.setRoleId(roleEntity.getRoleId()); + userRoleDomainService.addUserRole(userRoleDo); + userDO.setRoleId(roleEntity.getRoleId()); + userDO.setUserId(userEntity.getUserId()); + userDomainService.updateUser(userDO); + } + } BeanUtils.copyProperties(userEntity, userPo); //同步网货平台员工信息 try { @@ -1492,13 +1602,15 @@ public class UserApplicationService { // throw e; } //获取组织信息 - Long organizationId = loginUser.getUserPo().getOrganizationId(); + Long organizationId = ObjectUtil.isNotNull(loginUser) ? loginUser.getUserPo().getOrganizationId() : userDO.getOrganizationId(); Integer isQueue = userMapper.getOrdIsQueue(organizationId); if (isQueue==1) { //同步YMS员工信息 try { - userEntity.setUserPassword(password); + if (StringUtils.isNotEmpty(password)) { + userEntity.setUserPassword(password); + } ymsDomainService.addOrEditYmsUser(userEntity); } catch (Exception e) { // 同步YMS失败时,记录日志但不影响用户保存 diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java index d4c2c0388..96af6ea6a 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java @@ -22,12 +22,12 @@ public class UserRoleFactory { UserRoleEntity userRoleEntity = new UserRoleEntity(); BeanUtils.copyProperties(userRoleDo,userRoleEntity, IgnoreNullUtil.getNullPropertyNames(userRoleDo)); LoginUser loginUser = SecurityUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.TIMEOUT); + String userName = null; + Long userId = null; + if (ObjectUtil.isNotNull(loginUser)) { + userName = loginUser.getUsername(); + userId = loginUser.getUserid(); } - String userName = loginUser.getUsername(); - // 获取登录人id - Long userId = loginUser.getUserid(); if(userRoleDo.getUserRoleId() != null){ if(userId != null){ userRoleEntity.setUpdateBy(userId); diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java index 5605c1dfb..a421ca8ec 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java @@ -12,6 +12,7 @@ import com.mhd.user.domain.userAggregate.repository.todo.UserDO; import com.mhd.common.core.domain.po.app.UserAppPo; import com.mhd.common.core.annotation.fieldsetvalue.NeedSetValueMethod; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import com.mhd.user.infrastructure.util.annotation.DataPermissions; import com.mhd.user.interfaces.dto.queryDTO.UserDocumentWarningQueryDTO; import com.mhd.user.interfaces.dto.updateDTO.UpdateHasDefaultAddressDTO; @@ -50,9 +51,12 @@ public class UserDomainService { */ public UserEntity updateUser(UserDO userDO) { UserEntity userEntity = userFactory.getUserEntity(userDO); - userEntity.setUpdateBy(SecurityUtils.getLoginUser().getUserid()); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + userEntity.setUpdateBy(loginUser.getUserid()); + userEntity.setUpdateByName(loginUser.getUsername()); + } userEntity.setUpdateTime(new Date()); - userEntity.setUpdateByName(SecurityUtils.getLoginUser().getUsername()); userRepositoryInterface.updateUser(userEntity); return userEntity; } diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java index 96d2f14e6..52d5058f9 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java @@ -283,6 +283,22 @@ public class UserAPI extends BaseController { return R.ok(sysUserVo, "操作成功"); } + /** + * 远程Feign调用新增用户(无token),仅操作USER表基本字段 + */ + @ApiOperation("远程Feign修改用户(无token)") + @PostMapping("/addUserByFeign") + public R addUserByFeign(@RequestBody UserDTO userDTO) { + LoginUser sysUserVo = new LoginUser(); + UserDO userDO = userAssember.toUserDO(userDTO); + UserPo userPo = userApplicationService.addUserByFeign(userDO); + if (ObjectUtil.isNotNull(userPo)) { + sysUserVo.setUserid(userPo.getUserId()); + } + sysUserVo.setUserPo(userPo); + return R.ok(sysUserVo, "操作成功"); + } + /** * @Description 新增合作商 * @Author Alex