From 283759c90dbbee182e20145129583677d04f7e27 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 10 Sep 2025 16:54:02 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=AE=8C=E5=96=84DeptServiceImpl?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E8=A6=86=E7=9B=96=E7=8E=87?= =?UTF-8?q?90%=EF=BC=9B2=E3=80=81=E6=96=B0=E5=A2=9Esecurity=20mock?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=EF=BC=9B3=E3=80=81=E7=A7=BB=E9=99=A4postserv?= =?UTF-8?q?ice=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=EF=BC=9B4=E3=80=81?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=83=A8=E5=88=86=E6=97=A0=E7=94=A8=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=9A=84=E5=8D=95=E6=B5=8B=E4=BB=A3=E7=A0=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/DefaultDBFieldHandler.java | 6 +- .../cf-spring-boot-starter-security/pom.xml | 5 + .../core/util/SecurityFrameworkUtils.java | 12 + .../security/test/WithMockLoginUser.java | 22 + ...thMockLoginUserSecurityContextFactory.java | 36 ++ .../test/core/podam/package-info.java | 4 + .../podam/strategy/NumberValidStrategy.java | 21 + .../framework/test/core/util/RandomUtils.java | 4 + .../imes/module/system/api/dept/DeptApi.java | 27 - .../imes/module/system/api/dept/PostApi.java | 25 - .../module/system/api/dept/DeptApiImpl.java | 14 - .../module/system/api/dept/PostApiImpl.java | 26 - .../controller/admin/dept/PostController.java | 114 ----- .../admin/dept/vo/dept/DeptSaveReqVO.java | 3 +- .../admin/oauth2/OAuth2UserController.java | 8 - .../controller/admin/user/UserController.java | 11 +- .../admin/user/UserProfileController.java | 5 - .../system/dal/mysql/dept/DeptMapper.java | 17 +- .../ChenfengSystemRedisConfiguration.java | 20 + .../system/framework/redis/package-info.java | 4 + .../system/service/dept/DeptService.java | 29 -- .../system/service/dept/DeptServiceImpl.java | 98 +--- .../system/service/dept/PostService.java | 86 ---- .../system/service/dept/PostServiceImpl.java | 154 ------ .../service/user/AdminUserServiceImpl.java | 5 - .../system/util/redis/SystemRedisUtils.java | 53 ++ .../service/dept/DeptServiceImplTest.java | 401 +++++++++++++-- .../service/dept/PostServiceImplTest.java | 248 --------- .../social/SocialClientServiceImplTest.java | 472 ------------------ .../social/SocialUserServiceImplTest.java | 288 ----------- .../user/AdminUserServiceImplTest.java | 5 +- .../src/test/resources/sql/create_tables.sql | 6 +- 32 files changed, 586 insertions(+), 1643 deletions(-) create mode 100644 cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUser.java create mode 100644 cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUserSecurityContextFactory.java create mode 100644 cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/package-info.java create mode 100644 cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/strategy/NumberValidStrategy.java delete mode 100644 cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/PostApi.java delete mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/PostApiImpl.java delete mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/PostController.java create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/config/ChenfengSystemRedisConfiguration.java create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/package-info.java delete mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostService.java delete mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostServiceImpl.java create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/util/redis/SystemRedisUtils.java delete mode 100644 cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/PostServiceImplTest.java delete mode 100644 cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialClientServiceImplTest.java delete mode 100644 cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialUserServiceImplTest.java diff --git a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java index 9af10bbb4..6d8059312 100644 --- a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java +++ b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -111,9 +111,6 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { setFieldValByName("updater", loginUserName, metaObject); } - // 从请求中获取到 Token - String authorization = obtainAuthorization(AUTHORIZATION_HEADER_NAME, TOKEN_PARAM_NAME); - Long organId = null; /** @@ -121,6 +118,9 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { * 这里的组织ID字段填入即使为空也可,后续的请求中都会带有token,再从缓存中获取到 token 数据,再获取组织ID,填入即可 */ try { + // 从请求中获取到 Token + String authorization = obtainAuthorization(AUTHORIZATION_HEADER_NAME, TOKEN_PARAM_NAME); + // 获取 token 对应的缓存数据,并得到组织 ID OAuth2AccessTokenDO oAuth2AccessTokenDO = get(authorization); organId = oAuth2AccessTokenDO.getOrganId(); diff --git a/cf-framework/cf-spring-boot-starter-security/pom.xml b/cf-framework/cf-spring-boot-starter-security/pom.xml index d13d648e6..072d013f1 100644 --- a/cf-framework/cf-spring-boot-starter-security/pom.xml +++ b/cf-framework/cf-spring-boot-starter-security/pom.xml @@ -73,6 +73,11 @@ bizlog-sdk + + org.springframework.security + spring-security-test + + diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java index 3ea8b1bbf..9daf0f830 100644 --- a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java @@ -138,6 +138,18 @@ public class SecurityFrameworkUtils { } + /** + * 获取当前用户的部门ID + * + */ + public static Long getUserDeptId() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null) { + throw new ServiceException(GlobalErrorCodeConstants.UNAUTHORIZED); + } + return loginUser.getDeptId(); + } + /** * 当前用户是否超级管理员 * diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUser.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUser.java new file mode 100644 index 000000000..ec6e7071a --- /dev/null +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUser.java @@ -0,0 +1,22 @@ +package com.cf.imes.framework.security.test; + +import org.springframework.security.test.context.support.WithSecurityContext; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * security mock loginuser annotation + * + * @author Gqr + * @since 2025/9/8 11:16 + */ +@Retention(RetentionPolicy.RUNTIME) +@WithSecurityContext(factory = WithMockLoginUserSecurityContextFactory.class) +public @interface WithMockLoginUser { + String username() default ""; + + long deptId() default 0L; + + boolean isSuperAdmin() default false; +} \ No newline at end of file diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUserSecurityContextFactory.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUserSecurityContextFactory.java new file mode 100644 index 000000000..6de655537 --- /dev/null +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/test/WithMockLoginUserSecurityContextFactory.java @@ -0,0 +1,36 @@ +package com.cf.imes.framework.security.test; + +import cn.hutool.core.util.RandomUtil; +import com.cf.imes.framework.security.core.LoginUser; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.test.context.support.WithSecurityContextFactory; + +import java.util.Collections; + +/** + * security mock loginuser + * + * @author Gqr + * @since 2025/9/8 11:17 + */ +public class WithMockLoginUserSecurityContextFactory implements WithSecurityContextFactory { + + @Override + public SecurityContext createSecurityContext(WithMockLoginUser annotation) { + SecurityContext context = SecurityContextHolder.createEmptyContext(); + + LoginUser loginUser = new LoginUser(); + loginUser.setNickname(RandomUtil.randomString(10)); + loginUser.setDeptId(RandomUtil.randomLong()); + loginUser.setOrganId(RandomUtil.randomLong()); + loginUser.setIsSupAdmin(annotation.isSuperAdmin()); + + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginUser, null, Collections.emptyList()); + context.setAuthentication(authenticationToken); + + return context; + } +} diff --git a/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/package-info.java b/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/package-info.java new file mode 100644 index 000000000..993aa2324 --- /dev/null +++ b/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/package-info.java @@ -0,0 +1,4 @@ +/** + * 提供random mock对象策略 基类 + */ +package com.cf.imes.framework.test.core.podam; diff --git a/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/strategy/NumberValidStrategy.java b/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/strategy/NumberValidStrategy.java new file mode 100644 index 000000000..49bca05dc --- /dev/null +++ b/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/podam/strategy/NumberValidStrategy.java @@ -0,0 +1,21 @@ +package com.cf.imes.framework.test.core.podam.strategy; + +import cn.hutool.core.util.RandomUtil; +import uk.co.jemos.podam.common.AttributeStrategy; + +import java.lang.annotation.Annotation; +import java.util.List; + +/** + * random mock对象 @NumberValid策略 + * + * @author Gqr + * @since 2025/9/9 14:17 + */ +public class NumberValidStrategy implements AttributeStrategy { + + @Override + public Integer getValue(Class aClass, List list) { + return RandomUtil.randomInt(0, Integer.MAX_VALUE); + } +} diff --git a/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/util/RandomUtils.java b/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/util/RandomUtils.java index 96c5c09c9..3f3e61b2a 100644 --- a/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/util/RandomUtils.java +++ b/cf-framework/cf-spring-boot-starter-test/src/main/java/com/cf/imes/framework/test/core/util/RandomUtils.java @@ -5,8 +5,11 @@ import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import com.cf.imes.framework.common.enums.CommonStatusEnum; +import com.cf.imes.framework.common.validation.NumberValid; +import com.cf.imes.framework.test.core.podam.strategy.NumberValidStrategy; import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; +import uk.co.jemos.podam.api.RandomDataProviderStrategy; import java.lang.reflect.Type; import java.time.LocalDateTime; @@ -63,6 +66,7 @@ public class RandomUtils { } return RandomUtil.randomBoolean(); }); + ((RandomDataProviderStrategy) PODAM_FACTORY.getStrategy()).addOrReplaceAttributeStrategy(NumberValid.class, new NumberValidStrategy()); } public static String randomString() { diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/DeptApi.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/DeptApi.java index 8c810edc9..e01e4125d 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/DeptApi.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/DeptApi.java @@ -1,7 +1,6 @@ package com.cf.imes.module.system.api.dept; import com.cf.imes.framework.common.pojo.CommonResult; -import com.cf.imes.framework.common.util.collection.CollectionUtils; import com.cf.imes.module.system.api.dept.dto.DeptRespDTO; import com.cf.imes.module.system.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; @@ -12,11 +11,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - @FeignClient(name = ApiConstants.NAME) // TODO 晨丰:fallbackFactory = @Tag(name = "RPC 服务 - 部门") public interface DeptApi { @@ -28,30 +22,9 @@ public interface DeptApi { @Parameter(name = "id", description = "部门编号", example = "1024", required = true) CommonResult getDept(@RequestParam("id") Long id); - @GetMapping(PREFIX + "/list") - @Operation(summary = "获得部门信息数组") - @Parameter(name = "ids", description = "部门编号数组", example = "1,2", required = true) - CommonResult> getDeptList(@RequestParam("ids") Collection ids); - - @GetMapping(PREFIX + "/valid") - @Operation(summary = "校验部门是否合法") - @Parameter(name = "ids", description = "部门编号数组", example = "1,2", required = true) - CommonResult validateDeptList(@RequestParam("ids") Collection ids); - @GetMapping(PREFIX + "/legitimacy/{deptId}") @Operation(summary = "校验部门是否合法") @Parameter(name = "id", description = "部门编号", example = "1024", required = true) CommonResult validateDept(@PathVariable("deptId") Long deptId); - /** - * 获得指定编号的部门 Map - * - * @param ids 部门编号数组 - * @return 部门 Map - */ - default Map getDeptMap(Set ids) { - List list = getDeptList(ids).getCheckedData(); - return CollectionUtils.convertMap(list, DeptRespDTO::getId); - } - } diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/PostApi.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/PostApi.java deleted file mode 100644 index 130680444..000000000 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/dept/PostApi.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.cf.imes.module.system.api.dept; - -import com.cf.imes.framework.common.pojo.CommonResult; -import com.cf.imes.module.system.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.Collection; - -@FeignClient(name = ApiConstants.NAME) // TODO 晨丰:fallbackFactory = -@Tag(name = "RPC 服务 - 岗位") -public interface PostApi { - - String PREFIX = ApiConstants.PREFIX + "/post"; - - @GetMapping(PREFIX + "/valid") - @Operation(summary = "校验岗位是否合法") - @Parameter(name = "ids", description = "岗位编号数组", example = "1,2", required = true) - CommonResult validPostList(@RequestParam("ids") Collection ids); - -} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/DeptApiImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/DeptApiImpl.java index aa412034a..85c27482f 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/DeptApiImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/DeptApiImpl.java @@ -9,8 +9,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; import jakarta.annotation.Resource; -import java.util.Collection; -import java.util.List; import static com.cf.imes.framework.common.pojo.CommonResult.success; @@ -27,18 +25,6 @@ public class DeptApiImpl implements DeptApi { return success(BeanUtils.toBean(dept, DeptRespDTO.class)); } - @Override - public CommonResult> getDeptList(Collection ids) { - List depts = deptService.getDeptList(ids); - return success(BeanUtils.toBean(depts, DeptRespDTO.class)); - } - - @Override - public CommonResult validateDeptList(Collection ids) { - deptService.validateDeptList(ids); - return success(true); - } - @Override public CommonResult validateDept(Long deptId) { deptService.validDept(deptId); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/PostApiImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/PostApiImpl.java deleted file mode 100644 index 70e73d01f..000000000 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/dept/PostApiImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.cf.imes.module.system.api.dept; - -import com.cf.imes.framework.common.pojo.CommonResult; -import com.cf.imes.module.system.service.dept.PostService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import jakarta.annotation.Resource; -import java.util.Collection; - -import static com.cf.imes.framework.common.pojo.CommonResult.success; - -@RestController // 提供 RESTful API 接口,给 Feign 调用 -@Validated -public class PostApiImpl implements PostApi { - - @Resource - private PostService postService; - - @Override - public CommonResult validPostList(Collection ids) { - postService.validatePostList(ids); - return success(true); - } - -} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/PostController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/PostController.java deleted file mode 100644 index bea547727..000000000 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/PostController.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.cf.imes.module.system.controller.admin.dept; - -import com.cf.imes.framework.common.enums.CommonStatusEnum; -import com.cf.imes.framework.common.pojo.CommonResult; -import com.cf.imes.framework.common.pojo.PageParam; -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.framework.excel.core.util.ExcelUtils; -import com.cf.imes.framework.operatelog.core.annotations.OperateLog; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostPageReqVO; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostRespVO; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostSaveReqVO; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostSimpleRespVO; -import com.cf.imes.module.system.dal.dataobject.dept.PostDO; -import com.cf.imes.module.system.service.dept.PostService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import java.io.IOException; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.concurrent.atomic.AtomicLong; - -import static com.cf.imes.framework.common.pojo.CommonResult.success; -import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Tag(name = "管理后台 - 岗位") -@RestController -@RequestMapping("/system/post") -@Validated -public class PostController { - - @Resource - private PostService postService; - - @PostMapping("/create") - @Operation(summary = "创建岗位") - @PreAuthorize("@ss.hasPermission('system:post:create')") - public CommonResult createPost(@Valid @RequestBody PostSaveReqVO createReqVO) { - Long postId = postService.createPost(createReqVO); - return success(postId); - } - - @PutMapping("/update") - @Operation(summary = "修改岗位") - @PreAuthorize("@ss.hasPermission('system:post:update')") - public CommonResult updatePost(@Valid @RequestBody PostSaveReqVO updateReqVO) { - postService.updatePost(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除岗位") - @PreAuthorize("@ss.hasPermission('system:post:delete')") - public CommonResult deletePost(@RequestParam("id") Long id) { - postService.deletePost(id); - return success(true); - } - - @GetMapping(value = "/get") - @Operation(summary = "获得岗位信息") - @Parameter(name = "id", description = "岗位编号", required = true, example = "1024") -// @PreAuthorize("@ss.hasPermission('system:post:query')") - public CommonResult getPost(@RequestParam("id") Long id) { - PostDO post = postService.getPost(id); - return success(BeanUtils.toBean(post, PostRespVO.class)); - } - - @GetMapping(value = {"/list-all-simple", "simple-list"}) - @Operation(summary = "获取岗位全列表", description = "只包含被开启的岗位,主要用于前端的下拉选项") - public CommonResult> getSimplePostList(@RequestParam(value = "organId", required = false) Long organId) { - // 获得岗位列表,只要开启状态的 - List list = postService.getPostList(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()), organId); - // 排序后,返回给前端 - list.sort(Comparator.comparing(PostDO::getSort)); - return success(BeanUtils.toBean(list, PostSimpleRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得岗位分页列表") - @PreAuthorize("@ss.hasPermission('system:post:query')") - public CommonResult> getPostPage(@Validated PostPageReqVO pageReqVO) { - PageResult pageResult = postService.getPostPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, PostRespVO.class)); - } - - @GetMapping("/export") - @Operation(summary = "岗位管理") - @PreAuthorize("@ss.hasPermission('system:post:export')") - @OperateLog(type = EXPORT) - public void export(HttpServletResponse response, @Validated PostPageReqVO reqVO) throws IOException { - reqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = postService.getPostPage(reqVO).getList(); - - AtomicLong sort = new AtomicLong(); - list.forEach(f->{ - sort.addAndGet(1); - f.setId(sort.get()); - }); - - // 输出 - ExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostRespVO.class, - BeanUtils.toBean(list, PostRespVO.class)); - } - -} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java index 5ff2c0f5f..03035c94c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java @@ -5,7 +5,6 @@ import com.cf.imes.framework.common.validation.NumberValid; import com.cf.imes.module.system.validation.common.CommonStatus; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import org.hibernate.validator.constraints.Length; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; @@ -38,7 +37,7 @@ public class DeptSaveReqVO { private Integer sort; @Schema(description = "负责人", example = "2048") - @Length(max = 10, message = "负责人长度不能超过10个字符") + @Size(max = 30, message = "负责人长度不能超过30个字符") private String leader; @Schema(description = "联系电话", example = "15601691000") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/oauth2/OAuth2UserController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/oauth2/OAuth2UserController.java index b7f3fb56c..e13079095 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/oauth2/OAuth2UserController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/oauth2/OAuth2UserController.java @@ -8,7 +8,6 @@ import com.cf.imes.module.system.controller.admin.user.vo.profile.UserProfileUpd import com.cf.imes.module.system.dal.dataobject.dept.DeptDO; import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO; import com.cf.imes.module.system.service.dept.DeptService; -import com.cf.imes.module.system.service.dept.PostService; import com.cf.imes.module.system.service.user.AdminUserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -42,8 +41,6 @@ public class OAuth2UserController { private AdminUserService userService; @Resource private DeptService deptService; - @Resource - private PostService postService; @GetMapping("/get") @Operation(summary = "获得用户基本信息") @@ -57,11 +54,6 @@ public class OAuth2UserController { DeptDO dept = deptService.getDept(user.getDeptId()); resp.setDept(BeanUtils.toBean(dept, OAuth2UserInfoRespVO.Dept.class)); } -// // 获得岗位信息 -// if (CollUtil.isNotEmpty(user.getPostIds())) { -// List posts = postService.getPostList(user.getPostIds()); -// resp.setPosts(BeanUtils.toBean(posts, OAuth2UserInfoRespVO.Post.class)); -// } return success(resp); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java index 004d9c71f..43432c3bd 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java @@ -6,6 +6,7 @@ import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.collection.CollectionUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.excel.core.util.ExcelUtils; import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX; @@ -121,8 +122,8 @@ public class UserController { return success(new PageResult<>(pageResult.getTotal())); } // 拼接数据 - Map deptMap = deptService.getDeptMap( - convertList(pageResult.getList(), AdminUserDO::getDeptId)); + Map deptMap = CollectionUtils.convertMap( + deptService.getDeptList(convertList(pageResult.getList(), AdminUserDO::getDeptId)), DeptDO::getId); return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap), pageResult.getTotal())); } @@ -155,8 +156,7 @@ public class UserController { @RequestParam(value = "deptId", required = false) Long deptId) { List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus(), organId, deptId); // 拼接数据 - Map deptMap = deptService.getDeptMap( - convertList(list, AdminUserDO::getDeptId)); + Map deptMap = CollectionUtils.convertMap(deptService.getDeptList(convertList(list, AdminUserDO::getDeptId)), DeptDO::getId); return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); } @@ -194,8 +194,7 @@ public class UserController { Map> listMap = userPostDTOS.stream().collect(Collectors.groupingBy(UserPostDTO::getUserId)); // 输出 Excel - Map deptMap = deptService.getDeptMap( - convertList(list, AdminUserDO::getDeptId)); + Map deptMap = CollectionUtils.convertMap(deptService.getDeptList(convertList(list, AdminUserDO::getDeptId)), DeptDO::getId); List userRespVOS = UserConvert.INSTANCE.convertExportList(list, deptMap); userRespVOS.forEach(e-> { List userPostDTOS1 = listMap.get(e.getId()); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserProfileController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserProfileController.java index d36d2556c..e96fbe8f8 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserProfileController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserProfileController.java @@ -12,7 +12,6 @@ import com.cf.imes.module.system.dal.dataobject.permission.RoleDO; import com.cf.imes.module.system.dal.dataobject.social.SocialUserDO; import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO; import com.cf.imes.module.system.service.dept.DeptService; -import com.cf.imes.module.system.service.dept.PostService; import com.cf.imes.module.system.service.permission.PermissionService; import com.cf.imes.module.system.service.permission.RoleService; import com.cf.imes.module.system.service.social.SocialUserService; @@ -45,8 +44,6 @@ public class UserProfileController { @Resource private DeptService deptService; @Resource - private PostService postService; - @Resource private PermissionService permissionService; @Resource private RoleService roleService; @@ -62,8 +59,6 @@ public class UserProfileController { List userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); // 获得部门信息 DeptDO dept = user.getDeptId() != null ? deptService.getDept(user.getDeptId()) : null; -// // 获得岗位信息 -// List posts = CollUtil.isNotEmpty(user.getPostIds()) ? postService.getPostList(user.getPostIds()) : null; // 获得社交用户信息 List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN.getValue()); return success(UserConvert.INSTANCE.convert(user, userRoles, dept, null, socialUsers)); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/dept/DeptMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/dept/DeptMapper.java index ef53bf4b6..e330d46b4 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/dept/DeptMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/dept/DeptMapper.java @@ -3,12 +3,8 @@ package com.cf.imes.module.system.dal.mysql.dept; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.organ.core.context.OrganContextHolder; -import com.cf.imes.framework.organ.core.security.OrganSecurityWebFilter; -import com.cf.imes.framework.security.core.LoginUser; -import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import com.cf.imes.module.system.dal.dataobject.dept.DeptDO; -import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; @@ -18,19 +14,12 @@ import java.util.Objects; @Mapper public interface DeptMapper extends BaseMapperX { - default List selectList(DeptListReqVO reqVO) { + default List selectList(DeptListReqVO reqVO, Long organId) { LambdaQueryWrapperX lambdaQueryWrapperX = new LambdaQueryWrapperX<>(); - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - assert loginUser != null; - Boolean isSupAdmin = loginUser.getIsSupAdmin(); - if(isSupAdmin && !Objects.isNull(reqVO.getOrganId())) { - lambdaQueryWrapperX.eqIfPresent(DeptDO::getOrganId, reqVO.getOrganId()); - }else{ - lambdaQueryWrapperX.eqIfPresent(DeptDO::getOrganId, loginUser.getOrganId()); - } return selectList(lambdaQueryWrapperX .likeIfPresent(DeptDO::getName, reqVO.getName()) - .eqIfPresent(DeptDO::getStatus, reqVO.getStatus())); + .eqIfPresent(DeptDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeptDO::getOrganId, organId)); } default DeptDO selectByParentIdAndName(Long parentId, String name, Long organId) { diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/config/ChenfengSystemRedisConfiguration.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/config/ChenfengSystemRedisConfiguration.java new file mode 100644 index 000000000..51a5acd56 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/config/ChenfengSystemRedisConfiguration.java @@ -0,0 +1,20 @@ +package com.cf.imes.module.system.framework.redis.config; + +import com.cf.imes.module.system.util.redis.SystemRedisUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.StringRedisTemplate; + +/** + * system 模块的Redisa Configuration + * + * @author Gqr + * @since 2025/9/10 10:07 + */ +@Configuration(proxyBeanMethods = false) +public class ChenfengSystemRedisConfiguration { + @Bean + public SystemRedisUtils systemRedisUtils(StringRedisTemplate stringRedisTemplate) { + return new SystemRedisUtils(stringRedisTemplate); + } +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/package-info.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/package-info.java new file mode 100644 index 000000000..8f726a752 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/framework/redis/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.cf.imes.module.system.framework.redis; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptService.java index c46ad74bf..b3cb132dd 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptService.java @@ -1,13 +1,11 @@ package com.cf.imes.module.system.service.dept; -import com.cf.imes.framework.common.util.collection.CollectionUtils; import com.cf.imes.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import com.cf.imes.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; import com.cf.imes.module.system.dal.dataobject.dept.DeptDO; import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.Set; /** @@ -63,17 +61,6 @@ public interface DeptService { */ List getDeptList(DeptListReqVO reqVO); - /** - * 获得指定编号的部门 Map - * - * @param ids 部门编号数组 - * @return 部门 Map - */ - default Map getDeptMap(Collection ids) { - List list = getDeptList(ids); - return CollectionUtils.convertMap(list, DeptDO::getId); - } - /** * 获得指定部门的所有子部门 * @@ -90,15 +77,6 @@ public interface DeptService { */ Set getChildDeptIdListFromCache(Long id); - /** - * 校验部门们是否有效。如下情况,视为无效: - * 1. 部门编号不存在 - * 2. 部门被禁用 - * - * @param ids 角色编号数组 - */ - void validateDeptList(Collection ids); - /** * 校验部门是否存在且有效(包括上级) * @@ -106,13 +84,6 @@ public interface DeptService { */ void validDept(Long deptId); - /** - * 用户登陆时部门校验 - * - * @param deptId - */ - void validUserLoginDept(Long deptId); - /** * 移除没有归属(上级)的部门 * diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptServiceImpl.java index cfa4a0ff3..0c8d3eb8a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/DeptServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; -import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.framework.security.core.LoginUser; @@ -14,19 +13,16 @@ import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import com.cf.imes.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; import com.cf.imes.module.system.dal.dataobject.dept.DeptDO; -import com.cf.imes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; import com.cf.imes.module.system.dal.mysql.dept.DeptMapper; import com.cf.imes.module.system.dal.redis.RedisKeyConstants; import com.cf.imes.module.system.enums.ErrorCodeConstants; import com.cf.imes.module.system.service.user.AdminUserService; +import com.cf.imes.module.system.util.redis.SystemRedisUtils; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; -import org.springframework.data.redis.core.Cursor; -import org.springframework.data.redis.core.ScanOptions; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -36,7 +32,6 @@ import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.util.collection.CollectionUtils.convertSet; -import static com.cf.imes.module.system.dal.redis.RedisKeyConstants.OAUTH2_ACCESS_TOKEN; import static com.cf.imes.module.system.enums.ErrorCodeConstants.DEPT_USER_OPER_NOT_ALLOW; import static com.cf.imes.module.system.enums.ErrorCodeConstants.PARENT_DEPT_USER_OPER_NOT_ALLOW; @@ -58,15 +53,12 @@ public class DeptServiceImpl implements DeptService { private AdminUserService userService; @Resource - private StringRedisTemplate stringRedisTemplate; + private SystemRedisUtils systemRedisUtils; @Override @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 public Long createDept(DeptSaveReqVO createReqVO) { - if (createReqVO.getParentId() == null) { - createReqVO.setParentId(DeptDO.PARENT_ID_ROOT); - } // 校验父部门的有效性 validateParentDept(null, createReqVO.getParentId()); // 校验部门名的唯一性 @@ -83,9 +75,6 @@ public class DeptServiceImpl implements DeptService { allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 public void updateDept(DeptSaveReqVO updateReqVO) { Long deptId = updateReqVO.getId(); - if (updateReqVO.getParentId() == null) { - updateReqVO.setParentId(DeptDO.PARENT_ID_ROOT); - } // 校验自己存在 validateDeptExists(deptId); // 校验父部门的有效性 @@ -100,7 +89,7 @@ public class DeptServiceImpl implements DeptService { deptMapper.updateById(updateObj); if (CommonStatusEnum.DISABLE.getStatus().equals(updateReqVO.getStatus())) { // 移除部门下用户的token - scanAndCompareDeptAndDelToken(String.format(OAUTH2_ACCESS_TOKEN, "*"), deptId); + systemRedisUtils.scanAndCompareDeptAndDelToken(deptId); } } @@ -125,43 +114,15 @@ public class DeptServiceImpl implements DeptService { // 删除关联的用户 userService.deleteDeptUsers(id); // 移除部门下用户的token - scanAndCompareDeptAndDelToken(String.format(OAUTH2_ACCESS_TOKEN, "*"), id); - } - - /** - * 轮训redis token,移除对应部门下的用户的token - * - * @param keyPattern - * @param deptId - */ - private void scanAndCompareDeptAndDelToken(String keyPattern, Long deptId) { - // 根据keyPattern scan匹配的redis key - List matchKeys = new ArrayList<>(); - Cursor cursor = stringRedisTemplate.scan(ScanOptions.scanOptions().match(keyPattern).count(200).build()); - while (cursor.hasNext()) { - matchKeys.add(cursor.next()); - } - cursor.close(); - if (CollUtil.isNotEmpty(matchKeys)) { - for (String key : matchKeys) { - // 获取key下的用户信息 - OAuth2AccessTokenDO oAuth2AccessTokenDO = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(key), OAuth2AccessTokenDO.class); - if (ObjectUtil.equal(deptId, oAuth2AccessTokenDO.getDeptId())) { - // 用户id匹配上了删除redis中的token缓存 - stringRedisTemplate.delete(key); - return; - } - } - } + systemRedisUtils.scanAndCompareDeptAndDelToken(id); } /** * 检查是否操作当前部门 */ private void checkCurrentWhenOperate(Long deptId) { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - Long currentDeptId = loginUser.getDeptId(); - if (ObjectUtil.isNotNull(loginUser) && ObjectUtil.equal(deptId, currentDeptId)) { + Long currentDeptId = SecurityFrameworkUtils.getUserDeptId(); + if (ObjectUtil.equal(deptId, currentDeptId)) { throw exception(DEPT_USER_OPER_NOT_ALLOW); } // 递归查询所有下级,如果当前用户在范围内不允许操作 @@ -260,7 +221,17 @@ public class DeptServiceImpl implements DeptService { @Override public List getDeptList(DeptListReqVO reqVO) { - List list = deptMapper.selectList(reqVO); + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + assert loginUser != null; + Boolean isSupAdmin = loginUser.getIsSupAdmin(); + Long organId; + // 只有超管的情况下可以查看请求来源的组织下部门 + if (isSupAdmin && !Objects.isNull(reqVO.getOrganId())) { + organId = reqVO.getOrganId(); + } else { + organId = loginUser.getOrganId(); + } + List list = deptMapper.selectList(reqVO, organId); list.sort(Comparator.comparing(DeptDO::getSort)); return list; } @@ -291,25 +262,6 @@ public class DeptServiceImpl implements DeptService { return convertSet(children, DeptDO::getId); } - @Override - public void validateDeptList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得科室信息 - Map deptMap = getDeptMap(ids); - // 校验 - ids.forEach(id -> { - DeptDO dept = deptMap.get(id); - if (dept == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.DEPT_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.DEPT_NOT_ENABLE, dept.getName()); - } - }); - } - @Override public void validDept(Long deptId) { DeptDO deptDO = deptMapper.selectById(deptId); @@ -324,21 +276,6 @@ public class DeptServiceImpl implements DeptService { } - // 用户登陆时部门校验,部门不存在时也可以进行登录 - @Override - public void validUserLoginDept(Long deptId) { - DeptDO deptDO = deptMapper.selectById(deptId); - if (deptDO == null) { - return; - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(deptDO.getStatus())) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.DEPT_NOT_ALLOWED_LOGIN, deptDO.getName()); - } - // 递归校验上级部门 - validParentDept(deptDO); - } - - /** * 递归校验上级部门 * @@ -414,7 +351,6 @@ public class DeptServiceImpl implements DeptService { currentId = currentDept.getParentId(); } - topLevelCache.put(deptDO.getId(), false); return false; // 默认返回false } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostService.java deleted file mode 100644 index f0cb157dd..000000000 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.cf.imes.module.system.service.dept; - -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostPageReqVO; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostSaveReqVO; -import com.cf.imes.module.system.dal.dataobject.dept.PostDO; -import org.springframework.lang.Nullable; - -import java.util.Collection; -import java.util.List; - -/** - * 岗位 Service 接口 - * - * @author 晨丰科技 - */ -public interface PostService { - - /** - * 创建岗位 - * - * @param createReqVO 岗位信息 - * @return 岗位编号 - */ - Long createPost(PostSaveReqVO createReqVO); - - /** - * 更新岗位 - * - * @param updateReqVO 岗位信息 - */ - void updatePost(PostSaveReqVO updateReqVO); - - /** - * 删除岗位信息 - * - * @param id 岗位编号 - */ - void deletePost(Long id); - - /** - * 获得岗位列表 - * - * @param ids 岗位编号数组 - * @return 部门列表 - */ - List getPostList(@Nullable Collection ids); - - /** - * 获得符合条件的岗位列表 - * - * @param ids 岗位编号数组。如果为空,不进行筛选 - * @param statuses 状态数组。如果为空,不进行筛选 - * @return 部门列表 - */ - List getPostList(@Nullable Collection ids, - @Nullable Collection statuses, - Long organId - ); - - /** - * 获得岗位分页列表 - * - * @param reqVO 分页条件 - * @return 部门分页列表 - */ - PageResult getPostPage(PostPageReqVO reqVO); - - /** - * 获得岗位信息 - * - * @param id 岗位编号 - * @return 岗位信息 - */ - PostDO getPost(Long id); - - /** - * 校验岗位们是否有效。如下情况,视为无效: - * 1. 岗位编号不存在 - * 2. 岗位被禁用 - * - * @param ids 岗位编号数组 - */ - void validatePostList(Collection ids); - -} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostServiceImpl.java deleted file mode 100644 index af675c272..000000000 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/dept/PostServiceImpl.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.cf.imes.module.system.service.dept; - -import cn.hutool.core.collection.CollUtil; -import com.cf.imes.framework.common.enums.CommonStatusEnum; -import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostPageReqVO; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostSaveReqVO; -import com.cf.imes.module.system.dal.dataobject.dept.PostDO; -import com.cf.imes.module.system.dal.mysql.dept.PostMapper; -import com.cf.imes.module.system.enums.ErrorCodeConstants; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import jakarta.annotation.Resource; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.cf.imes.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 岗位 Service 实现类 - * - * @author 晨丰科技 - */ -@Service -@Validated -public class PostServiceImpl implements PostService { - - @Resource - private PostMapper postMapper; - - @Override - public Long createPost(PostSaveReqVO createReqVO) { - // 校验正确性 - validatePostForCreateOrUpdate(null, createReqVO.getName(), createReqVO.getCode()); - - // 插入岗位 - PostDO post = BeanUtils.toBean(createReqVO, PostDO.class); - postMapper.insert(post); - return post.getId(); - } - - @Override - public void updatePost(PostSaveReqVO updateReqVO) { - // 校验正确性 - validatePostForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getName(), updateReqVO.getCode()); - - // 更新岗位 - PostDO updateObj = BeanUtils.toBean(updateReqVO, PostDO.class); - postMapper.updateById(updateObj); - } - - @Override - public void deletePost(Long id) { - // 校验是否存在 - validatePostExists(id); - // 删除部门 - postMapper.deleteById(id); - } - - private void validatePostForCreateOrUpdate(Long id, String name, String code) { - // 校验自己存在 - validatePostExists(id); - // 校验岗位名的唯一性 - validatePostNameUnique(id, name); - // 校验岗位编码的唯一性 - validatePostCodeUnique(id, code); - } - - private void validatePostNameUnique(Long id, String name) { - PostDO post = postMapper.selectByName(name); - if (post == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的岗位 - if (id == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.POST_NAME_DUPLICATE); - } - if (!post.getId().equals(id)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.POST_NAME_DUPLICATE); - } - } - - private void validatePostCodeUnique(Long id, String code) { - PostDO post = postMapper.selectByCode(code); - if (post == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的岗位 - if (id == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.POST_CODE_DUPLICATE); - } - if (!post.getId().equals(id)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.POST_CODE_DUPLICATE); - } - } - - private void validatePostExists(Long id) { - if (id == null) { - return; - } - if (postMapper.selectById(id) == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.POST_NOT_FOUND); - } - } - - @Override - public List getPostList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return postMapper.selectBatchIds(ids); - } - - @Override - public List getPostList(Collection ids, Collection statuses, Long organId) { - return postMapper.selectList(ids, statuses, organId); - } - - @Override - public PageResult getPostPage(PostPageReqVO reqVO) { - return postMapper.selectPage(reqVO); - } - - @Override - public PostDO getPost(Long id) { - return postMapper.selectById(id); - } - - @Override - public void validatePostList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 获得岗位信息 - List posts = postMapper.selectBatchIds(ids); - Map postMap = convertMap(posts, PostDO::getId); - // 校验 - ids.forEach(id -> { - PostDO post = postMap.get(id); - if (post == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.POST_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.POST_NOT_ENABLE, post.getName()); - } - }); - } -} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java index 8f9ed64cb..5fcf1a0c0 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java @@ -42,7 +42,6 @@ import com.cf.imes.module.system.enums.logger.LoginLogTypeEnum; import com.cf.imes.module.system.enums.logger.LoginResultEnum; import com.cf.imes.module.system.enums.sms.SmsSceneEnum; import com.cf.imes.module.system.service.dept.DeptService; -import com.cf.imes.module.system.service.dept.PostService; import com.cf.imes.module.system.service.logger.LoginLogService; import com.cf.imes.module.system.service.organ.OrganService; import com.cf.imes.module.system.service.permission.PermissionService; @@ -90,8 +89,6 @@ public class AdminUserServiceImpl implements AdminUserService { @Resource private DeptService deptService; @Resource - private PostService postService; - @Resource private PermissionService permissionService; @Resource private PasswordEncoder passwordEncoder; @@ -544,8 +541,6 @@ public class AdminUserServiceImpl implements AdminUserService { // 校验部门处于开启状态 deptService.validDept(deptId); } -// // 校验岗位处于开启状态 -// postService.validatePostList(postIds); return adminUserDO; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/util/redis/SystemRedisUtils.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/util/redis/SystemRedisUtils.java new file mode 100644 index 000000000..17432b42e --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/util/redis/SystemRedisUtils.java @@ -0,0 +1,53 @@ +package com.cf.imes.module.system.util.redis; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.util.json.JsonUtils; +import com.cf.imes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import lombok.AllArgsConstructor; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.ArrayList; +import java.util.List; + +import static com.cf.imes.module.system.dal.redis.RedisKeyConstants.OAUTH2_ACCESS_TOKEN; + +/** + * system 模块 redis处理工具 + * + * @author Gqr + * @since 2025/9/9 17:42 + */ +@AllArgsConstructor +public class SystemRedisUtils { + + private StringRedisTemplate stringRedisTemplate; + + /** + * 轮训redis token,移除对应部门下的用户的token + * + * @param deptId + */ + public void scanAndCompareDeptAndDelToken(Long deptId) { + // 根据keyPattern scan匹配的redis key + List matchKeys = new ArrayList<>(); + Cursor cursor = stringRedisTemplate.scan(ScanOptions.scanOptions().match(String.format(OAUTH2_ACCESS_TOKEN, "*")).count(200).build()); + while (cursor.hasNext()) { + matchKeys.add(cursor.next()); + } + cursor.close(); + if (CollUtil.isNotEmpty(matchKeys)) { + for (String key : matchKeys) { + // 获取key下的用户信息 + OAuth2AccessTokenDO oAuth2AccessTokenDO = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(key), OAuth2AccessTokenDO.class); + if (ObjectUtil.equal(deptId, oAuth2AccessTokenDO.getDeptId())) { + // 用户id匹配上了删除redis中的token缓存 + stringRedisTemplate.delete(key); + return; + } + } + } + } +} diff --git a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/DeptServiceImplTest.java b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/DeptServiceImplTest.java index 0ccd1d6ee..f832fab7f 100644 --- a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/DeptServiceImplTest.java +++ b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/DeptServiceImplTest.java @@ -2,16 +2,26 @@ package com.cf.imes.module.system.service.dept; import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.util.object.ObjectUtils; -import com.cf.imes.framework.test.core.ut.BaseDbUnitTest; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; +import com.cf.imes.framework.security.core.LoginUser; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; +import com.cf.imes.framework.security.test.WithMockLoginUser; +import com.cf.imes.framework.test.core.ut.BaseDbAndRedisUnitTest; import com.cf.imes.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import com.cf.imes.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; import com.cf.imes.module.system.dal.dataobject.dept.DeptDO; +import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO; import com.cf.imes.module.system.dal.mysql.dept.DeptMapper; +import com.cf.imes.module.system.service.user.AdminUserService; +import com.cf.imes.module.system.util.redis.SystemRedisUtils; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import jakarta.annotation.Resource; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -19,8 +29,9 @@ import static com.cf.imes.framework.test.core.util.AssertUtils.assertPojoEquals; import static com.cf.imes.framework.test.core.util.AssertUtils.assertServiceException; import static com.cf.imes.framework.test.core.util.RandomUtils.*; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; -import static java.util.Collections.singletonList; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.when; /** * {@link DeptServiceImpl} 的单元测试类 @@ -28,13 +39,19 @@ import static org.junit.jupiter.api.Assertions.*; * @author niudehua */ @Import(DeptServiceImpl.class) -public class DeptServiceImplTest extends BaseDbUnitTest { +public class DeptServiceImplTest extends BaseDbAndRedisUnitTest { @Resource private DeptServiceImpl deptService; @Resource private DeptMapper deptMapper; + @MockitoBean + private AdminUserService userService; + + @MockitoBean + private SystemRedisUtils systemRedisUtils; + @Test public void testCreateDept() { // 准备参数 @@ -54,7 +71,8 @@ public class DeptServiceImplTest extends BaseDbUnitTest { } @Test - public void testUpdateDept() { + @WithMockLoginUser + public void testUpdateDept_enable() { // mock 数据 DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 @@ -63,7 +81,7 @@ public class DeptServiceImplTest extends BaseDbUnitTest { // 设置更新的 ID o.setParentId(DeptDO.PARENT_ID_ROOT); o.setId(dbDeptDO.getId()); - o.setStatus(randomCommonStatus()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); }); // 调用 @@ -74,6 +92,50 @@ public class DeptServiceImplTest extends BaseDbUnitTest { } @Test + @WithMockLoginUser + public void testUpdateDept_disable() { + // mock 数据 + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DeptSaveReqVO reqVO = randomPojo(DeptSaveReqVO.class, o -> { + // 设置更新的 ID + o.setParentId(DeptDO.PARENT_ID_ROOT); + o.setId(dbDeptDO.getId()); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + }); + + // 调用 + deptService.updateDept(reqVO); + // 校验是否更新正确 + DeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, deptDO); + } + + @Test + @WithMockLoginUser + public void testUpdateDept_parentDeptUserOperNotAllow() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + // mock 数据 + DeptDO parentDeptDO = randomPojo(DeptDO.class, o -> o.setId(randomLongId())); + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> { + o.setId(loginUser.getDeptId()); + o.setParentId(parentDeptDO.getId()); + }); + deptMapper.insert(parentDeptDO); + deptMapper.insert(dbDeptDO); + // 准备参数 + DeptSaveReqVO reqVO = randomPojo(DeptSaveReqVO.class, o -> { + o.setParentId(DeptDO.PARENT_ID_ROOT); + o.setId(parentDeptDO.getId()); + }); + + assertServiceException(() -> deptService.updateDept(reqVO), + PARENT_DEPT_USER_OPER_NOT_ALLOW); + } + + @Test + @WithMockLoginUser public void testDeleteDept_success() { // mock 数据 DeptDO dbDeptDO = randomPojo(DeptDO.class); @@ -87,6 +149,36 @@ public class DeptServiceImplTest extends BaseDbUnitTest { assertNull(deptMapper.selectById(id)); } + @Test + @WithMockLoginUser + public void testDeleteDept_deptUserOperNotAllow() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + // mock 数据 + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setId(loginUser.getDeptId())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDeptDO.getId(); + + assertServiceException(() -> deptService.deleteDept(id), + DEPT_USER_OPER_NOT_ALLOW); + } + + @Test + @WithMockLoginUser + public void testDeleteDept_deptUserExists(){ + // mock 数据 + DeptDO dbDeptDO = randomPojo(DeptDO.class); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDeptDO.getId(); + + when(userService.getUserListByDeptIds(anyList())) + .thenReturn(Collections.singletonList(new AdminUserDO())); + + assertServiceException(() -> deptService.deleteDept(id), + DEPT_EXISTS_USER); + } + @Test public void testDeleteDept_exitsChildren() { // mock 数据 @@ -104,6 +196,22 @@ public class DeptServiceImplTest extends BaseDbUnitTest { assertServiceException(() -> deptService.deleteDept(parentDept.getId()), DEPT_EXITS_CHILDREN); } + @Test + public void testValidateDeptExists_idIsNull() { + // 调用,不抛异常 + deptService.validateDeptExists(null); + } + + @Test + public void testValidateDeptExists_exists() { + // mock 数据 + DeptDO deptDO = randomPojo(DeptDO.class); + deptMapper.insert(deptDO); + + // 调用,不抛异常 + deptService.validateDeptExists(deptDO.getId()); + } + @Test public void testValidateDeptExists_notFound() { // 准备参数 @@ -123,15 +231,73 @@ public class DeptServiceImplTest extends BaseDbUnitTest { DEPT_PARENT_ERROR); } + @Test + public void testValidateParentDept_parentNotExists() { + Long id = randomLongId(); + Long parentId = randomLongId(); // 假设不存在的 ID + assertServiceException(() -> deptService.validateParentDept(id, parentId), + DEPT_PARENT_NOT_EXITS); + } + + @Test + public void testValidateParentDept_parentDisabled() { + DeptDO parentDept = randomPojo(DeptDO.class); + parentDept.setStatus(CommonStatusEnum.DISABLE.getStatus()); + deptMapper.insert(parentDept); + + Long id = randomLongId(); + Long parentId = parentDept.getId(); + + assertServiceException(() -> deptService.validateParentDept(id, parentId), + PARENT_DEPT_DISABLE, parentDept.getName()); + } + + @Test + public void testValidateParentDept_multiLevelParentDisabled() { + // 构造三级部门:grandParent -> parent -> child + DeptDO grandParent = randomPojo(DeptDO.class); + grandParent.setStatus(CommonStatusEnum.DISABLE.getStatus()); + deptMapper.insert(grandParent); + + DeptDO parent = randomPojo(DeptDO.class, o -> o.setParentId(grandParent.getId())); + parent.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(parent); + + Long id = randomLongId(); + Long parentId = parent.getId(); + + assertServiceException(() -> deptService.validateParentDept(id, parentId), + PARENT_DEPT_DISABLE, grandParent.getName()); + } + + @Test + public void testValidateParentDept_validHierarchy() { + DeptDO grandParent = randomPojo(DeptDO.class); + grandParent.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(grandParent); + + DeptDO parent = randomPojo(DeptDO.class, o -> o.setParentId(grandParent.getId())); + parent.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(parent); + + Long id = randomLongId(); + Long parentId = parent.getId(); + + // 不抛异常 + deptService.validateParentDept(id, parentId); + } + @Test public void testValidateParentDept_parentIsChild() { // mock 数据(父节点) DeptDO parentDept = randomPojo(DeptDO.class); + parentDept.setStatus(CommonStatusEnum.ENABLE.getStatus()); deptMapper.insert(parentDept); // mock 数据(子节点) DeptDO childDept = randomPojo(DeptDO.class, o -> { o.setParentId(parentDept.getId()); }); + childDept.setStatus(CommonStatusEnum.ENABLE.getStatus()); deptMapper.insert(childDept); // 准备参数 @@ -152,12 +318,64 @@ public class DeptServiceImplTest extends BaseDbUnitTest { Long id = randomLongId(); Long parentId = deptDO.getParentId(); String name = deptDO.getName(); + Long organId = deptDO.getOrganId(); // 调用, 并断言异常 - assertServiceException(() -> deptService.validateDeptNameUnique(id, parentId, name, null), + assertServiceException(() -> deptService.validateDeptNameUnique(id, parentId, name, organId), DEPT_NAME_DUPLICATE); } + @Test + public void testValidateDeptNameUnique_newDeptDuplicate() { + // mock 数据 + DeptDO deptDO = randomPojo(DeptDO.class); + deptMapper.insert(deptDO); + + // 准备参数:id = null,模拟新增 + Long id = null; + Long parentId = deptDO.getParentId(); + String name = deptDO.getName(); + Long organId = deptDO.getOrganId(); + + // 调用,并断言异常 + assertServiceException(() -> deptService.validateDeptNameUnique(id, parentId, name, organId), + DEPT_NAME_DUPLICATE); + } + + @Test + public void testValidateDeptNameUnique_updateOtherDeptDuplicate() { + // mock 数据 + DeptDO deptDO = randomPojo(DeptDO.class); + deptMapper.insert(deptDO); + + // 准备参数:id 不同,模拟更新到重名部门 + Long id = randomLongId(); // 与 deptDO 的 id 不同 + Long parentId = deptDO.getParentId(); + String name = deptDO.getName(); + Long organId = deptDO.getOrganId(); + + // 调用,并断言异常 + assertServiceException(() -> deptService.validateDeptNameUnique(id, parentId, name, organId), + DEPT_NAME_DUPLICATE); + } + + @Test + public void testValidateDeptNameUnique_updateSameDept() { + // mock 数据 + DeptDO deptDO = randomPojo(DeptDO.class); + deptMapper.insert(deptDO); + + // 准备参数:id 相同,表示更新自己 + Long id = deptDO.getId(); + Long parentId = deptDO.getParentId(); + String name = deptDO.getName(); + Long organId = deptDO.getOrganId(); + + // 调用,不抛异常 + deptService.validateDeptNameUnique(id, parentId, name, organId); + } + + @Test public void testGetDept() { // mock 数据 @@ -191,11 +409,47 @@ public class DeptServiceImplTest extends BaseDbUnitTest { } @Test - public void testGetDeptList_reqVO() { + public void testGetDeptList_emptyids() { + assertEquals(0, deptService.getDeptList(Collections.emptyList()).size()); + } + + @Test + @WithMockLoginUser(isSuperAdmin = true) + public void testGetDeptList_superadmin_reqVO() { + Long organId = SecurityFrameworkUtils.getUserOrganId(); // mock 数据 DeptDO dept = randomPojo(DeptDO.class, o -> { // 等会查询到 o.setName("开发部"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setOrganId(organId); + }); + deptMapper.insert(dept); + // 测试 name 不匹配 + deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> o.setName("发"))); + // 测试 status 不匹配 + deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + DeptListReqVO reqVO = new DeptListReqVO(); + reqVO.setName("开"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setOrganId(organId); + + // 调用 + List sysDeptDOS = deptService.getDeptList(reqVO); + // 断言 + assertEquals(1, sysDeptDOS.size()); + assertPojoEquals(dept, sysDeptDOS.get(0)); + } + + @Test + @WithMockLoginUser + public void testGetDeptList_commonuser_reqVO() { + Long organId = SecurityFrameworkUtils.getUserOrganId(); + // mock 数据 + DeptDO dept = randomPojo(DeptDO.class, o -> { // 等会查询到 + o.setName("开发部"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setOrganId(organId); }); deptMapper.insert(dept); // 测试 name 不匹配 @@ -261,36 +515,125 @@ public class DeptServiceImplTest extends BaseDbUnitTest { } @Test - public void testValidateDeptList_success() { - // mock 数据 - DeptDO deptDO = randomPojo(DeptDO.class).setStatus(CommonStatusEnum.ENABLE.getStatus()); - deptMapper.insert(deptDO); - // 准备参数 - List ids = singletonList(deptDO.getId()); + public void testValidDept_NotFound() { + // 部门不存在 + assertServiceException(() -> deptService.validDept(1L), DEPT_NOT_FOUND); + } + + @Test + public void testValidDept_Disabled() { + // 部门状态不可用 + DeptDO disableDbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + deptMapper.insert(disableDbDeptDO); + assertServiceException(() -> deptService.validDept(disableDbDeptDO.getId()), DEPT_DISABLE, disableDbDeptDO.getName()); + } + + @Test + public void testValidDept_ParentNotFound() { + DeptDO enabledbDeptDO = randomPojo(DeptDO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + deptMapper.insert(enabledbDeptDO); + assertServiceException(() -> deptService.validDept(enabledbDeptDO.getId()), DEPT_PARENT_NOT_EXITS); + } + + @Test + public void testValidDept_ParentDisabled() { + DeptDO disabledParentDetpDO = randomPojo(DeptDO.class, o -> { + o.setId(null); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + }); + deptMapper.insert(disabledParentDetpDO); + DeptDO enabledbDeptDO = randomPojo(DeptDO.class, o -> { + o.setId(null); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(disabledParentDetpDO.getId()); + }); + deptMapper.insert(enabledbDeptDO); + assertServiceException(() -> deptService.validDept(enabledbDeptDO.getId()), DEPT_DISABLE, disabledParentDetpDO.getName()); + } + + @Test + public void testValidDept_success() { + DeptDO disabledParentDetpDO = randomPojo(DeptDO.class, o -> { + o.setId(null); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(DeptDO.PARENT_ID_ROOT); + }); + deptMapper.insert(disabledParentDetpDO); + DeptDO enabledbDeptDO = randomPojo(DeptDO.class, o -> { + o.setId(null); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(disabledParentDetpDO.getId()); + }); + deptMapper.insert(enabledbDeptDO); // 调用,无需断言 - deptService.validateDeptList(ids); + assertDoesNotThrow(()-> deptService.validDept(enabledbDeptDO.getId())); } @Test - public void testValidateDeptList_notFound() { - // 准备参数 - List ids = singletonList(randomLongId()); - - // 调用, 并断言异常 - assertServiceException(() -> deptService.validateDeptList(ids), DEPT_NOT_FOUND); + public void removeUnowndDept_empty() { + List deptDOS = deptService.removeUnowndDept(Collections.emptyList()); + assertEquals(deptDOS.size(), 0); } @Test - public void testValidateDeptList_notEnable() { - // mock 数据 - DeptDO deptDO = randomPojo(DeptDO.class).setStatus(CommonStatusEnum.DISABLE.getStatus()); - deptMapper.insert(deptDO); - // 准备参数 - List ids = singletonList(deptDO.getId()); - - // 调用, 并断言异常 - assertServiceException(() -> deptService.validateDeptList(ids), DEPT_NOT_ENABLE, deptDO.getName()); + public void removeUnowndDept_success() { + DeptDO oneParent = randomPojo(DeptDO.class, o -> o.setParentId(DeptDO.PARENT_ID_ROOT)); + DeptDO onechild1 = randomPojo(DeptDO.class, o -> o.setParentId(oneParent.getId())); + DeptDO onechild2 = randomPojo(DeptDO.class, o -> o.setParentId(oneParent.getId())); + List paramDeptList = List.of(oneParent, onechild1, onechild2); + List deptDOS = deptService.removeUnowndDept(paramDeptList); + assertEquals(deptDOS.size(), paramDeptList.size()); } + @Test + public void removeUnowndDept_ParentNotFound() { + DeptDO oneParent = randomPojo(DeptDO.class, o -> o.setParentId(DeptDO.PARENT_ID_ROOT)); + DeptDO one = randomPojo(DeptDO.class, o -> o.setParentId(oneParent.getId())); + DeptDO two = randomPojo(DeptDO.class); + List paramDeptList = List.of(oneParent, one, two); + List deptDOS = deptService.removeUnowndDept(paramDeptList); + assertNotEquals(deptDOS.size(), paramDeptList.size()); + } + + @Test + public void getAllInvalidDeptIds_success() { + Long organId = randomLongId(); + DeptDO oneParent = randomPojo(DeptDO.class, o -> { + o.setId(randomLongId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setOrganId(organId); + o.setParentId(DeptDO.PARENT_ID_ROOT); + }); + Long parentId = oneParent.getId(); + DeptDO one = randomPojo(DeptDO.class, o -> { + o.setStatus(randomCommonStatus()); + o.setOrganId(organId); + o.setParentId(parentId); + }); + DeptDO two = randomPojo(DeptDO.class, o -> { + o.setStatus(randomCommonStatus()); + o.setOrganId(organId); + o.setParentId(parentId); + }); + DeptDO three = randomPojo(DeptDO.class, o -> { + o.setStatus(randomCommonStatus()); + o.setOrganId(organId); + o.setParentId(parentId); + }); + List deptDOS = List.of(oneParent, one, two, three); + // 批量插入 + deptMapper.insertBatch(deptDOS); + long disableCount = deptDOS.stream().filter(o -> CommonStatusEnum.DISABLE.getStatus().equals(o.getStatus())).count(); + Set allInvalidDeptIds = deptService.getAllInvalidDeptIds(organId); + + assertEquals(disableCount, allInvalidDeptIds.size()); + + OrganContextHolder.setOrganId(organId); + Set noOrganAllInvalidDeptIds = deptService.getAllInvalidDeptIds(null); + assertEquals(disableCount, noOrganAllInvalidDeptIds.size()); + + } } diff --git a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/PostServiceImplTest.java b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/PostServiceImplTest.java deleted file mode 100644 index dbc3b5904..000000000 --- a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/dept/PostServiceImplTest.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.cf.imes.module.system.service.dept; - -import com.cf.imes.framework.common.enums.CommonStatusEnum; -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.common.util.collection.ArrayUtils; -import com.cf.imes.framework.test.core.ut.BaseDbUnitTest; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostPageReqVO; -import com.cf.imes.module.system.controller.admin.dept.vo.post.PostSaveReqVO; -import com.cf.imes.module.system.dal.dataobject.dept.PostDO; -import com.cf.imes.module.system.dal.mysql.dept.PostMapper; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import jakarta.annotation.Resource; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static com.cf.imes.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.cf.imes.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.cf.imes.framework.test.core.util.AssertUtils.assertServiceException; -import static com.cf.imes.framework.test.core.util.RandomUtils.*; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link PostServiceImpl} 的单元测试类 - * - * @author niudehua - */ -@Import(PostServiceImpl.class) -public class PostServiceImplTest extends BaseDbUnitTest { - - @Resource - private PostServiceImpl postService; - - @Resource - private PostMapper postMapper; - - @Test - public void testCreatePost_success() { - // 准备参数 - PostSaveReqVO reqVO = randomPojo(PostSaveReqVO.class, - o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())) - .setId(null); // 防止 id 被设置 - // 调用 - Long postId = postService.createPost(reqVO); - - // 断言 - assertNotNull(postId); - // 校验记录的属性是否正确 - PostDO post = postMapper.selectById(postId); - assertPojoEquals(reqVO, post, "id"); - } - - @Test - public void testUpdatePost_success() { - // mock 数据 - PostDO postDO = randomPostDO(); - postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 - // 准备参数 - PostSaveReqVO reqVO = randomPojo(PostSaveReqVO.class, o -> { - // 设置更新的 ID - o.setId(postDO.getId()); - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); - }); - - // 调用 - postService.updatePost(reqVO); - // 校验是否更新正确 - PostDO post = postMapper.selectById(reqVO.getId()); - assertPojoEquals(reqVO, post); - } - - @Test - public void testDeletePost_success() { - // mock 数据 - PostDO postDO = randomPostDO(); - postMapper.insert(postDO); - // 准备参数 - Long id = postDO.getId(); - - // 调用 - postService.deletePost(id); - assertNull(postMapper.selectById(id)); - } - - @Test - public void testValidatePost_notFoundForDelete() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> postService.deletePost(id), POST_NOT_FOUND); - } - - @Test - public void testValidatePost_nameDuplicateForCreate() { - // mock 数据 - PostDO postDO = randomPostDO(); - postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 - // 准备参数 - PostSaveReqVO reqVO = randomPojo(PostSaveReqVO.class, - // 模拟 name 重复 - o -> o.setName(postDO.getName())); - assertServiceException(() -> postService.createPost(reqVO), POST_NAME_DUPLICATE); - } - - @Test - public void testValidatePost_codeDuplicateForUpdate() { - // mock 数据 - PostDO postDO = randomPostDO(); - postMapper.insert(postDO); - // mock 数据:稍后模拟重复它的 code - PostDO codePostDO = randomPostDO(); - postMapper.insert(codePostDO); - // 准备参数 - PostSaveReqVO reqVO = randomPojo(PostSaveReqVO.class, o -> { - // 设置更新的 ID - o.setId(postDO.getId()); - // 模拟 code 重复 - o.setCode(codePostDO.getCode()); - }); - - // 调用, 并断言异常 - assertServiceException(() -> postService.updatePost(reqVO), POST_CODE_DUPLICATE); - } - - @Test - public void testGetPostPage() { - // mock 数据 - PostDO postDO = randomPojo(PostDO.class, o -> { - o.setName("码仔"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - postMapper.insert(postDO); - // 测试 name 不匹配 - postMapper.insert(cloneIgnoreId(postDO, o -> o.setName("程序员"))); - // 测试 status 不匹配 - postMapper.insert(cloneIgnoreId(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 准备参数 - PostPageReqVO reqVO = new PostPageReqVO(); - reqVO.setName("码"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - - // 调用 - PageResult pageResult = postService.getPostPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(postDO, pageResult.getList().get(0)); - } - - @Test - public void testGetPostList() { - // mock 数据 - PostDO postDO01 = randomPojo(PostDO.class); - postMapper.insert(postDO01); - // 测试 id 不匹配 - PostDO postDO02 = randomPojo(PostDO.class); - postMapper.insert(postDO02); - // 准备参数 - List ids = singletonList(postDO01.getId()); - - // 调用 - List list = postService.getPostList(ids); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(postDO01, list.get(0)); - } - - @Test - public void testGetPostList_idsAndStatus() { - // mock 数据 - PostDO postDO01 = randomPojo(PostDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); - postMapper.insert(postDO01); - // 测试 status 不匹配 - PostDO postDO02 = randomPojo(PostDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); - postMapper.insert(postDO02); - // 准备参数 - List ids = Arrays.asList(postDO01.getId(), postDO02.getId()); - - // 调用 - List list = postService.getPostList(ids, singletonList(CommonStatusEnum.ENABLE.getStatus()),1L); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(postDO01, list.get(0)); - } - - @Test - public void testGetPost() { - // mock 数据 - PostDO dbPostDO = randomPostDO(); - postMapper.insert(dbPostDO); - // 准备参数 - Long id = dbPostDO.getId(); - // 调用 - PostDO post = postService.getPost(id); - // 断言 - assertNotNull(post); - assertPojoEquals(dbPostDO, post); - } - - @Test - public void testValidatePostList_success() { - // mock 数据 - PostDO postDO = randomPostDO().setStatus(CommonStatusEnum.ENABLE.getStatus()); - postMapper.insert(postDO); - // 准备参数 - List ids = singletonList(postDO.getId()); - - // 调用,无需断言 - postService.validatePostList(ids); - } - - @Test - public void testValidatePostList_notFound() { - // 准备参数 - List ids = singletonList(randomLongId()); - - // 调用, 并断言异常 - assertServiceException(() -> postService.validatePostList(ids), POST_NOT_FOUND); - } - - @Test - public void testValidatePostList_notEnable() { - // mock 数据 - PostDO postDO = randomPostDO().setStatus(CommonStatusEnum.DISABLE.getStatus()); - postMapper.insert(postDO); - // 准备参数 - List ids = singletonList(postDO.getId()); - - // 调用, 并断言异常 - assertServiceException(() -> postService.validatePostList(ids), POST_NOT_ENABLE, - postDO.getName()); - } - - @SafeVarargs - private static PostDO randomPostDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomCommonStatus()); // 保证 status 的范围 - }; - return randomPojo(PostDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialClientServiceImplTest.java b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialClientServiceImplTest.java deleted file mode 100644 index eb7081bdb..000000000 --- a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialClientServiceImplTest.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.cf.imes.module.system.service.social; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.api.WxMaUserService; -import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; -import cn.hutool.core.util.ReflectUtil; -import com.cf.imes.framework.common.enums.CommonStatusEnum; -import com.cf.imes.framework.common.enums.UserTypeEnum; -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.test.core.ut.BaseDbUnitTest; -import com.cf.imes.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; -import com.cf.imes.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; -import com.cf.imes.module.system.dal.dataobject.social.SocialClientDO; -import com.cf.imes.module.system.dal.mysql.social.SocialClientMapper; -import com.cf.imes.module.system.enums.social.SocialTypeEnum; -import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties; -import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; -import com.cf.imes.module.system.framework.justauth.core.AuthRequestFactory; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.AuthDefaultRequest; -import me.zhyd.oauth.request.AuthRequest; -import me.zhyd.oauth.utils.AuthStateUtils; -import me.chanjar.weixin.common.bean.WxJsapiSignature; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.data.redis.core.StringRedisTemplate; - -import jakarta.annotation.Resource; -import static com.cf.imes.framework.test.core.util.RandomUtils.*; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static com.cf.imes.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.cf.imes.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.cf.imes.framework.test.core.util.AssertUtils.assertServiceException; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -/** - * {@link SocialClientServiceImpl} 的单元测试类 - * - * @author 晨丰科技 - */ -@Import(SocialClientServiceImpl.class) -public class SocialClientServiceImplTest extends BaseDbUnitTest { - - @Resource - private SocialClientServiceImpl socialClientService; - - @Resource - private SocialClientMapper socialClientMapper; - - @MockBean - private AuthRequestFactory authRequestFactory; - - @MockBean - private WxMpService wxMpService; - @MockBean - private WxMpProperties wxMpProperties; - @MockBean - private StringRedisTemplate stringRedisTemplate; - @MockBean - private WxMaService wxMaService; - @MockBean - private WxMaProperties wxMaProperties; - - @Test - public void testGetAuthorizeUrl() { - try (MockedStatic authStateUtilsMock = mockStatic(AuthStateUtils.class)) { - // 准备参数 - Integer socialType = SocialTypeEnum.WECHAT_MP.getType(); - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - String redirectUri = "sss"; - // mock 获得对应的 AuthRequest 实现 - AuthRequest authRequest = mock(AuthRequest.class); - when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest); - // mock 方法 - authStateUtilsMock.when(AuthStateUtils::createState).thenReturn("aoteman"); - when(authRequest.authorize(eq("aoteman"))).thenReturn("https://www.cf.com?redirect_uri=yyy"); - - // 调用 - String url = socialClientService.getAuthorizeUrl(socialType, userType, redirectUri); - // 断言 - assertEquals("https://www.cf.com?redirect_uri=sss", url); - } - } - - @Test - public void testAuthSocialUser_success() { - // 准备参数 - Integer socialType = SocialTypeEnum.WECHAT_MP.getType(); - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - String code = randomString(); - String state = randomString(); - // mock 方法(AuthRequest) - AuthRequest authRequest = mock(AuthRequest.class); - when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest); - // mock 方法(AuthResponse) - AuthUser authUser = randomPojo(AuthUser.class); - AuthResponse authResponse = new AuthResponse<>(2000, null, authUser); - when(authRequest.login(argThat(authCallback -> { - assertEquals(code, authCallback.getCode()); - assertEquals(state, authCallback.getState()); - return true; - }))).thenReturn(authResponse); - - // 调用 - AuthUser result = socialClientService.getAuthUser(socialType, userType, code, state); - // 断言 - assertSame(authUser, result); - } - - @Test - public void testAuthSocialUser_fail() { - // 准备参数 - Integer socialType = SocialTypeEnum.WECHAT_MP.getType(); - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - String code = randomString(); - String state = randomString(); - // mock 方法(AuthRequest) - AuthRequest authRequest = mock(AuthRequest.class); - when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest); - // mock 方法(AuthResponse) - AuthResponse authResponse = new AuthResponse<>(0, "模拟失败", null); - when(authRequest.login(argThat(authCallback -> { - assertEquals(code, authCallback.getCode()); - assertEquals(state, authCallback.getState()); - return true; - }))).thenReturn(authResponse); - - // 调用并断言 - assertServiceException( - () -> socialClientService.getAuthUser(socialType, userType, code, state), - SOCIAL_USER_AUTH_FAILURE, "模拟失败"); - } - - @Test - public void testBuildAuthRequest_clientNull() { - // 准备参数 - Integer socialType = SocialTypeEnum.WECHAT_MP.getType(); - Integer userType = randomPojo(SocialTypeEnum.class).getType(); - // mock 获得对应的 AuthRequest 实现 - AuthRequest authRequest = mock(AuthDefaultRequest.class); - AuthConfig authConfig = (AuthConfig) ReflectUtil.getFieldValue(authRequest, "config"); - when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest); - - // 调用 - AuthRequest result = socialClientService.buildAuthRequest(socialType, userType); - // 断言 - assertSame(authRequest, result); - assertSame(authConfig, ReflectUtil.getFieldValue(authConfig, "config")); - } - - @Test - public void testBuildAuthRequest_clientDisable() { - // 准备参数 - Integer socialType = SocialTypeEnum.WECHAT_MP.getType(); - Integer userType = randomPojo(SocialTypeEnum.class).getType(); - // mock 获得对应的 AuthRequest 实现 - AuthRequest authRequest = mock(AuthDefaultRequest.class); - AuthConfig authConfig = (AuthConfig) ReflectUtil.getFieldValue(authRequest, "config"); - when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest); - // mock 数据 - SocialClientDO client = randomPojo(SocialClientDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()) - .setUserType(userType).setSocialType(socialType)); - socialClientMapper.insert(client); - - // 调用 - AuthRequest result = socialClientService.buildAuthRequest(socialType, userType); - // 断言 - assertSame(authRequest, result); - assertSame(authConfig, ReflectUtil.getFieldValue(authConfig, "config")); - } - - @Test - public void testBuildAuthRequest_clientEnable() { - // 准备参数 - Integer socialType = SocialTypeEnum.WECHAT_MP.getType(); - Integer userType = randomPojo(SocialTypeEnum.class).getType(); - // mock 获得对应的 AuthRequest 实现 - AuthConfig authConfig = mock(AuthConfig.class); - AuthRequest authRequest = mock(AuthDefaultRequest.class); - ReflectUtil.setFieldValue(authRequest, "config", authConfig); - when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest); - // mock 数据 - SocialClientDO client = randomPojo(SocialClientDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) - .setUserType(userType).setSocialType(socialType)); - socialClientMapper.insert(client); - - // 调用 - AuthRequest result = socialClientService.buildAuthRequest(socialType, userType); - // 断言 - assertSame(authRequest, result); - assertNotSame(authConfig, ReflectUtil.getFieldValue(authRequest, "config")); - } - - // =================== 微信公众号独有 =================== - - @Test - public void testCreateWxMpJsapiSignature() throws WxErrorException { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - String url = randomString(); - // mock 方法 - WxJsapiSignature signature = randomPojo(WxJsapiSignature.class); - when(wxMpService.createJsapiSignature(eq(url))).thenReturn(signature); - - // 调用 - WxJsapiSignature result = socialClientService.createWxMpJsapiSignature(userType, url); - // 断言 - assertSame(signature, result); - } - - @Test - public void testGetWxMpService_clientNull() { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - // mock 方法 - - // 调用 - WxMpService result = socialClientService.getWxMpService(userType); - // 断言 - assertSame(wxMpService, result); - } - - @Test - public void testGetWxMpService_clientDisable() { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - // mock 数据 - SocialClientDO client = randomPojo(SocialClientDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()) - .setUserType(userType).setSocialType(SocialTypeEnum.WECHAT_MP.getType())); - socialClientMapper.insert(client); - - // 调用 - WxMpService result = socialClientService.getWxMpService(userType); - // 断言 - assertSame(wxMpService, result); - } - - @Test - public void testGetWxMpService_clientEnable() { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - // mock 数据 - SocialClientDO client = randomPojo(SocialClientDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) - .setUserType(userType).setSocialType(SocialTypeEnum.WECHAT_MP.getType())); - socialClientMapper.insert(client); - // mock 方法 - WxMpProperties.ConfigStorage configStorage = mock(WxMpProperties.ConfigStorage.class); - when(wxMpProperties.getConfigStorage()).thenReturn(configStorage); - - // 调用 - WxMpService result = socialClientService.getWxMpService(userType); - // 断言 - assertNotSame(wxMpService, result); - assertEquals(client.getClientId(), result.getWxMpConfigStorage().getAppId()); - assertEquals(client.getClientSecret(), result.getWxMpConfigStorage().getSecret()); - } - - // =================== 微信小程序独有 =================== - - @Test - public void testGetWxMaPhoneNumberInfo_success() throws WxErrorException { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - String phoneCode = randomString(); - // mock 方法 - WxMaUserService userService = mock(WxMaUserService.class); - when(wxMaService.getUserService()).thenReturn(userService); - WxMaPhoneNumberInfo phoneNumber = randomPojo(WxMaPhoneNumberInfo.class); - when(userService.getPhoneNoInfo(eq(phoneCode))).thenReturn(phoneNumber); - - // 调用 - WxMaPhoneNumberInfo result = socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode); - // 断言 - assertSame(phoneNumber, result); - } - - @Test - public void testGetWxMaPhoneNumberInfo_exception() throws WxErrorException { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - String phoneCode = randomString(); - // mock 方法 - WxMaUserService userService = mock(WxMaUserService.class); - when(wxMaService.getUserService()).thenReturn(userService); - WxErrorException wxErrorException = randomPojo(WxErrorException.class); - when(userService.getPhoneNoInfo(eq(phoneCode))).thenThrow(wxErrorException); - - // 调用并断言异常 - assertServiceException(() -> socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode), - SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR); - } - - @Test - public void testGetWxMaService_clientNull() { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - // mock 方法 - - // 调用 - WxMaService result = socialClientService.getWxMaService(userType); - // 断言 - assertSame(wxMaService, result); - } - - @Test - public void testGetWxMaService_clientDisable() { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - // mock 数据 - SocialClientDO client = randomPojo(SocialClientDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()) - .setUserType(userType).setSocialType(SocialTypeEnum.WECHAT_MINI_APP.getType())); - socialClientMapper.insert(client); - - // 调用 - WxMaService result = socialClientService.getWxMaService(userType); - // 断言 - assertSame(wxMaService, result); - } - - @Test - public void testGetWxMaService_clientEnable() { - // 准备参数 - Integer userType = randomPojo(UserTypeEnum.class).getValue(); - // mock 数据 - SocialClientDO client = randomPojo(SocialClientDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) - .setUserType(userType).setSocialType(SocialTypeEnum.WECHAT_MINI_APP.getType())); - socialClientMapper.insert(client); - // mock 方法 - WxMaProperties.ConfigStorage configStorage = mock(WxMaProperties.ConfigStorage.class); - when(wxMaProperties.getConfigStorage()).thenReturn(configStorage); - - // 调用 - WxMaService result = socialClientService.getWxMaService(userType); - // 断言 - assertNotSame(wxMaService, result); - assertEquals(client.getClientId(), result.getWxMaConfig().getAppid()); - assertEquals(client.getClientSecret(), result.getWxMaConfig().getSecret()); - } - - // =================== 客户端管理 =================== - - @Test - public void testCreateSocialClient_success() { - // 准备参数 - SocialClientSaveReqVO reqVO = randomPojo(SocialClientSaveReqVO.class, - o -> o.setSocialType(randomEle(SocialTypeEnum.values()).getType()) - .setUserType(randomEle(UserTypeEnum.values()).getValue()) - .setStatus(randomCommonStatus())) - .setId(null); // 防止 id 被赋值 - - // 调用 - Long socialClientId = socialClientService.createSocialClient(reqVO); - // 断言 - assertNotNull(socialClientId); - // 校验记录的属性是否正确 - SocialClientDO socialClient = socialClientMapper.selectById(socialClientId); - assertPojoEquals(reqVO, socialClient, "id"); - } - - @Test - public void testUpdateSocialClient_success() { - // mock 数据 - SocialClientDO dbSocialClient = randomPojo(SocialClientDO.class); - socialClientMapper.insert(dbSocialClient);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SocialClientSaveReqVO reqVO = randomPojo(SocialClientSaveReqVO.class, o -> { - o.setId(dbSocialClient.getId()); // 设置更新的 ID - o.setSocialType(randomEle(SocialTypeEnum.values()).getType()) - .setUserType(randomEle(UserTypeEnum.values()).getValue()) - .setStatus(randomCommonStatus()); - }); - - // 调用 - socialClientService.updateSocialClient(reqVO); - // 校验是否更新正确 - SocialClientDO socialClient = socialClientMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, socialClient); - } - - @Test - public void testUpdateSocialClient_notExists() { - // 准备参数 - SocialClientSaveReqVO reqVO = randomPojo(SocialClientSaveReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> socialClientService.updateSocialClient(reqVO), SOCIAL_CLIENT_NOT_EXISTS); - } - - @Test - public void testDeleteSocialClient_success() { - // mock 数据 - SocialClientDO dbSocialClient = randomPojo(SocialClientDO.class); - socialClientMapper.insert(dbSocialClient);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbSocialClient.getId(); - - // 调用 - socialClientService.deleteSocialClient(id); - // 校验数据不存在了 - assertNull(socialClientMapper.selectById(id)); - } - - @Test - public void testDeleteSocialClient_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> socialClientService.deleteSocialClient(id), SOCIAL_CLIENT_NOT_EXISTS); - } - - @Test - public void testGetSocialClient() { - // mock 数据 - SocialClientDO dbSocialClient = randomPojo(SocialClientDO.class); - socialClientMapper.insert(dbSocialClient);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbSocialClient.getId(); - - // 调用 - SocialClientDO socialClient = socialClientService.getSocialClient(id); - // 校验数据正确 - assertPojoEquals(dbSocialClient, socialClient); - } - - @Test - public void testGetSocialClientPage() { - // mock 数据 - SocialClientDO dbSocialClient = randomPojo(SocialClientDO.class, o -> { // 等会查询到 - o.setName("芋头"); - o.setSocialType(SocialTypeEnum.GITEE.getType()); - o.setUserType(UserTypeEnum.ADMIN.getValue()); - o.setClientId("chenfeng"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - socialClientMapper.insert(dbSocialClient); - // 测试 name 不匹配 - socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setName(randomString()))); - // 测试 socialType 不匹配 - socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setSocialType(SocialTypeEnum.DINGTALK.getType()))); - // 测试 userType 不匹配 - socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setUserType(UserTypeEnum.MEMBER.getValue()))); - // 测试 clientId 不匹配 - socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setClientId("dao"))); - // 测试 status 不匹配 - socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 准备参数 - SocialClientPageReqVO reqVO = new SocialClientPageReqVO(); - reqVO.setName("芋"); - reqVO.setSocialType(SocialTypeEnum.GITEE.getType()); - reqVO.setUserType(UserTypeEnum.ADMIN.getValue()); - reqVO.setClientId("yu"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - - // 调用 - PageResult pageResult = socialClientService.getSocialClientPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbSocialClient, pageResult.getList().get(0)); - } - -} diff --git a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialUserServiceImplTest.java b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialUserServiceImplTest.java deleted file mode 100644 index 941a42691..000000000 --- a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/social/SocialUserServiceImplTest.java +++ /dev/null @@ -1,288 +0,0 @@ -package com.cf.imes.module.system.service.social; - -import com.cf.imes.framework.common.enums.UserTypeEnum; -import com.cf.imes.framework.common.pojo.PageResult; -import com.cf.imes.framework.test.core.ut.BaseDbUnitTest; -import com.cf.imes.module.system.api.social.dto.SocialUserBindReqDTO; -import com.cf.imes.module.system.api.social.dto.SocialUserRespDTO; -import com.cf.imes.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO; -import com.cf.imes.module.system.dal.dataobject.social.SocialUserBindDO; -import com.cf.imes.module.system.dal.dataobject.social.SocialUserDO; -import com.cf.imes.module.system.dal.mysql.social.SocialUserBindMapper; -import com.cf.imes.module.system.dal.mysql.social.SocialUserMapper; -import com.cf.imes.module.system.enums.social.SocialTypeEnum; -import me.zhyd.oauth.model.AuthUser; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import jakarta.annotation.Resource; -import java.util.List; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.hutool.core.util.RandomUtil.randomLong; -import static com.cf.imes.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static com.cf.imes.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; -import static com.cf.imes.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.cf.imes.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.cf.imes.framework.test.core.util.AssertUtils.assertServiceException; -import static com.cf.imes.framework.test.core.util.RandomUtils.randomPojo; -import static com.cf.imes.framework.test.core.util.RandomUtils.randomString; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.when; - -/** - * {@link SocialUserServiceImpl} 的单元测试类 - * - * @author 晨丰科技 - */ -@Import(SocialUserServiceImpl.class) -public class SocialUserServiceImplTest extends BaseDbUnitTest { - - @Resource - private SocialUserServiceImpl socialUserService; - - @Resource - private SocialUserMapper socialUserMapper; - @Resource - private SocialUserBindMapper socialUserBindMapper; - - @MockBean - private SocialClientService socialClientService; - - @Test - public void testGetSocialUserList() { - Long userId = 1L; - Integer userType = UserTypeEnum.ADMIN.getValue(); - // mock 获得社交用户 - SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(SocialTypeEnum.GITEE.getType()); - socialUserMapper.insert(socialUser); // 可被查到 - socialUserMapper.insert(randomPojo(SocialUserDO.class)); // 不可被查到 - // mock 获得绑定 - socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class) // 可被查询到 - .setUserId(userId).setUserType(userType).setSocialType(SocialTypeEnum.GITEE.getType()) - .setSocialUserId(socialUser.getId())); - socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class) // 不可被查询到 - .setUserId(2L).setUserType(userType).setSocialType(SocialTypeEnum.DINGTALK.getType())); - - // 调用 - List result = socialUserService.getSocialUserList(userId, userType); - // 断言 - assertEquals(1, result.size()); - assertPojoEquals(socialUser, result.get(0)); - } - - @Test - public void testBindSocialUser() { - // 准备参数 - SocialUserBindReqDTO reqDTO = new SocialUserBindReqDTO() - .setUserId(1L).setUserType(UserTypeEnum.ADMIN.getValue()) - .setSocialType(SocialTypeEnum.GITEE.getType()).setCode("test_code").setState("test_state"); - // mock 数据:获得社交用户 - SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(reqDTO.getSocialType()) - .setCode(reqDTO.getCode()).setState(reqDTO.getState()); - socialUserMapper.insert(socialUser); - // mock 数据:用户可能之前已经绑定过该社交类型 - socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class).setUserId(1L).setUserType(UserTypeEnum.ADMIN.getValue()) - .setSocialType(SocialTypeEnum.GITEE.getType()).setSocialUserId(-1L)); - // mock 数据:社交用户可能之前绑定过别的用户 - socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class).setUserType(UserTypeEnum.ADMIN.getValue()) - .setSocialType(SocialTypeEnum.GITEE.getType()).setSocialUserId(socialUser.getId())); - - // 调用 - String openid = socialUserService.bindSocialUser(reqDTO); - // 断言 - List socialUserBinds = socialUserBindMapper.selectList(); - assertEquals(1, socialUserBinds.size()); - assertEquals(socialUser.getOpenid(), openid); - } - - @Test - public void testUnbindSocialUser_success() { - // 准备参数 - Long userId = 1L; - Integer userType = UserTypeEnum.ADMIN.getValue(); - Integer type = SocialTypeEnum.GITEE.getType(); - String openid = "test_openid"; - // mock 数据:社交用户 - SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(type).setOpenid(openid); - socialUserMapper.insert(socialUser); - // mock 数据:社交绑定关系 - SocialUserBindDO socialUserBind = randomPojo(SocialUserBindDO.class).setUserType(userType) - .setUserId(userId).setSocialType(type); - socialUserBindMapper.insert(socialUserBind); - - // 调用 - socialUserService.unbindSocialUser(userId, userType, type, openid); - // 断言 - assertEquals(0, socialUserBindMapper.selectCount(null).intValue()); - } - - @Test - public void testUnbindSocialUser_notFound() { - // 调用,并断言 - assertServiceException( - () -> socialUserService.unbindSocialUser(randomLong(), UserTypeEnum.ADMIN.getValue(), - SocialTypeEnum.GITEE.getType(), "test_openid"), - SOCIAL_USER_NOT_FOUND); - } - - @Test - public void testGetSocialUser() { - // 准备参数 - Integer userType = UserTypeEnum.ADMIN.getValue(); - Integer type = SocialTypeEnum.GITEE.getType(); - String code = "tudou"; - String state = "yuanma"; - // mock 社交用户 - SocialUserDO socialUserDO = randomPojo(SocialUserDO.class).setType(type).setCode(code).setState(state); - socialUserMapper.insert(socialUserDO); - // mock 社交用户的绑定 - Long userId = randomLong(); - SocialUserBindDO socialUserBind = randomPojo(SocialUserBindDO.class).setUserType(userType).setUserId(userId) - .setSocialType(type).setSocialUserId(socialUserDO.getId()); - socialUserBindMapper.insert(socialUserBind); - - // 调用 - SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(userType, type, code, state); - // 断言 - assertEquals(userId, socialUser.getUserId()); - assertEquals(socialUserDO.getOpenid(), socialUser.getOpenid()); - } - - @Test - public void testAuthSocialUser_exists() { - // 准备参数 - Integer socialType = SocialTypeEnum.GITEE.getType(); - Integer userType = randomEle(SocialTypeEnum.values()).getType(); - String code = "tudou"; - String state = "yuanma"; - // mock 方法 - SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(socialType).setCode(code).setState(state); - socialUserMapper.insert(socialUser); - - // 调用 - SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state); - // 断言 - assertPojoEquals(socialUser, result); - } - - @Test - public void testAuthSocialUser_notNull() { - // mock 数据 - SocialUserDO socialUser = randomPojo(SocialUserDO.class, - o -> o.setType(SocialTypeEnum.GITEE.getType()).setCode("tudou").setState("yuanma")); - socialUserMapper.insert(socialUser); - // 准备参数 - Integer socialType = SocialTypeEnum.GITEE.getType(); - Integer userType = randomEle(SocialTypeEnum.values()).getType(); - String code = "tudou"; - String state = "yuanma"; - - // 调用 - SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state); - // 断言 - assertPojoEquals(socialUser, result); - } - - @Test - public void testAuthSocialUser_insert() { - // 准备参数 - Integer socialType = SocialTypeEnum.GITEE.getType(); - Integer userType = randomEle(SocialTypeEnum.values()).getType(); - String code = "tudou"; - String state = "yuanma"; - // mock 方法 - AuthUser authUser = randomPojo(AuthUser.class); - when(socialClientService.getAuthUser(eq(socialType), eq(userType), eq(code), eq(state))).thenReturn(authUser); - - // 调用 - SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state); - // 断言 - assertBindSocialUser(socialType, result, authUser); - assertEquals(code, result.getCode()); - assertEquals(state, result.getState()); - } - - @Test - public void testAuthSocialUser_update() { - // 准备参数 - Integer socialType = SocialTypeEnum.GITEE.getType(); - Integer userType = randomEle(SocialTypeEnum.values()).getType(); - String code = "tudou"; - String state = "yuanma"; - // mock 数据 - socialUserMapper.insert(randomPojo(SocialUserDO.class).setType(socialType).setOpenid("test_openid")); - // mock 方法 - AuthUser authUser = randomPojo(AuthUser.class); - when(socialClientService.getAuthUser(eq(socialType), eq(userType), eq(code), eq(state))).thenReturn(authUser); - - // 调用 - SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state); - // 断言 - assertBindSocialUser(socialType, result, authUser); - assertEquals(code, result.getCode()); - assertEquals(state, result.getState()); - } - - private void assertBindSocialUser(Integer type, SocialUserDO socialUser, AuthUser authUser) { - assertEquals(authUser.getToken().getAccessToken(), socialUser.getToken()); - assertEquals(toJsonString(authUser.getToken()), socialUser.getRawTokenInfo()); - assertEquals(authUser.getNickname(), socialUser.getNickname()); - assertEquals(authUser.getAvatar(), socialUser.getAvatar()); - assertEquals(toJsonString(authUser.getRawUserInfo()), socialUser.getRawUserInfo()); - assertEquals(type, socialUser.getType()); - assertEquals(authUser.getUuid(), socialUser.getOpenid()); - } - - @Test - public void testGetSocialUser_id() { - // mock 数据 - SocialUserDO socialUserDO = randomPojo(SocialUserDO.class); - socialUserMapper.insert(socialUserDO); - // 参数准备 - Long id = socialUserDO.getId(); - - // 调用 - SocialUserDO dbSocialUserDO = socialUserService.getSocialUser(id); - // 断言 - assertPojoEquals(socialUserDO, dbSocialUserDO); - } - - @Test - public void testGetSocialUserPage() { - // mock 数据 - SocialUserDO dbSocialUser = randomPojo(SocialUserDO.class, o -> { // 等会查询到 - o.setType(SocialTypeEnum.GITEE.getType()); - o.setNickname("晨丰"); - o.setOpenid("chenfengyuanma"); - o.setCreateTime(buildTime(2020, 1, 15)); - }); - socialUserMapper.insert(dbSocialUser); - // 测试 type 不匹配 - socialUserMapper.insert(cloneIgnoreId(dbSocialUser, o -> o.setType(SocialTypeEnum.DINGTALK.getType()))); - // 测试 nickname 不匹配 - socialUserMapper.insert(cloneIgnoreId(dbSocialUser, o -> o.setNickname(randomString()))); - // 测试 openid 不匹配 - socialUserMapper.insert(cloneIgnoreId(dbSocialUser, o -> o.setOpenid("java"))); - // 测试 createTime 不匹配 - socialUserMapper.insert(cloneIgnoreId(dbSocialUser, o -> o.setCreateTime(buildTime(2020, 1, 21)))); - // 准备参数 - SocialUserPageReqVO reqVO = new SocialUserPageReqVO(); - reqVO.setType(SocialTypeEnum.GITEE.getType()); - reqVO.setNickname("芋"); - reqVO.setOpenid("chenfeng"); - reqVO.setCreateTime(buildBetweenTime(2020, 1, 10, 2020, 1, 20)); - - // 调用 - PageResult pageResult = socialUserService.getSocialUserPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbSocialUser, pageResult.getList().get(0)); - } - -} diff --git a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java index b8c0f6d25..7d37ef62c 100644 --- a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java +++ b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java @@ -23,7 +23,6 @@ import com.cf.imes.module.system.dal.mysql.dept.UserPostMapper; import com.cf.imes.module.system.dal.mysql.user.AdminUserMapper; import com.cf.imes.module.system.enums.common.SexEnum; import com.cf.imes.module.system.service.dept.DeptService; -import com.cf.imes.module.system.service.dept.PostService; import com.cf.imes.module.system.service.permission.PermissionService; import com.cf.imes.module.system.service.organ.OrganService; import org.junit.jupiter.api.Test; @@ -69,8 +68,6 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { @MockBean private DeptService deptService; @MockBean - private PostService postService; - @MockBean private PermissionService permissionService; @MockBean private PasswordEncoder passwordEncoder; @@ -419,7 +416,7 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { }); // mock 方法,模拟失败 - doThrow(new ServiceException(DEPT_NOT_FOUND)).when(deptService).validateDeptList(any()); + doThrow(new ServiceException(DEPT_NOT_FOUND)).when(deptService).validDept(any()); // 调用 UserImportRespVO respVO = userService.importUserList(newArrayList(importUser), true, 1L); diff --git a/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql b/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql index 1221ed50d..1c7530163 100644 --- a/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql +++ b/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql @@ -3,7 +3,7 @@ CREATE TABLE IF NOT EXISTS "system_dept" ( "name" varchar(30) NOT NULL DEFAULT '', "parent_id" bigint NOT NULL DEFAULT '0', "sort" int NOT NULL DEFAULT '0', - "leader_user_id" bigint DEFAULT NULL, + "leader" varchar(30) DEFAULT NULL, "phone" varchar(11) DEFAULT NULL, "email" varchar(50) DEFAULT NULL, "status" tinyint NOT NULL, @@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS "system_dept" ( "updater" varchar(64) DEFAULT '', "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', + "organ_id" bigint not null default '0', PRIMARY KEY ("id") ) COMMENT '部门表'; @@ -405,7 +405,7 @@ CREATE TABLE IF NOT EXISTS "system_social_user_bind" ( PRIMARY KEY ("id") ) COMMENT '社交用户的绑定'; -CREATE TABLE IF NOT EXISTS "system_tenant" ( +CREATE TABLE IF NOT EXISTS "system_organization" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, "name" varchar(63) NOT NULL, "contact_user_id" bigint NOT NULL DEFAULT '0',