16 Komitmen 8f217b4b15 ... 39031e94ad

Pembuat SHA1 Pesan Tanggal
  rayson 39031e94ad Merge branch 'refs/heads/master' into permission 6 bulan lalu
  rayson af281db7e4 1、注释面试时间段判断 6 bulan lalu
  rayson 7399afba77 1、增加专业返回类别 6 bulan lalu
  rayson e133214e64 1、专业新增排序 6 bulan lalu
  rayson cd12a53c51 1、解决职位编辑,同步到招聘会问题 6 bulan lalu
  rayson cef564e2e8 1、解决授企业白名单职位新增职位提示没有权限 6 bulan lalu
  rayson 2b1c6d1b14 1、解决授权问题 6 bulan lalu
  rayson cc0e26a854 1、优化增加学生相关接口 6 bulan lalu
  rayson 17a732d45a 1、优化页面内容排序规则 6 bulan lalu
  rayson a15f811876 1、优化白名单企业排序 6 bulan lalu
  rayson b77a9e20bf 1、优化社交客户端模块 6 bulan lalu
  rayson 654baf817f 1、优化社交客户端模块 6 bulan lalu
  rayson bb315ae9c6 1、优化社交客户端模块 6 bulan lalu
  rayson d7c66eda39 1、优化社交客户端模块 6 bulan lalu
  rayson 54ab8e23f2 1、增加企业小程序新增交易订单接口 6 bulan lalu
  rayson d2e51e0ec7 修改注释 6 bulan lalu
69 mengubah file dengan 630 tambahan dan 166 penghapusan
  1. 1 1
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/controller/app/auth/AppAuthController.java
  2. 3 3
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/controller/app/social/AppSocialUserController.java
  3. 6 6
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/service/auth/MemberAuthServiceImpl.java
  4. 1 1
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/service/user/MemberUserServiceImpl.java
  5. 11 4
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/SocialClientApi.java
  6. 22 2
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/SocialUserApi.java
  7. 6 0
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialUserBindReqDTO.java
  8. 4 0
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialUserUnbindReqDTO.java
  9. 9 1
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialWxQrcodeReqDTO.java
  10. 4 0
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java
  11. 1 0
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/enums/ErrorCodeConstants.java
  12. 9 9
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/social/SocialClientApiImpl.java
  13. 10 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/social/SocialUserApiImpl.java
  14. 4 2
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/auth/AuthController.java
  15. 3 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java
  16. 4 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java
  17. 4 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java
  18. 4 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/dal/dataobject/social/SocialClientDO.java
  19. 12 3
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/dal/mysql/social/SocialClientMapper.java
  20. 1 1
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/auth/AdminAuthServiceImpl.java
  21. 13 5
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialClientService.java
  22. 53 42
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialClientServiceImpl.java
  23. 4 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialUserService.java
  24. 38 7
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialUserServiceImpl.java
  25. 1 1
      citu-module-system/citu-module-system-biz/src/test/java/com/citu/module/system/service/auth/AdminAuthServiceImplTest.java
  26. 15 15
      citu-module-system/citu-module-system-biz/src/test/java/com/citu/module/system/service/social/SocialClientServiceImplTest.java
  27. 6 6
      citu-module-system/citu-module-system-biz/src/test/java/com/citu/module/system/service/social/SocialUserServiceImplTest.java
  28. 6 0
      menduner/jvm_start_parameter.txt
  29. 17 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/SocialApplicationConstants.java
  30. 138 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/person/StudentController.java
  31. 6 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/AppMdeAuthController.java
  32. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/vo/AppMdeAuthSocialLoginReqVO.java
  33. 14 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/social/AppSocialUserController.java
  34. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/social/vo/AppSocialUserBindReqVO.java
  35. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/social/vo/AppSocialUserUnbindReqVO.java
  36. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/web/AppWebContentController.java
  37. 1 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/order/AppTradeOrderController.java
  38. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonResumeController.java
  39. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/student/AppStudentSaveReqVO.java
  40. 9 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/fair/AppRecruitFairController.java
  41. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/order/AppRecruitTradeOrderController.java
  42. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/major/MajorRespVO.java
  43. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/major/MajorSaveReqVO.java
  44. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/AppTradeOrderCreateReqVO.java
  45. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/AppTradeOrderGetReqVO.java
  46. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderCreateReqVO.java
  47. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderPageReqVO.java
  48. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/person/PersonQueryReqVO.java
  49. 2 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/person/student/record/StudentPracticeRecordPageReqVO.java
  50. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedDO.java
  51. 5 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/major/MajorDO.java
  52. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/person/StudentDO.java
  53. 17 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/fair/FairMapper.java
  54. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/fair/FairWhiteMapper.java
  55. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/major/MajorMapper.java
  56. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/person/PersonInfoMapper.java
  57. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthService.java
  58. 12 9
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java
  59. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairService.java
  60. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairServiceImpl.java
  61. 2 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairWhiteServiceImpl.java
  62. 4 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteServiceImpl.java
  63. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  64. 18 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  65. 2 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobEntitlementOperateHandler.java
  66. 48 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobFairOperateHandler.java
  67. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoService.java
  68. 1 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java
  69. 10 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserServiceImpl.java

+ 1 - 1
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/controller/app/auth/AppAuthController.java

@@ -128,7 +128,7 @@ public class AppAuthController {
     @PermitAll
     public CommonResult<SocialWxJsapiSignatureRespDTO> createWeixinMpJsapiSignature(@RequestParam("url") String url) {
         SocialWxJsapiSignatureRespDTO signature = socialClientApi.createWxMpJsapiSignature(
-                UserTypeEnum.MEMBER.getValue(), url).getCheckedData();
+                null,UserTypeEnum.MEMBER.getValue(), url).getCheckedData();
         return success(AuthConvert.INSTANCE.convert(signature));
     }
 

+ 3 - 3
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/controller/app/social/AppSocialUserController.java

@@ -40,7 +40,7 @@ public class AppSocialUserController {
     @PermitAll
     public CommonResult<String> socialBind(@RequestBody @Valid AppSocialUserBindReqVO reqVO) {
         SocialUserBindReqDTO reqDTO = new SocialUserBindReqDTO(getLoginUserId(), UserTypeEnum.MEMBER.getValue(),
-                reqVO.getType(), reqVO.getCode(), reqVO.getState());
+                reqVO.getType(), reqVO.getCode(), reqVO.getState(),null);
         String openid = socialUserApi.bindSocialUser(reqDTO).getCheckedData();
         return success(openid);
     }
@@ -49,7 +49,7 @@ public class AppSocialUserController {
     @Operation(summary = "取消社交绑定")
     public CommonResult<Boolean> socialUnbind(@RequestBody AppSocialUserUnbindReqVO reqVO) {
         SocialUserUnbindReqDTO reqDTO = new SocialUserUnbindReqDTO(getLoginUserId(), UserTypeEnum.MEMBER.getValue(),
-                reqVO.getType(), reqVO.getOpenid());
+                reqVO.getType(), reqVO.getOpenid(),null);
         socialUserApi.unbindSocialUser(reqDTO);
         return success(true);
     }
@@ -74,7 +74,7 @@ public class AppSocialUserController {
     @Operation(summary = "获得微信小程订阅模板列表")
     @PermitAll
     public CommonResult<List<AppSocialWxaSubscribeTemplateRespVO>> getSubscribeTemplateList() {
-        List<SocialWxaSubscribeTemplateRespDTO> template = socialClientApi.getWxaSubscribeTemplateList(UserTypeEnum.MEMBER.getValue()).getCheckedData();
+        List<SocialWxaSubscribeTemplateRespDTO> template = socialClientApi.getWxaSubscribeTemplateList(null,UserTypeEnum.MEMBER.getValue()).getCheckedData();
         return success(BeanUtils.toBean(template, AppSocialWxaSubscribeTemplateRespVO.class));
     }
 

+ 6 - 6
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/service/auth/MemberAuthServiceImpl.java

@@ -70,7 +70,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
         String openid = null;
         if (reqVO.getSocialType() != null) {
             openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())).getCheckedData();
+                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState(),null)).getCheckedData();
         }
 
         // 创建 Token 令牌,记录登录日志
@@ -92,7 +92,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
         String openid = null;
         if (reqVO.getSocialType() != null) {
             openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())).getCheckedData();
+                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState(),null)).getCheckedData();
         }
 
         // 创建 Token 令牌,记录登录日志
@@ -117,7 +117,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
         } else {
             user = userService.createUser(socialUser.getNickname(), socialUser.getAvatar(), getClientIP(), getTerminal());
             socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                    reqVO.getType(), reqVO.getCode(), reqVO.getState()));
+                    reqVO.getType(), reqVO.getCode(), reqVO.getState(),null));
         }
         if (user == null) {
             throw exception(USER_NOT_EXISTS);
@@ -130,7 +130,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
     @Override
     public AppAuthLoginRespVO weixinMiniAppLogin(AppAuthWeixinMiniAppLoginReqVO reqVO) {
         // 获得对应的手机号信息
-        SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
+        SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(null,
                 UserTypeEnum.MEMBER.getValue(), reqVO.getPhoneCode()).getCheckedData();
         Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
 
@@ -141,7 +141,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
 
         // 绑定社交用户
         String openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                SocialTypeEnum.WECHAT_MINI_APP.getType(), reqVO.getLoginCode(), reqVO.getState())).getCheckedData();
+                SocialTypeEnum.WECHAT_MINI_APP.getType(), reqVO.getLoginCode(), reqVO.getState(),null)).getCheckedData();
 
         // 创建 Token 令牌,记录登录日志
         return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, openid);
@@ -161,7 +161,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
 
     @Override
     public String getSocialAuthorizeUrl(Integer type, String redirectUri) {
-        return socialClientApi.getAuthorizeUrl(type, UserTypeEnum.MEMBER.getValue(), redirectUri).getCheckedData();
+        return socialClientApi.getAuthorizeUrl(null,type, UserTypeEnum.MEMBER.getValue(), redirectUri).getCheckedData();
     }
 
     private MemberUserDO login0(String mobile, String password) {

+ 1 - 1
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/service/user/MemberUserServiceImpl.java

@@ -188,7 +188,7 @@ public class MemberUserServiceImpl implements MemberUserService {
     public void updateUserMobileByWeixin(Long userId, AppMemberUserUpdateMobileByWeixinReqVO reqVO) {
         // 1.1 获得对应的手机号信息
         SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
-                UserTypeEnum.MEMBER.getValue(), reqVO.getCode()).getCheckedData();
+               null, UserTypeEnum.MEMBER.getValue(), reqVO.getCode()).getCheckedData();
         Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
         // 1.2 校验新手机是否已经被绑定
         validateMobileUnique(userId, phoneNumberInfo.getPhoneNumber());

+ 11 - 4
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/SocialClientApi.java

@@ -26,30 +26,36 @@ public interface SocialClientApi {
     @GetMapping(PREFIX + "/get-authorize-url")
     @Operation(summary = "获得社交平台的授权 URL")
     @Parameters({
+            @Parameter(name = "application", description = "应用标识", example = "1", required = false),
             @Parameter(name = "socialType", description = "社交平台的类型", example = "1", required = true),
             @Parameter(name = "userType", description = "用户类型", example = "1", required = true),
             @Parameter(name = "redirectUri", description = "重定向 URL", example = "https://www.iocoder.cn", required = true)
     })
-    CommonResult<String> getAuthorizeUrl(@RequestParam("socialType") Integer socialType,
+    CommonResult<String> getAuthorizeUrl(@RequestParam(value = "application", required = false) String application,
+                                         @RequestParam("socialType") Integer socialType,
                                          @RequestParam("userType") Integer userType,
                                          @RequestParam("redirectUri") String redirectUri);
 
     @GetMapping(PREFIX + "/create-wx-mp-jsapi-signature")
     @Operation(summary = "创建微信公众号 JS SDK 初始化所需的签名")
     @Parameters({
+            @Parameter(name = "application", description = "应用标识", example = "1", required = false),
             @Parameter(name = "userType", description = "用户类型", example = "1", required = true),
             @Parameter(name = "url", description = "访问 URL", example = "https://www.iocoder.cn", required = true)
     })
-    CommonResult<SocialWxJsapiSignatureRespDTO> createWxMpJsapiSignature(@RequestParam("userType") Integer userType,
+    CommonResult<SocialWxJsapiSignatureRespDTO> createWxMpJsapiSignature(@RequestParam(value = "application", required = false) String application,
+                                                                         @RequestParam("userType") Integer userType,
                                                                          @RequestParam("url") String url);
 
     @GetMapping(PREFIX + "/create-wx-ma-phone-number-info")
     @Operation(summary = "获得微信小程序的手机信息")
     @Parameters({
+            @Parameter(name = "application", description = "应用标识", example = "1", required = false),
             @Parameter(name = "userType", description = "用户类型", example = "1", required = true),
             @Parameter(name = "phoneCode", description = "手机授权码", example = "citu11", required = true)
     })
-    CommonResult<SocialWxPhoneNumberInfoRespDTO> getWxMaPhoneNumberInfo(@RequestParam("userType") Integer userType,
+    CommonResult<SocialWxPhoneNumberInfoRespDTO> getWxMaPhoneNumberInfo(@RequestParam(value = "application", required = false) String application,
+                                                                        @RequestParam("userType") Integer userType,
                                                                         @RequestParam("phoneCode") String phoneCode);
 
     @GetMapping(PREFIX + "/get-wxa-qrcode")
@@ -58,7 +64,8 @@ public interface SocialClientApi {
 
     @GetMapping(PREFIX + "/get-wxa-subscribe-template-list")
     @Operation(summary = "获得微信小程订阅模板")
-    CommonResult<List<SocialWxaSubscribeTemplateRespDTO>> getWxaSubscribeTemplateList(@RequestParam("userType") Integer userType);
+    CommonResult<List<SocialWxaSubscribeTemplateRespDTO>> getWxaSubscribeTemplateList(@RequestParam(value = "application", required = false) String application,
+                                                                                      @RequestParam("userType") Integer userType);
 
     @PostMapping(PREFIX + "/send-wxa-subscribe-message")
     @Operation(summary = "发送微信小程序订阅消息")

+ 22 - 2
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/SocialUserApi.java

@@ -1,6 +1,5 @@
 package com.citu.module.system.api.social;
 
-import com.citu.framework.common.exception.ServiceException;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.module.system.api.social.dto.SocialUserBindReqDTO;
 import com.citu.module.system.api.social.dto.SocialUserRespDTO;
@@ -41,7 +40,7 @@ public interface SocialUserApi {
                                                           @RequestParam("socialType") Integer socialType);
 
     @GetMapping(PREFIX + "/get-by-code")
-    @Operation(summary = "获得社交用") // 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
+    @Operation(summary = "获得社交用") // 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
     @Parameters({
             @Parameter(name = "userType", description = "用户类型", example = "2", required = true),
             @Parameter(name = "socialType", description = "社交平台的类型", example = "1", required = true),
@@ -53,4 +52,25 @@ public interface SocialUserApi {
                                                         @RequestParam("code") String code,
                                                         @RequestParam("state") String state);
 
+
+    @GetMapping(PREFIX + "/get-by-user-id-application")
+    @Operation(summary = "获得社交用户,基于 userId")
+    @Parameters({
+            @Parameter(name = "application", description = "用户类型", example = "2", required = true),
+            @Parameter(name = "userId", description = "用户编号", example = "1024", required = true),
+    })
+    CommonResult<SocialUserRespDTO> getSocialUserByUserIdAndApplication(@RequestParam("application") String application,
+                                                          @RequestParam("userId") Long userId);
+
+    @GetMapping(PREFIX + "/get-by-application-code")
+    @Operation(summary = "获得社交用户")
+    @Parameters({
+            @Parameter(name = "application", description = "用户类型", example = "2", required = true),
+            @Parameter(name = "code", description = "授权码", example = "88888", required = true),
+            @Parameter(name = "state", description = "state", example = "666", required = true),
+    })
+    CommonResult<SocialUserRespDTO> getSocialUserByApplicationCode(@RequestParam("application") String application,
+                                                        @RequestParam("code") String code,
+                                                        @RequestParam("state") String state);
+
 }

+ 6 - 0
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialUserBindReqDTO.java

@@ -20,6 +20,7 @@ public class SocialUserBindReqDTO {
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     @NotNull(message = "用户编号不能为空")
     private Long userId;
+
     @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @InEnum(UserTypeEnum.class)
     @NotNull(message = "用户类型不能为空")
@@ -36,4 +37,9 @@ public class SocialUserBindReqDTO {
     @NotEmpty(message = "state 不能为空")
     private String state;
 
+    // ========== 扩展 ==========
+
+    @Schema(description = "社交应用标识")
+    private String application;
+
 }

+ 4 - 0
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialUserUnbindReqDTO.java

@@ -33,4 +33,8 @@ public class SocialUserUnbindReqDTO {
     @NotEmpty(message = "社交平台的 openid 不能为空")
     private String openid;
 
+    // ========== 扩展 ==========
+
+    @Schema(description = "社交应用标识")
+    private String application;
 }

+ 9 - 1
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialWxQrcodeReqDTO.java

@@ -1,5 +1,6 @@
 package com.citu.module.system.api.social.dto;
 
+import com.citu.framework.common.enums.UserTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -30,7 +31,7 @@ public class SocialWxQrcodeReqDTO {
     public static final Boolean CHECK_PATH = true;
     /**
      * 是否需要透明底色
-     *
+     * <p>
      * hyaline 为 true 时,生成透明底色的小程序码
      */
     public static final Boolean HYALINE = true;
@@ -55,4 +56,11 @@ public class SocialWxQrcodeReqDTO {
     @Schema(description = "是否需要透明底色", example = "true")
     private Boolean hyaline;
 
+    // ========== 扩展 ==========
+    @Schema(description = "应用标识", example = "1")
+    private String application;
+
+    @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer userType = UserTypeEnum.MEMBER.getValue();
+
 }

+ 4 - 0
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java

@@ -17,6 +17,10 @@ public class SocialWxaSubscribeMessageSendReqDTO {
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     @NotNull(message = "用户编号不能为空")
     private Long userId;
+
+    @Schema(description = "应用标识", example = "1")
+    private String application;
+
     @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @InEnum(UserTypeEnum.class)
     @NotNull(message = "用户类型不能为空")

+ 1 - 0
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/enums/ErrorCodeConstants.java

@@ -133,6 +133,7 @@ public interface ErrorCodeConstants {
     ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置");
 
 
+
     // ========== 系统敏感词 1-002-019-000 =========
     ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1_002_019_000, "系统敏感词在所有标签中都不存在");
     ErrorCode SENSITIVE_WORD_EXISTS = new ErrorCode(1_002_019_001, "系统敏感词已在标签中存在");

+ 9 - 9
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/social/SocialClientApiImpl.java

@@ -40,19 +40,19 @@ public class SocialClientApiImpl implements SocialClientApi {
 
 
     @Override
-    public CommonResult<String> getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri) {
-        return success(socialClientService.getAuthorizeUrl(socialType, userType, redirectUri));
+    public CommonResult<String> getAuthorizeUrl(String application,Integer socialType, Integer userType, String redirectUri) {
+        return success(socialClientService.getAuthorizeUrl(application,socialType, userType, redirectUri));
     }
 
     @Override
-    public CommonResult<SocialWxJsapiSignatureRespDTO> createWxMpJsapiSignature(Integer userType, String url) {
-        WxJsapiSignature signature = socialClientService.createWxMpJsapiSignature(userType, url);
+    public CommonResult<SocialWxJsapiSignatureRespDTO> createWxMpJsapiSignature(String application,Integer userType, String url) {
+        WxJsapiSignature signature = socialClientService.createWxMpJsapiSignature(application,userType, url);
         return success(BeanUtils.toBean(signature, SocialWxJsapiSignatureRespDTO.class));
     }
 
     @Override
-    public CommonResult<SocialWxPhoneNumberInfoRespDTO> getWxMaPhoneNumberInfo(Integer userType, String phoneCode) {
-        WxMaPhoneNumberInfo info = socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode);
+    public CommonResult<SocialWxPhoneNumberInfoRespDTO> getWxMaPhoneNumberInfo(String application,Integer userType, String phoneCode) {
+        WxMaPhoneNumberInfo info = socialClientService.getWxMaPhoneNumberInfo(application,userType, phoneCode);
         return success(BeanUtils.toBean(info, SocialWxPhoneNumberInfoRespDTO.class));
     }
 
@@ -62,15 +62,15 @@ public class SocialClientApiImpl implements SocialClientApi {
     }
 
     @Override
-    public CommonResult<List<SocialWxaSubscribeTemplateRespDTO>> getWxaSubscribeTemplateList(Integer userType) {
-        List<TemplateInfo> list = socialClientService.getSubscribeTemplateList(userType);
+    public CommonResult<List<SocialWxaSubscribeTemplateRespDTO>> getWxaSubscribeTemplateList(String application,Integer userType) {
+        List<TemplateInfo> list = socialClientService.getSubscribeTemplateList(application,userType);
         return success(convertList(list, item -> BeanUtils.toBean(item, SocialWxaSubscribeTemplateRespDTO.class).setId(item.getPriTmplId())));
     }
 
     @Override
     public CommonResult<Boolean> sendWxaSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO) {
         // 1.1 获得订阅模版列表
-        List<TemplateInfo> templateList = socialClientService.getSubscribeTemplateList(reqDTO.getUserType());
+        List<TemplateInfo> templateList = socialClientService.getSubscribeTemplateList(reqDTO.getApplication(),reqDTO.getUserType());
         if (CollUtil.isEmpty(templateList)) {
             log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:没有找到订阅模板]", reqDTO);
             return success(false);

+ 10 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/social/SocialUserApiImpl.java

@@ -41,4 +41,14 @@ public class SocialUserApiImpl implements SocialUserApi {
         return success(socialUserService.getSocialUserByCode(userType, socialType, code, state));
     }
 
+
+    @Override
+    public CommonResult<SocialUserRespDTO> getSocialUserByUserIdAndApplication(String application, Long userId) {
+        return success(socialUserService.getSocialUserByUserIdAndApplication(application, userId));
+    }
+
+    @Override
+    public CommonResult<SocialUserRespDTO> getSocialUserByApplicationCode(String application, String code, String state) {
+        return success(socialUserService.getSocialUserByApplicationCode(application, code, state));
+    }
 }

+ 4 - 2
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/auth/AuthController.java

@@ -146,13 +146,15 @@ public class AuthController {
     @PermitAll
     @Operation(summary = "社交授权的跳转")
     @Parameters({
+            @Parameter(name = "application", description = "应用标识", example = "1", required = false),
             @Parameter(name = "type", description = "社交类型", required = true),
             @Parameter(name = "redirectUri", description = "回调路径")
     })
-    public CommonResult<String> socialLogin(@RequestParam("type") Integer type,
+    public CommonResult<String> socialLogin(@RequestParam(value = "application", required = false) String application,
+                                            @RequestParam("type") Integer type,
                                             @RequestParam("redirectUri") String redirectUri) {
         return success(socialClientService.getAuthorizeUrl(
-                type, UserTypeEnum.ADMIN.getValue(), redirectUri));
+                null, type, UserTypeEnum.ADMIN.getValue(), redirectUri));
     }
 
     @PostMapping("/social-login")

+ 3 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java

@@ -15,6 +15,9 @@ public class SocialClientPageReqVO extends PageParam {
     @Schema(description = "应用名", example = "citu商城")
     private String name;
 
+    @Schema(description = "社交应用标识")
+    private String application;
+
     @Schema(description = "社交平台的类型", example = "31")
     private Integer socialType;
 

+ 4 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java

@@ -3,6 +3,7 @@ package com.citu.module.system.controller.admin.socail.vo.client;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 
 @Schema(description = "管理后台 - 社交客户端 Response VO")
@@ -12,6 +13,9 @@ public class SocialClientRespVO {
     @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27162")
     private Long id;
 
+    @Schema(description = "应用标识")
+    private String application;
+
     @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "citu商城")
     private String name;
 

+ 4 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java

@@ -24,6 +24,10 @@ public class SocialClientSaveReqVO {
     @NotNull(message = "应用名不能为空")
     private String name;
 
+    @Schema(description = "应用标识")
+    @NotNull(message = "应用标识不能为空")
+    private String application;
+
     @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31")
     @NotNull(message = "社交平台的类型不能为空")
     @InEnum(SocialTypeEnum.class)

+ 4 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/dal/dataobject/social/SocialClientDO.java

@@ -35,6 +35,10 @@ public class SocialClientDO extends TenantBaseDO {
      * 应用名
      */
     private String name;
+    /**
+     * 社交应用标识
+     */
+    private String application;
     /**
      * 社交类型
      *

+ 12 - 3
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/dal/mysql/social/SocialClientMapper.java

@@ -10,9 +10,14 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface SocialClientMapper extends BaseMapperX<SocialClientDO> {
 
-    default SocialClientDO selectBySocialTypeAndUserType(Integer socialType, Integer userType) {
-        return selectOne(SocialClientDO::getSocialType, socialType,
-                SocialClientDO::getUserType, userType);
+    default SocialClientDO selectBySocialApplicationAndTypeAndUserType(String application, Integer socialType, Integer userType) {
+        return selectOne(new LambdaQueryWrapperX<SocialClientDO>()
+                .eqIfPresent(SocialClientDO::getApplication, application)
+                .eq(SocialClientDO::getSocialType, socialType)
+                .eq(SocialClientDO::getUserType, userType)
+                .orderByAsc(SocialClientDO::getCreateTime)
+                .last("limit 1")
+        );
     }
 
     default PageResult<SocialClientDO> selectPage(SocialClientPageReqVO reqVO) {
@@ -25,4 +30,8 @@ public interface SocialClientMapper extends BaseMapperX<SocialClientDO> {
                 .orderByDesc(SocialClientDO::getId));
     }
 
+    default SocialClientDO selectByApplication(String application) {
+        return selectOne(SocialClientDO::getApplication, application);
+    }
+
 }

+ 1 - 1
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/auth/AdminAuthServiceImpl.java

@@ -103,7 +103,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
         // 如果 socialType 非空,说明需要绑定社交用户
         if (reqVO.getSocialType() != null) {
             socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState()));
+                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState(),null));
         }
         // 创建 Token 令牌,记录登录日志
         return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);

+ 13 - 5
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialClientService.java

@@ -30,7 +30,7 @@ public interface SocialClientService {
      * @param redirectUri 重定向 URL
      * @return 社交平台的授权 URL
      */
-    String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri);
+    String getAuthorizeUrl(String application,Integer socialType, Integer userType, String redirectUri);
 
     /**
      * 请求社交平台,获得授权的用户
@@ -41,7 +41,7 @@ public interface SocialClientService {
      * @param state 授权 state
      * @return 授权的用户
      */
-    AuthUser getAuthUser(Integer socialType, Integer userType, String code, String state);
+    AuthUser getAuthUser(String application,Integer socialType, Integer userType, String code, String state);
 
     // =================== 微信公众号独有 ===================
 
@@ -52,7 +52,7 @@ public interface SocialClientService {
      * @param url 访问的 URL 地址
      * @return 签名
      */
-    WxJsapiSignature createWxMpJsapiSignature(Integer userType, String url);
+    WxJsapiSignature createWxMpJsapiSignature(String application,Integer userType, String url);
 
     // =================== 微信小程序独有 ===================
 
@@ -63,7 +63,7 @@ public interface SocialClientService {
      * @param phoneCode 手机授权码
      * @return 手机信息
      */
-    WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode);
+    WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(String application,Integer userType, String phoneCode);
 
     /**
      * 获得小程序二维码
@@ -81,7 +81,7 @@ public interface SocialClientService {
      * @param userType 用户类型
      * @return 微信小程订阅模板
      */
-    List<TemplateInfo> getSubscribeTemplateList(Integer userType);
+    List<TemplateInfo> getSubscribeTemplateList(String application,Integer userType);
 
     /**
      * 发送微信小程序订阅消息
@@ -124,6 +124,14 @@ public interface SocialClientService {
      */
     SocialClientDO getSocialClient(Long id);
 
+    /**
+     * 获得社交客户端
+     *
+     * @param application 应用编号
+     * @return 社交客户端
+     */
+    SocialClientDO getSocialClientByApplication(String application);
+
     /**
      * 获得社交客户端分页
      *

+ 53 - 42
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialClientServiceImpl.java

@@ -12,8 +12,9 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ReflectUtil;
+import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties;
+import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
 import com.citu.framework.common.enums.CommonStatusEnum;
-import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.cache.CacheUtils;
 import com.citu.framework.common.util.http.HttpUtils;
@@ -26,8 +27,6 @@ import com.citu.module.system.dal.dataobject.social.SocialClientDO;
 import com.citu.module.system.dal.mysql.social.SocialClientMapper;
 import com.citu.module.system.dal.redis.RedisKeyConstants;
 import com.citu.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.google.common.annotations.VisibleForTesting;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -59,7 +58,6 @@ import java.util.Map;
 import java.util.Objects;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache;
 import static com.citu.framework.common.util.collection.MapUtils.findAndThen;
 import static com.citu.framework.common.util.json.JsonUtils.toJsonString;
 import static com.citu.module.system.enums.ErrorCodeConstants.*;
@@ -72,10 +70,10 @@ import static com.citu.module.system.enums.ErrorCodeConstants.*;
 @Service
 @Slf4j
 public class SocialClientServiceImpl implements SocialClientService {
-    
+
     /**
      * 小程序码要打开的小程序版本
-     *
+     * <p>
      * 1. release:正式版
      * 2. trial:体验版
      * 3. develop:开发版
@@ -84,7 +82,7 @@ public class SocialClientServiceImpl implements SocialClientService {
     public String envVersion;
     /**
      * 订阅消息跳转小程序类型
-     *
+     * <p>
      * 1. developer:开发版
      * 2. trial:体验版
      * 3. formal:正式版
@@ -103,10 +101,10 @@ public class SocialClientServiceImpl implements SocialClientService {
     private StringRedisTemplate stringRedisTemplate; // WxMpService 需要使用到,所以在 Service 注入了它
     /**
      * 缓存 WxMpService 对象
-     *
+     * <p>
      * key:使用微信公众号的 appId + secret 拼接,即 {@link SocialClientDO} 的 clientId 和 clientSecret 属性。
      * 为什么 key 使用这种格式?因为 {@link SocialClientDO} 在管理后台可以变更,通过这个 key 存储它的单例。
-     *
+     * <p>
      * 为什么要做 WxMpService 缓存?因为 WxMpService 构建成本比较大,所以尽量保证它是单例。
      */
     private final LoadingCache<String, WxMpService> wxMpServiceCache = CacheUtils.buildAsyncReloadingCache(
@@ -127,7 +125,7 @@ public class SocialClientServiceImpl implements SocialClientService {
     private WxMaProperties wxMaProperties;
     /**
      * 缓存 WxMaService 对象
-     *
+     * <p>
      * 说明同 {@link #wxMpServiceCache} 变量
      */
     private final LoadingCache<String, WxMaService> wxMaServiceCache = CacheUtils.buildAsyncReloadingCache(
@@ -146,18 +144,18 @@ public class SocialClientServiceImpl implements SocialClientService {
     private SocialClientMapper socialClientMapper;
 
     @Override
-    public String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri) {
+    public String getAuthorizeUrl(String application, Integer socialType, Integer userType, String redirectUri) {
         // 获得对应的 AuthRequest 实现
-        AuthRequest authRequest = buildAuthRequest(socialType, userType);
+        AuthRequest authRequest = buildAuthRequest(application, socialType, userType);
         // 生成跳转地址
         String authorizeUri = authRequest.authorize(AuthStateUtils.createState());
         return HttpUtils.replaceUrlQuery(authorizeUri, "redirect_uri", redirectUri);
     }
 
     @Override
-    public AuthUser getAuthUser(Integer socialType, Integer userType, String code, String state) {
+    public AuthUser getAuthUser(String application, Integer socialType, Integer userType, String code, String state) {
         // 构建请求
-        AuthRequest authRequest = buildAuthRequest(socialType, userType);
+        AuthRequest authRequest = buildAuthRequest(application, socialType, userType);
         AuthCallback authCallback = AuthCallback.builder().code(code).state(state).build();
         // 执行请求
         AuthResponse<?> authResponse = authRequest.login(authCallback);
@@ -173,16 +171,16 @@ public class SocialClientServiceImpl implements SocialClientService {
      * 构建 AuthRequest 对象,支持多租户配置
      *
      * @param socialType 社交类型
-     * @param userType 用户类型
+     * @param userType   用户类型
      * @return AuthRequest 对象
      */
     @VisibleForTesting
-    AuthRequest buildAuthRequest(Integer socialType, Integer userType) {
+    AuthRequest buildAuthRequest(String application, Integer socialType, Integer userType) {
         // 1. 先查找默认的配置项,从 application-*.yaml 中读取
         AuthRequest request = authRequestFactory.get(SocialTypeEnum.valueOfType(socialType).getSource());
         Assert.notNull(request, String.format("社交平台(%d) 不存在", socialType));
         // 2. 查询 DB 的配置项,如果存在则进行覆盖
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(socialType, userType);
+        SocialClientDO client = socialClientMapper.selectBySocialApplicationAndTypeAndUserType(application, socialType, userType);
         if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
             // 2.1 构造新的 AuthConfig 对象
             AuthConfig authConfig = (AuthConfig) ReflectUtil.getFieldValue(request, "config");
@@ -204,8 +202,8 @@ public class SocialClientServiceImpl implements SocialClientService {
 
     @Override
     @SneakyThrows
-    public WxJsapiSignature createWxMpJsapiSignature(Integer userType, String url) {
-        WxMpService service = getWxMpService(userType);
+    public WxJsapiSignature createWxMpJsapiSignature(String application, Integer userType, String url) {
+        WxMpService service = getWxMpService(application, userType);
         return service.createJsapiSignature(url);
     }
 
@@ -216,9 +214,9 @@ public class SocialClientServiceImpl implements SocialClientService {
      * @return WxMpService 对象
      */
     @VisibleForTesting
-    WxMpService getWxMpService(Integer userType) {
+    WxMpService getWxMpService(String application, Integer userType) {
         // 第一步,查询 DB 的配置项,获得对应的 WxMpService 对象
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(
+        SocialClientDO client = socialClientMapper.selectBySocialApplicationAndTypeAndUserType(application,
                 SocialTypeEnum.WECHAT_MP.getType(), userType);
         if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
             return wxMpServiceCache.getUnchecked(client.getClientId() + ":" + client.getClientSecret());
@@ -230,7 +228,7 @@ public class SocialClientServiceImpl implements SocialClientService {
     /**
      * 创建 clientId + clientSecret 对应的 WxMpService 对象
      *
-     * @param clientId 微信公众号 appId
+     * @param clientId     微信公众号 appId
      * @param clientSecret 微信公众号 secret
      * @return WxMpService 对象
      */
@@ -251,8 +249,8 @@ public class SocialClientServiceImpl implements SocialClientService {
     // =================== 微信小程序独有 ===================
 
     @Override
-    public WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode) {
-        WxMaService service = getWxMaService(userType);
+    public WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(String application, Integer userType, String phoneCode) {
+        WxMaService service = getWxMaService(application, userType);
         try {
             return service.getUserService().getPhoneNoInfo(phoneCode);
         } catch (WxErrorException e) {
@@ -263,7 +261,7 @@ public class SocialClientServiceImpl implements SocialClientService {
 
     @Override
     public byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO) {
-        WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue());
+        WxMaService service = getWxMaService(reqVO.getApplication(), reqVO.getUserType());
         try {
             return service.getQrcodeService().createWxaCodeUnlimitBytes(
                     ObjUtil.defaultIfEmpty(reqVO.getScene(), SocialWxQrcodeReqDTO.SCENE),
@@ -281,10 +279,10 @@ public class SocialClientServiceImpl implements SocialClientService {
     }
 
     @Override
-    @Cacheable(cacheNames = RedisKeyConstants.WXA_SUBSCRIBE_TEMPLATE, key = "#userType",
+    @Cacheable(cacheNames = RedisKeyConstants.WXA_SUBSCRIBE_TEMPLATE, key = "#application+':'+#userType",
             unless = "#result == null")
-    public List<TemplateInfo> getSubscribeTemplateList(Integer userType) {
-        WxMaService service = getWxMaService(userType);
+    public List<TemplateInfo> getSubscribeTemplateList(String application, Integer userType) {
+        WxMaService service = getWxMaService(application, userType);
         try {
             WxMaSubscribeService subscribeService = service.getSubscribeService();
             return subscribeService.getTemplateList();
@@ -296,7 +294,7 @@ public class SocialClientServiceImpl implements SocialClientService {
 
     @Override
     public void sendSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO, String templateId, String openId) {
-        WxMaService service = getWxMaService(reqDTO.getUserType());
+        WxMaService service = getWxMaService(reqDTO.getApplication(), reqDTO.getUserType());
         try {
             WxMaSubscribeService subscribeService = service.getSubscribeService();
             subscribeService.sendSubscribeMsg(buildMessageSendReqDTO(reqDTO, templateId, openId));
@@ -335,9 +333,9 @@ public class SocialClientServiceImpl implements SocialClientService {
      * @return WxMpService 对象
      */
     @VisibleForTesting
-    WxMaService getWxMaService(Integer userType) {
+    WxMaService getWxMaService(String application, Integer userType) {
         // 第一步,查询 DB 的配置项,获得对应的 WxMaService 对象
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(
+        SocialClientDO client = socialClientMapper.selectBySocialApplicationAndTypeAndUserType(application,
                 SocialTypeEnum.WECHAT_MINI_APP.getType(), userType);
         if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
             return wxMaServiceCache.getUnchecked(client.getClientId() + ":" + client.getClientSecret());
@@ -349,7 +347,7 @@ public class SocialClientServiceImpl implements SocialClientService {
     /**
      * 创建 clientId + clientSecret 对应的 WxMaService 对象
      *
-     * @param clientId 微信小程序 appId
+     * @param clientId     微信小程序 appId
      * @param clientSecret 微信小程序 secret
      * @return WxMaService 对象
      */
@@ -372,7 +370,7 @@ public class SocialClientServiceImpl implements SocialClientService {
     @Override
     public Long createSocialClient(SocialClientSaveReqVO createReqVO) {
         // 校验重复
-        validateSocialClientUnique(null, createReqVO.getUserType(), createReqVO.getSocialType());
+        validateSocialClientUnique(null, createReqVO.getApplication(), createReqVO.getUserType(), createReqVO.getSocialType());
 
         // 插入
         SocialClientDO client = BeanUtils.toBean(createReqVO, SocialClientDO.class);
@@ -385,7 +383,7 @@ public class SocialClientServiceImpl implements SocialClientService {
         // 校验存在
         validateSocialClientExists(updateReqVO.getId());
         // 校验重复
-        validateSocialClientUnique(updateReqVO.getId(), updateReqVO.getUserType(), updateReqVO.getSocialType());
+        validateSocialClientUnique(updateReqVO.getId(), updateReqVO.getApplication(), updateReqVO.getUserType(), updateReqVO.getSocialType());
 
         // 更新
         SocialClientDO updateObj = BeanUtils.toBean(updateReqVO, SocialClientDO.class);
@@ -407,17 +405,24 @@ public class SocialClientServiceImpl implements SocialClientService {
     }
 
     /**
-     * 校验社交应用是否重复,需要保证 userType + socialType 唯一
+     * 校验社交应用是否重复,需要保证 application + userType + socialType 唯一
+     * <p>
+     * 原因是,不同端(userType)选择某个社交登录(socialType)时,需要通过 {@link #buildAuthRequest(String, Integer, Integer)} 构建对应的请求
      *
-     * 原因是,不同端(userType)选择某个社交登录(socialType)时,需要通过 {@link #buildAuthRequest(Integer, Integer)} 构建对应的请求
-     *
-     * @param id 编号
-     * @param userType 用户类型
+     * @param id         编号
+     * @param userType   用户类型
      * @param socialType 社交类型
      */
-    private void validateSocialClientUnique(Long id, Integer userType, Integer socialType) {
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(
-                socialType, userType);
+    private void validateSocialClientUnique(Long id, String application, Integer userType, Integer socialType) {
+        SocialClientDO exist = socialClientMapper.selectByApplication(application);
+        if (null == id && null != exist) {
+            // 重复的application
+            throw exception(SOCIAL_CLIENT_UNIQUE);
+        }
+        if (null != exist && ObjUtil.notEqual(id, exist.getId())) {
+            throw exception(SOCIAL_CLIENT_UNIQUE);
+        }
+        SocialClientDO client = socialClientMapper.selectBySocialApplicationAndTypeAndUserType(application, socialType, userType);
         if (client == null) {
             return;
         }
@@ -425,6 +430,7 @@ public class SocialClientServiceImpl implements SocialClientService {
                 || ObjUtil.notEqual(id, client.getId())) { // 更新时,如果 id 不一致,说明重复
             throw exception(SOCIAL_CLIENT_UNIQUE);
         }
+
     }
 
     @Override
@@ -432,6 +438,11 @@ public class SocialClientServiceImpl implements SocialClientService {
         return socialClientMapper.selectById(id);
     }
 
+    @Override
+    public SocialClientDO getSocialClientByApplication(String application) {
+        return socialClientMapper.selectByApplication(application);
+    }
+
     @Override
     public PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageReqVO) {
         return socialClientMapper.selectPage(pageReqVO);

+ 4 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialUserService.java

@@ -68,6 +68,10 @@ public interface SocialUserService {
      */
     SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state);
 
+    SocialUserRespDTO getSocialUserByApplicationCode(String application, String code, String state);
+
+    SocialUserRespDTO getSocialUserByUserIdAndApplication(String application, Long userId);
+
     // ==================== 社交用户 CRUD ====================
 
     /**

+ 38 - 7
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialUserServiceImpl.java

@@ -7,6 +7,7 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.system.api.social.dto.SocialUserBindReqDTO;
 import com.citu.module.system.api.social.dto.SocialUserRespDTO;
 import com.citu.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
+import com.citu.module.system.dal.dataobject.social.SocialClientDO;
 import com.citu.module.system.dal.dataobject.social.SocialUserBindDO;
 import com.citu.module.system.dal.dataobject.social.SocialUserDO;
 import com.citu.module.system.dal.mysql.social.SocialUserBindMapper;
@@ -61,7 +62,7 @@ public class SocialUserServiceImpl implements SocialUserService {
     @Transactional(rollbackFor = Exception.class)
     public String bindSocialUser(SocialUserBindReqDTO reqDTO) {
         // 获得社交用户
-        SocialUserDO socialUser = authSocialUser(reqDTO.getSocialType(), reqDTO.getUserType(),
+        SocialUserDO socialUser = authSocialUser(reqDTO.getApplication(),reqDTO.getSocialType(), reqDTO.getUserType(),
                 reqDTO.getCode(), reqDTO.getState());
         Assert.notNull(socialUser, "社交用户不能为空");
 
@@ -109,7 +110,7 @@ public class SocialUserServiceImpl implements SocialUserService {
     @Override
     public SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state) {
         // 获得社交用户
-        SocialUserDO socialUser = authSocialUser(socialType, userType, code, state);
+        SocialUserDO socialUser = authSocialUser(null,socialType, userType, code, state);
         Assert.notNull(socialUser, "社交用户不能为空");
 
         // 获得绑定用户
@@ -119,18 +120,48 @@ public class SocialUserServiceImpl implements SocialUserService {
                 socialUserBind != null ? socialUserBind.getUserId() : null);
     }
 
+    @Override
+    public SocialUserRespDTO getSocialUserByApplicationCode(String application, String code, String state) {
+        SocialClientDO socialClient = socialClientService.getSocialClientByApplication(application);
+        // 获得社交用户
+        SocialUserDO socialUser = authSocialUser(application,socialClient.getSocialType(), socialClient.getUserType(), code, state);
+        Assert.notNull(socialUser, "社交用户不能为空");
+        // 获得绑定用户
+        SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(socialClient.getUserType(),
+                socialUser.getId());
+        return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(),
+                socialUserBind != null ? socialUserBind.getUserId() : null);
+    }
+
+
+    @Override
+    public SocialUserRespDTO getSocialUserByUserIdAndApplication(String application, Long userId) {
+        SocialClientDO socialClient = socialClientService.getSocialClientByApplication(application);
+        // 获得绑定用户
+        SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserIdAndUserTypeAndSocialType(userId,
+                socialClient.getUserType(), socialClient.getSocialType());
+        if (socialUserBind == null) {
+            return null;
+        }
+        // 获得社交用户
+        SocialUserDO socialUser = socialUserMapper.selectById(socialUserBind.getSocialUserId());
+        Assert.notNull(socialUser, "社交用户不能为空");
+        return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(),
+                socialUserBind.getUserId());
+    }
+
     /**
      * 授权获得对应的社交用户
      * 如果授权失败,则会抛出 {@link ServiceException} 异常
      *
      * @param socialType 社交平台的类型 {@link SocialTypeEnum}
-     * @param userType 用户类型
-     * @param code     授权码
-     * @param state    state
+     * @param userType   用户类型
+     * @param code       授权码
+     * @param state      state
      * @return 授权用户
      */
     @NotNull
-    public SocialUserDO authSocialUser(Integer socialType, Integer userType, String code, String state) {
+    public SocialUserDO authSocialUser(String application,Integer socialType, Integer userType, String code, String state) {
         // 优先从 DB 中获取,因为 code 有且可以使用一次。
         // 在社交登录时,当未绑定 User 时,需要绑定登录,此时需要 code 使用两次
         SocialUserDO socialUser = socialUserMapper.selectByTypeAndCodeAnState(socialType, code, state);
@@ -139,7 +170,7 @@ public class SocialUserServiceImpl implements SocialUserService {
         }
 
         // 请求获取
-        AuthUser authUser = socialClientService.getAuthUser(socialType, userType, code, state);
+        AuthUser authUser = socialClientService.getAuthUser(application, socialType, userType, code, state);
         Assert.notNull(authUser, "三方用户不能为空");
 
         // 保存到 DB 中

+ 1 - 1
citu-module-system/citu-module-system-biz/src/test/java/com/citu/module/system/service/auth/AdminAuthServiceImplTest.java

@@ -183,7 +183,7 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest {
         );
         verify(socialUserService).bindSocialUser(eq(new SocialUserBindReqDTO(
                 user.getId(), UserTypeEnum.ADMIN.getValue(),
-                reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())));
+                reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState(),null)));
     }
 
     @Test

+ 15 - 15
citu-module-system/citu-module-system-biz/src/test/java/com/citu/module/system/service/social/SocialClientServiceImplTest.java

@@ -85,7 +85,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
             when(authRequest.authorize(eq("aoteman"))).thenReturn("https://www.iocoder.cn?redirect_uri=yyy");
 
             // 调用
-            String url = socialClientService.getAuthorizeUrl(socialType, userType, redirectUri);
+            String url = socialClientService.getAuthorizeUrl(null,socialType, userType, redirectUri);
             // 断言
             assertEquals("https://www.iocoder.cn?redirect_uri=sss", url);
         }
@@ -111,7 +111,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         }))).thenReturn(authResponse);
 
         // 调用
-        AuthUser result = socialClientService.getAuthUser(socialType, userType, code, state);
+        AuthUser result = socialClientService.getAuthUser(null,socialType, userType, code, state);
         // 断言
         assertSame(authUser, result);
     }
@@ -136,7 +136,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
 
         // 调用并断言
         assertServiceException(
-                () -> socialClientService.getAuthUser(socialType, userType, code, state),
+                () -> socialClientService.getAuthUser(null,socialType, userType, code, state),
                 SOCIAL_USER_AUTH_FAILURE, "模拟失败");
     }
 
@@ -151,7 +151,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest);
 
         // 调用
-        AuthRequest result = socialClientService.buildAuthRequest(socialType, userType);
+        AuthRequest result = socialClientService.buildAuthRequest(null,socialType, userType);
         // 断言
         assertSame(authRequest, result);
         assertSame(authConfig, ReflectUtil.getFieldValue(authConfig, "config"));
@@ -172,7 +172,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         socialClientMapper.insert(client);
 
         // 调用
-        AuthRequest result = socialClientService.buildAuthRequest(socialType, userType);
+        AuthRequest result = socialClientService.buildAuthRequest(null,socialType, userType);
         // 断言
         assertSame(authRequest, result);
         assertSame(authConfig, ReflectUtil.getFieldValue(authConfig, "config"));
@@ -194,7 +194,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         socialClientMapper.insert(client);
 
         // 调用
-        AuthRequest result = socialClientService.buildAuthRequest(socialType, userType);
+        AuthRequest result = socialClientService.buildAuthRequest(null,socialType, userType);
         // 断言
         assertSame(authRequest, result);
         assertNotSame(authConfig, ReflectUtil.getFieldValue(authRequest, "config"));
@@ -212,7 +212,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         when(wxMpService.createJsapiSignature(eq(url))).thenReturn(signature);
 
         // 调用
-        WxJsapiSignature result = socialClientService.createWxMpJsapiSignature(userType, url);
+        WxJsapiSignature result = socialClientService.createWxMpJsapiSignature(null,userType, url);
         // 断言
         assertSame(signature, result);
     }
@@ -224,7 +224,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         // mock 方法
 
         // 调用
-        WxMpService result = socialClientService.getWxMpService(userType);
+        WxMpService result = socialClientService.getWxMpService(null,userType);
         // 断言
         assertSame(wxMpService, result);
     }
@@ -239,7 +239,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         socialClientMapper.insert(client);
 
         // 调用
-        WxMpService result = socialClientService.getWxMpService(userType);
+        WxMpService result = socialClientService.getWxMpService(null,userType);
         // 断言
         assertSame(wxMpService, result);
     }
@@ -257,7 +257,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         when(wxMpProperties.getConfigStorage()).thenReturn(configStorage);
 
         // 调用
-        WxMpService result = socialClientService.getWxMpService(userType);
+        WxMpService result = socialClientService.getWxMpService(null,userType);
         // 断言
         assertNotSame(wxMpService, result);
         assertEquals(client.getClientId(), result.getWxMpConfigStorage().getAppId());
@@ -278,7 +278,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         when(userService.getPhoneNoInfo(eq(phoneCode))).thenReturn(phoneNumber);
 
         // 调用
-        WxMaPhoneNumberInfo result = socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode);
+        WxMaPhoneNumberInfo result = socialClientService.getWxMaPhoneNumberInfo(null,userType, phoneCode);
         // 断言
         assertSame(phoneNumber, result);
     }
@@ -295,7 +295,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         when(userService.getPhoneNoInfo(eq(phoneCode))).thenThrow(wxErrorException);
 
         // 调用并断言异常
-        assertServiceException(() -> socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode),
+        assertServiceException(() -> socialClientService.getWxMaPhoneNumberInfo(null,userType, phoneCode),
                 SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR);
     }
 
@@ -306,7 +306,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         // mock 方法
 
         // 调用
-        WxMaService result = socialClientService.getWxMaService(userType);
+        WxMaService result = socialClientService.getWxMaService(null,userType);
         // 断言
         assertSame(wxMaService, result);
     }
@@ -321,7 +321,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         socialClientMapper.insert(client);
 
         // 调用
-        WxMaService result = socialClientService.getWxMaService(userType);
+        WxMaService result = socialClientService.getWxMaService(null,userType);
         // 断言
         assertSame(wxMaService, result);
     }
@@ -339,7 +339,7 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
         when(wxMaProperties.getConfigStorage()).thenReturn(configStorage);
 
         // 调用
-        WxMaService result = socialClientService.getWxMaService(userType);
+        WxMaService result = socialClientService.getWxMaService(null,userType);
         // 断言
         assertNotSame(wxMaService, result);
         assertEquals(client.getClientId(), result.getWxMaConfig().getAppid());

+ 6 - 6
citu-module-system/citu-module-system-biz/src/test/java/com/citu/module/system/service/social/SocialUserServiceImplTest.java

@@ -165,7 +165,7 @@ public class SocialUserServiceImplTest extends BaseDbUnitTest {
         socialUserMapper.insert(socialUser);
 
         // 调用
-        SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state);
+        SocialUserDO result = socialUserService.authSocialUser(null,socialType, userType, code, state);
         // 断言
         assertPojoEquals(socialUser, result);
     }
@@ -183,7 +183,7 @@ public class SocialUserServiceImplTest extends BaseDbUnitTest {
         String state = "yuanma";
 
         // 调用
-        SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state);
+        SocialUserDO result = socialUserService.authSocialUser(null,socialType, userType, code, state);
         // 断言
         assertPojoEquals(socialUser, result);
     }
@@ -197,10 +197,10 @@ public class SocialUserServiceImplTest extends BaseDbUnitTest {
         String state = "yuanma";
         // mock 方法
         AuthUser authUser = randomPojo(AuthUser.class);
-        when(socialClientService.getAuthUser(eq(socialType), eq(userType), eq(code), eq(state))).thenReturn(authUser);
+        when(socialClientService.getAuthUser(null,eq(socialType), eq(userType), eq(code), eq(state))).thenReturn(authUser);
 
         // 调用
-        SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state);
+        SocialUserDO result = socialUserService.authSocialUser(null,socialType, userType, code, state);
         // 断言
         assertBindSocialUser(socialType, result, authUser);
         assertEquals(code, result.getCode());
@@ -218,10 +218,10 @@ public class SocialUserServiceImplTest extends BaseDbUnitTest {
         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);
+        when(socialClientService.getAuthUser(null,eq(socialType), eq(userType), eq(code), eq(state))).thenReturn(authUser);
 
         // 调用
-        SocialUserDO result = socialUserService.authSocialUser(socialType, userType, code, state);
+        SocialUserDO result = socialUserService.authSocialUser(null,socialType, userType, code, state);
         // 断言
         assertBindSocialUser(socialType, result, authUser);
         assertEquals(code, result.getCode());

+ 6 - 0
menduner/jvm_start_parameter.txt

@@ -0,0 +1,6 @@
+-DnacosHost=192.168.3.80:8848
+-Dspring.cloud.nacos.discovery.namespace=dev
+-Dspring.cloud.nacos.config.namespace=dev
+-Dfile.encoding=utf-8
+-Dspring.cloud.nacos.discovery.ip=192.168.3.120
+-Dspring.mvc.locale=zh_CN

+ 17 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/SocialApplicationConstants.java

@@ -0,0 +1,17 @@
+package com.citu.module.menduner.system.enums;
+
+/**
+ * 社交应用常量
+ **/
+public class SocialApplicationConstants {
+
+    /**
+     * 求职端小程序应用标识
+     **/
+    public final static String SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION ="jobhunt_application";
+
+    /**
+     * 招聘端端小程序应用标识
+     **/
+    public final static String SOCIAL_WX_PROGRAM_RECRUIT_APPLICATION ="recruit_application";
+}

+ 138 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/person/StudentController.java

@@ -0,0 +1,138 @@
+package com.citu.module.menduner.system.controller.admin.person;
+
+import cn.hutool.core.collection.CollUtil;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.idempotent.core.annotation.Idempotent;
+import com.citu.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.app.jobhunt.person.student.AppStudentSaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseBaseSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.major.MajorRespVO;
+import com.citu.module.menduner.system.controller.base.person.student.StudentRespVO;
+import com.citu.module.menduner.system.controller.base.person.student.evaluate.StudentPracticeEvaluateSaveReqVO;
+import com.citu.module.menduner.system.controller.base.person.student.record.StudentPracticeRecordDetailRespVO;
+import com.citu.module.menduner.system.controller.base.person.student.record.StudentPracticeRecordPageReqVO;
+import com.citu.module.menduner.system.controller.base.person.student.report.StudentPracticeReportRespVO;
+import com.citu.module.menduner.system.controller.base.person.student.report.StudentPracticeReportSaveReqVO;
+import com.citu.module.menduner.system.controller.base.school.SchoolOrganizationRespVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
+import com.citu.module.menduner.system.dal.dataobject.person.StudentDO;
+import com.citu.module.menduner.system.dal.dataobject.school.SchoolOrganizationDO;
+import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
+import com.citu.module.menduner.system.service.major.MajorService;
+import com.citu.module.menduner.system.service.person.info.PersonInfoService;
+import com.citu.module.menduner.system.service.person.student.StudentPracticeEvaluateService;
+import com.citu.module.menduner.system.service.person.student.StudentPracticeRecordService;
+import com.citu.module.menduner.system.service.person.student.StudentPracticeReportService;
+import com.citu.module.menduner.system.service.person.student.StudentService;
+import com.citu.module.menduner.system.service.school.SchoolInfoService;
+import com.citu.module.menduner.system.service.school.SchoolOrganizationService;
+import io.swagger.v3.oas.annotations.Operation;
+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 javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.framework.common.pojo.CommonResult.success;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_COMMON_USER_ID_NOT_NULL;
+
+@Tag(name = "管理后台 - 学生信息")
+@RestController
+@RequestMapping("/menduner/system/student")
+@Validated
+public class StudentController {
+
+    @Resource
+    private StudentPracticeRecordService studentPracticeRecordService;
+    @Resource
+    private StudentPracticeEvaluateService evaluateService;
+    @Resource
+    private StudentPracticeReportService reportService;
+    @Resource
+    private EnterpriseService enterpriseService;
+    @Resource
+    private StudentService studentService;
+    @Resource
+    private PersonInfoService personInfoService;
+
+    @Resource
+    private SchoolInfoService schoolInfoService;
+    @Resource
+    private SchoolOrganizationService schoolOrganizationService;
+    @Resource
+    private MajorService majorService;
+
+
+    @PostMapping("/save")
+    @Operation(summary = "保存学生基本信息")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-info:update')")
+    public CommonResult<Boolean> saveStudentInfo(@Valid @RequestBody AppStudentSaveReqVO reqVO) {
+        if(null == reqVO.getUserId()) {
+            throw exception(MDE_COMMON_USER_ID_NOT_NULL);
+        }
+        personInfoService.saveStudentInfo(reqVO.getUserId(),reqVO);
+        return success(true);
+    }
+
+    @PostMapping("/get")
+    @Operation(summary = "获取学生基本信息")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-info:query')")
+    public CommonResult<StudentRespVO> get(@RequestParam("userId") Long userId) {
+        StudentDO student =
+                studentService.getStudentInfo(userId);
+        StudentRespVO resp = BeanUtils.toBean(student, StudentRespVO.class);
+        if (null != resp) {
+            resp.setSchoolInfo(schoolInfoService.getBySchoolId(resp.getSchoolId()));
+            SchoolOrganizationDO dept = schoolOrganizationService.getSchoolOrganization(resp.getSchoolDeptId());
+            resp.setSchoolDept(BeanUtils.toBean(dept, SchoolOrganizationRespVO.class));
+            SchoolOrganizationDO schoolClass = schoolOrganizationService.getSchoolOrganization(resp.getSchoolClassId());
+            resp.setSchoolClass(BeanUtils.toBean(schoolClass, SchoolOrganizationRespVO.class));
+            resp.setMajor(BeanUtils.toBean(majorService.getMajor(resp.getMajorId()), MajorRespVO.class));
+
+        }
+        return success(resp);
+    }
+
+
+    @GetMapping("/record/page")
+    @Operation(summary = "获得学生实习记录分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-info:query')")
+    public CommonResult<PageResult<StudentPracticeRecordDetailRespVO>> page
+            (StudentPracticeRecordPageReqVO reqVO) {
+        return success(studentPracticeRecordService.page(reqVO.getUserId(), reqVO));
+    }
+
+
+    @GetMapping("/get/report/list")
+    @Operation(summary = "获取学生实习报告列表")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-info:query')")
+    public CommonResult<Map<String, List<StudentPracticeReportRespVO>>> getReportList
+            (@RequestParam(value = "userId") Long userId) {
+        return success(reportService.getReportList(null,userId));
+    }
+
+
+    @GetMapping("/record-enterprise/list")
+    @Operation(summary = "获取学生实习的企业列表")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-info:query')")
+    public CommonResult<List<EnterpriseBaseSimpleRespVO>> getRecordEnterpriseId(@RequestParam(value = "userId") Long userId) {
+        List<Long> enterpriseIds = studentPracticeRecordService.getRecordEnterpriseId(userId);
+        if (CollUtil.isNotEmpty(enterpriseIds)) {
+            List<EnterpriseDO> enterpriseList = enterpriseService.getByIdList(enterpriseIds);
+            return success(BeanUtils.toBean(enterpriseList, EnterpriseBaseSimpleRespVO.class));
+        }
+        return success(null);
+    }
+
+
+
+}

+ 6 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/AppMdeAuthController.java

@@ -31,6 +31,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
+import static com.citu.module.menduner.system.enums.SocialApplicationConstants.SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION;
 
 @Tag(name = "公共 - 用户登录")
 @RestController
@@ -117,12 +118,14 @@ public class AppMdeAuthController {
     @GetMapping("/social-auth-redirect")
     @Operation(summary = "社交授权的跳转")
     @Parameters({
+            @Parameter(name = "application", description = "应用标识", example = "1", required = false),
             @Parameter(name = "type", description = "社交类型", required = true),
             @Parameter(name = "redirectUri", description = "回调路径")
     })
-    public CommonResult<String> socialAuthRedirect(@RequestParam("type") String type,
+    public CommonResult<String> socialAuthRedirect(@RequestParam(value = "application", required = false) String application,
+                                                   @RequestParam("type") String type,
                                                    @RequestParam("redirectUri") String redirectUri) {
-        return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri));
+        return CommonResult.success(authService.getSocialAuthorizeUrl(null == application ? SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION : application,type, redirectUri));
     }
 
     @PostMapping("/social-login")
@@ -142,7 +145,7 @@ public class AppMdeAuthController {
             description = "参考 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 文档")
     public CommonResult<SocialWxJsapiSignatureRespDTO> createWeixinMpJsapiSignature(@RequestParam("url") String url) {
         SocialWxJsapiSignatureRespDTO signature = socialClientApi.createWxMpJsapiSignature(
-                UserTypeEnum.MEMBER.getValue(), url).getCheckedData();
+                SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION,UserTypeEnum.MEMBER.getValue(), url).getCheckedData();
         return success(MdeAuthConvert.INSTANCE.convert(signature));
     }
 

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/vo/AppMdeAuthSocialLoginReqVO.java

@@ -18,6 +18,9 @@ import javax.validation.constraints.NotNull;
 @Builder
 public class AppMdeAuthSocialLoginReqVO {
 
+    @Schema(description = "应用标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "jobhunt_application")
+    private String application;
+
     @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
     @InEnum(SocialTypeEnum.class)
     @NotNull(message = "{1_100_017_014}")

+ 14 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/social/AppSocialUserController.java

@@ -25,6 +25,7 @@ import javax.validation.Valid;
 import java.util.List;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
+import static com.citu.module.menduner.system.enums.SocialApplicationConstants.SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION;
 
 @Tag(name = "公共 - 社交用户")
 @RestController
@@ -46,7 +47,8 @@ public class AppSocialUserController {
                 UserTypeEnum.MEMBER.getValue(),
                 reqVO.getType(),
                 reqVO.getCode(),
-                reqVO.getState()
+                reqVO.getState(),
+                null == reqVO.getApplication() ? SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION : reqVO.getApplication()
         );
         String openid = socialUserApi.bindSocialUser(reqDTO).getCheckedData();
         return success(openid);
@@ -60,7 +62,8 @@ public class AppSocialUserController {
                 LoginUserContext.getUserId(),
                 UserTypeEnum.MEMBER.getValue(),
                 reqVO.getType(),
-                reqVO.getOpenid()
+                reqVO.getOpenid(),
+                null == reqVO.getApplication() ? SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION : reqVO.getApplication()
         );
         socialUserApi.unbindSocialUser(reqDTO).getCheckedData();
         return success(true);
@@ -70,11 +73,11 @@ public class AppSocialUserController {
     @Operation(summary = "获得社交用户")
     @Parameter(name = "type", description = "社交平台的类型,参见 SocialTypeEnum 枚举值", required = true, example = "10")
     @PreAuthenticated
-    public CommonResult<AppSocialUserRespVO> getSocialUser(@RequestParam("type") Integer type) {
-        SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserId(
-                UserTypeEnum.MEMBER.getValue(),
-                LoginUserContext.getUserId(),
-                type
+    public CommonResult<AppSocialUserRespVO> getSocialUser(@RequestParam("type") Integer type,
+                                                           @RequestParam(value = "application", required = false) String application) {
+        SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserIdAndApplication(
+                null == application ? SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION : application,
+                LoginUserContext.getUserId()
         ).getCheckedData();
         return success(BeanUtils.toBean(socialUser, AppSocialUserRespVO.class));
     }
@@ -82,14 +85,17 @@ public class AppSocialUserController {
     @PostMapping("/wxa-qrcode")
     @Operation(summary = "获得微信小程序码(base64 image)")
     public CommonResult<String> getWxaQrcode(@RequestBody @Valid SocialWxQrcodeReqDTO reqVO) {
+        reqVO.setApplication(null == reqVO.getApplication() ? SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION : reqVO.getApplication());
         byte[] wxQrcode = socialClientApi.getWxaQrcode(reqVO).getCheckedData();
         return success(Base64.encode(wxQrcode));
     }
 
     @GetMapping("/get-subscribe-template-list")
     @Operation(summary = "获得微信小程订阅模板列表")
-    public CommonResult<List<AppSocialWxaSubscribeTemplateRespVO>> getSubscribeTemplateList() {
+    public CommonResult<List<AppSocialWxaSubscribeTemplateRespVO>> getSubscribeTemplateList(
+            @RequestParam(value = "application", required = false) String application) {
         List<SocialWxaSubscribeTemplateRespDTO> template = socialClientApi.getWxaSubscribeTemplateList(
+                null == application ? SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION : application,
                 UserTypeEnum.MEMBER.getValue()
         ).getCheckedData();
         return success(BeanUtils.toBean(template, AppSocialWxaSubscribeTemplateRespVO.class));

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/social/vo/AppSocialUserBindReqVO.java

@@ -12,6 +12,9 @@ import javax.validation.constraints.NotNull;
 @Data
 public class AppSocialUserBindReqVO {
 
+    @Schema(description = "社交应用标识")
+    private String application;
+
     @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
     @InEnum(SocialTypeEnum.class)
     @NotNull(message = "社交平台的类型不能为空")

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/social/vo/AppSocialUserUnbindReqVO.java

@@ -21,4 +21,10 @@ public class AppSocialUserUnbindReqVO {
     @NotEmpty(message = "社交用户的 openid 不能为空")
     private String openid;
 
+
+    // ========== 扩展 ==========
+
+    @Schema(description = "社交应用标识")
+    private String application;
+
 }

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/web/AppWebContentController.java

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -62,6 +63,8 @@ public class AppWebContentController {
                 .map(list -> list.stream()
                         .filter(contentStyle -> null == contentStyle.getStatus() ||
                                 MendunerStatusEnum.ENABLE.getStatus().equals(contentStyle.getStatus()))
+                        // 小的在前面,大的在后面,null在后面
+                        .sorted(Comparator.comparing(ContentStyle::getSort, Comparator.nullsLast(Integer::compareTo)))
                         .collect(Collectors.toList()))
                 .orElse(Collections.emptyList());
     }

+ 1 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/order/AppTradeOrderController.java

@@ -27,8 +27,7 @@ import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exce
 import static com.citu.framework.common.pojo.CommonResult.success;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.ENTERPRISE_PACKAGE_NOT_EXISTS;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_REQUEST_ILLEGAL;
-import static com.citu.module.menduner.system.enums.TradeOrderTypeMq.PAY_APP_USER_KEY;
-import static com.citu.module.menduner.system.enums.TradeOrderTypeMq.PAY_APP_USER_WX_PROGRAM_KEY;
+import static com.citu.module.menduner.system.enums.TradeOrderTypeMq.*;
 
 @Tag(name = "求职端 - 交易订单")
 @RestController

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonResumeController.java

@@ -149,7 +149,7 @@ public class AppPersonResumeController {
     @Operation(summary = "保存学生基本信息")
     @Idempotent(keyResolver = UserIdempotentKeyResolver.class)
     public CommonResult<Boolean> saveStudentInfo(@Valid @RequestBody AppStudentSaveReqVO reqVO) {
-        personInfoService.saveStudentInfo(reqVO);
+        personInfoService.saveStudentInfo(LoginUserContext.getUserId(),reqVO);
         return success(true);
     }
 

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/student/AppStudentSaveReqVO.java

@@ -11,6 +11,9 @@ import java.time.LocalDateTime;
 @Schema(description = "menduner - 求职端学生保存 Response VO")
 public class AppStudentSaveReqVO extends StudentSaveReqVO {
 
+    @Schema(description = "用户id")
+    private Long userId;
+
     @Schema(description = "真实姓名", example = "王五")
     private String name;
 

+ 9 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/fair/AppRecruitFairController.java

@@ -67,6 +67,15 @@ public class AppRecruitFairController {
         return success(BeanUtils.toBean(fairService.list(), JobFairRespVO.class));
     }
 
+    @PreAuthenticated
+    @GetMapping("/list-by-enterprise")
+    @Operation(summary = "获得招聘会列表")
+    public CommonResult<List<JobFairRespVO>> listByEnterpriseId() {
+        return success(BeanUtils.toBean(fairService.listByEnterpriseId(LoginUserContext.getEnterpriseId()),
+                JobFairRespVO.class));
+    }
+
+
     @PreAuthenticated
     @GetMapping("/get")
     @Operation(summary = "根据id查询招聘会")
@@ -151,7 +160,6 @@ public class AppRecruitFairController {
         }
         reqVO.setStatus(MendunerStatusEnum.ENABLE.getStatus());
         return success(jobIntegrationService.page(reqVO));
-
     }
 
 }

+ 1 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/order/AppRecruitTradeOrderController.java

@@ -75,6 +75,7 @@ public class AppRecruitTradeOrderController {
         return success(tradeOrderService.createOrder(dto, PAY_APP_ENTERPRISE_KEY));
     }
 
+
     @GetMapping("/get/unpaid")
     @Operation(summary = "获取待支付的订单")
     @PreAuthenticated

+ 7 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/major/MajorRespVO.java

@@ -19,6 +19,10 @@ public class MajorRespVO {
     @ExcelProperty("id")
     private Long id;
 
+    @Schema(description = "类别")
+    @ExcelProperty("类别")
+    private String categorize;
+
     @Schema(description = "专业名称")
     @ExcelProperty("专业名称")
     private String nameCn;
@@ -32,6 +36,9 @@ public class MajorRespVO {
     @DictFormat(MENDUNER_STATUS)
     private String status;
 
+    @Schema(description = "顺序", example = "1")
+    private Integer sort;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/major/MajorSaveReqVO.java

@@ -22,4 +22,7 @@ public class MajorSaveReqVO {
     @NotBlank(message = "{1_099_000_001}")
     private String status;
 
+    @Schema(description = "顺序", example = "1")
+    private Integer sort;
+
 }

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/AppTradeOrderCreateReqVO.java

@@ -24,7 +24,7 @@ public class AppTradeOrderCreateReqVO {
     private Long price;
 
     @NotBlank(message = "{1_100_046_015}")
-    @Schema(description = "订单类型 0平台订单|1求职端订单|2招聘端订单|3用户套餐|4企业套餐|5招聘会门票",
+    @Schema(description = "订单类型 0平台订单|1发布职位订单|2发布众聘订单|3会员套餐|4企业会员套餐|5招聘会门票",
             requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private String type;
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/AppTradeOrderGetReqVO.java

@@ -13,6 +13,6 @@ public class AppTradeOrderGetReqVO {
     @NotNull(message = "商品编号不能为空")
     private Long spuId;
 
-    @Schema(description = "订单类型 0平台订单|1求职端订单|2招聘端订单|3用户套餐|4企业套餐|5招聘会门票", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "订单类型 0平台订单|1发布职位订单|2发布众聘订单|3会员套餐|4企业会员套餐|5招聘会门票", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private String type;
 }

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderCreateReqVO.java

@@ -21,7 +21,7 @@ public class TradeOrderCreateReqVO {
     @NotNull(message = "{1_099_000_006}")
     private Long userId;
 
-    @Schema(description = "订单类型 0平台订单|1求职端订单|2招聘端订单|3用户套餐|4企业套餐|5招聘会门票",
+    @Schema(description = "订单类型 0平台订单|1发布职位订单|2发布众聘订单|3会员套餐|4企业会员套餐|5招聘会门票",
             requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private String type;
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderPageReqVO.java

@@ -30,7 +30,7 @@ public class TradeOrderPageReqVO extends PageParam {
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Long userId;
 
-    @Schema(description = "订单类型 0平台订单|1求职端订单|2招聘端订单|3用户套餐|4企业套餐|5招聘会门票", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "订单类型 0平台订单|1发布职位订单|2发布众聘订单|3会员套餐|4企业会员套餐|5招聘会门票", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private String type;
 
     @Schema(description = "订单来源")

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/person/PersonQueryReqVO.java

@@ -10,6 +10,10 @@ import java.util.List;
 @Data
 public class PersonQueryReqVO extends PageParam {
 
+
+    @Schema(description = "人员类型", example = "1")
+    private String type;
+
     @Schema(description = "内容关键字")
     private String content;
 

+ 2 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/person/student/record/StudentPracticeRecordPageReqVO.java

@@ -18,6 +18,8 @@ import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DA
 @ToString(callSuper = true)
 public class StudentPracticeRecordPageReqVO extends PageParam {
 
+    @Schema(description = "用户id", example = "14881")
+    private Long userId;
 
     @Schema(description = "企业id", example = "14881")
     private Long enterpriseId;

+ 1 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedDO.java

@@ -39,6 +39,7 @@ public class JobAdvertisedDO extends TenantBaseDO {
     /**
      * 来源方关联id
      */
+    @TableField(updateStrategy = FieldStrategy.ALWAYS)
     private Long bizId;
     /**
      * 企业id

+ 5 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/major/MajorDO.java

@@ -2,6 +2,7 @@ package com.citu.module.menduner.system.dal.dataobject.major;
 
 import com.citu.framework.tenant.core.db.TenantBaseDO;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
 import java.time.LocalDateTime;
@@ -51,5 +52,8 @@ public class MajorDO extends TenantBaseDO {
      * 枚举 {@link  MendunerStatusEnum 对应的类}
      */
     private String status;
-
+    /**
+     * 排序
+     */
+    private Integer sort;
 }

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/person/StudentDO.java

@@ -1,8 +1,6 @@
 package com.citu.module.menduner.system.dal.dataobject.person;
 
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
@@ -49,6 +47,7 @@ public class StudentDO extends TenantBaseDO {
     /**
      * 学号
      */
+    @TableField(updateStrategy = FieldStrategy.ALWAYS)
     private String studentNo;
     /**
      * 身份证真实姓名
@@ -81,6 +80,7 @@ public class StudentDO extends TenantBaseDO {
     /**
      * 学生班级id
      */
+    @TableField(updateStrategy = FieldStrategy.ALWAYS)
     private Long schoolClassId;
     /**
      * 学生专业id

+ 17 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/fair/FairMapper.java

@@ -6,8 +6,14 @@ import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.module.menduner.system.controller.base.fair.JobFairPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.fair.FairDO;
+import com.citu.module.menduner.system.dal.dataobject.fair.FairWhiteDO;
+import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.time.LocalDate;
+import java.util.List;
+
 /**
  * 招聘会 Mapper
  *
@@ -28,4 +34,15 @@ public interface FairMapper extends BaseMapperX<FairDO> {
                 .orderByDesc(FairDO::getId));
     }
 
+
+    default List<FairDO> selectListByEnterpriseId(Long enterpriseId) {
+        MPJLambdaWrapper<FairDO> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(FairDO.class);
+        wrapper.innerJoin(FairWhiteDO.class, FairWhiteDO::getJobFairId, FairDO::getId);
+        wrapper.eq(FairWhiteDO::getEnterpriseId, enterpriseId);
+        wrapper.eq(FairDO::getStatus, MendunerStatusEnum.ENABLE.getStatus())
+                .ge(FairDO::getEndTime, LocalDate.now().atStartOfDay())
+                .orderByDesc(FairDO::getEndTime);
+        return selectJoinList(FairDO.class, wrapper);
+    }
 }

+ 1 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/fair/FairWhiteMapper.java

@@ -35,6 +35,7 @@ public interface FairWhiteMapper extends BaseMapperX<FairWhiteDO> {
         wrapper.innerJoin(FairDO.class, FairDO::getId, FairWhiteDO::getJobFairId);
         wrapper.eqIfPresent(FairWhiteDO::getJobFairId, reqVO.getJobFairId());
         wrapper.likeIfExists(EnterpriseDO::getName, reqVO.getName());
+        wrapper.orderByDesc(FairWhiteDO::getCreateTime);
         return selectJoinPage(reqVO, FairWhiteDetailRespVO.class, wrapper);
     }
 

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/major/MajorMapper.java

@@ -25,7 +25,7 @@ public interface MajorMapper extends BaseMapperX<MajorDO> {
                 .likeRightIfPresent(MajorDO::getNameEn, reqVO.getNameEn())
                 .eqIfPresent(MajorDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(MajorDO::getCreateTime, reqVO.getCreateTime())
-                .orderByAsc(MajorDO::getId));
+                .orderByAsc(MajorDO::getSort));
     }
 
     default List<MajorDO> searchByName(String name) {
@@ -38,7 +38,7 @@ public interface MajorMapper extends BaseMapperX<MajorDO> {
                         .likeRight(MajorDO::getNameEn, name);
             });
         }
-        wrapperX.orderByAsc(MajorDO::getUpdater);
+        wrapperX.orderByAsc(MajorDO::getSort);
 
         return selectList(wrapperX);
     }

+ 1 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/person/PersonInfoMapper.java

@@ -199,6 +199,7 @@ public interface PersonInfoMapper extends BaseMapperX<PersonInfoDO> {
         query.inIfPresent(PersonInfoDO::getAreaId, reqVO.getAreaIds());
         query.eqIfPresent(PersonInfoDO::getEduType, reqVO.getEduType());
         query.eqIfPresent(PersonInfoDO::getExpType, reqVO.getExpType());
+        query.eqIfPresent(PersonInfoDO::getType, reqVO.getType());
 
         query.in(CollUtil.isNotEmpty(reqVO.getPositionIds()), JobInterestedDO::getPositionId, reqVO.getPositionIds())
                 .or()

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthService.java

@@ -64,12 +64,12 @@ public interface MdeAuthService {
 
     /**
      * 获得社交认证 URL
-     *
+     * @param application  应用标识
      * @param type        社交平台类型
      * @param redirectUri 跳转地址
      * @return 认证 URL
      */
-    String getSocialAuthorizeUrl(String type, String redirectUri);
+    String getSocialAuthorizeUrl(String application,String type, String redirectUri);
 
     /**
      * 给用户发送短信验证码

+ 12 - 9
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java

@@ -47,7 +47,6 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.validation.Validator;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
@@ -58,6 +57,7 @@ import static com.citu.framework.web.core.util.WebFrameworkUtils.getTerminal;
 import static com.citu.module.menduner.system.controller.base.logger.LoginLogCreateReqDTO.TYPE_USER;
 import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.*;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
+import static com.citu.module.menduner.system.enums.SocialApplicationConstants.SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION;
 
 /**
  * menduner的认证 Service 接口 实现
@@ -136,7 +136,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
             String openid = null;
             if (reqVO.getSocialType() != null) {
                 openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                        reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())).getCheckedData();
+                        reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState(),SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION )).getCheckedData();
             }
             // 创建 Token 令牌,记录登录日志
             return createTokenAfterLoginSuccess(user, reqVO.getAccount(), logTypeEnum, openid);
@@ -183,7 +183,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
                 // 获取错误次数
                 String num =
                         redisTemplate.opsForValue()
-                                .get(String.format(MDE_AUTH_USER_PWD_LOCK,account));
+                                .get(String.format(MDE_AUTH_USER_PWD_LOCK, account));
                 Integer numInt = Integer.parseInt(null == num ? "0" : num) + 1;
 
                 redisTemplate.opsForValue()
@@ -288,7 +288,8 @@ public class MdeAuthServiceImpl implements MdeAuthService {
         String openid = null;
         if (reqVO.getSocialType() != null) {
             openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())).getCheckedData();
+                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState(), SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION
+            )).getCheckedData();
         }
         // 登录成功就清理
         redisTemplate.delete(String.format(MDE_AUTH_USER_SMS_CODE_LOCK, user.getId()));
@@ -338,7 +339,8 @@ public class MdeAuthServiceImpl implements MdeAuthService {
     @DSTransactional
     public AppMdeAuthLoginRespVO socialLogin(AppMdeAuthSocialLoginReqVO reqVO) {
         // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
-        SocialUserRespDTO socialUser = socialUserApi.getSocialUserByCode(UserTypeEnum.MEMBER.getValue(), reqVO.getType(),
+        SocialUserRespDTO socialUser = socialUserApi.getSocialUserByApplicationCode(
+                null == reqVO.getApplication() ? SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION : reqVO.getApplication(),
                 reqVO.getCode(), reqVO.getState()).getCheckedData();
         if (socialUser == null) {
             throw exception(MDE_AUTH_SOCIAL_USER_NOT_FOUND);
@@ -352,7 +354,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
         } else {
             user = userService.createUser(socialUser.getAvatar(), getClientIP(), getTerminal().toString());
             socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                    reqVO.getType(), reqVO.getCode(), reqVO.getState()));
+                    reqVO.getType(), reqVO.getCode(), reqVO.getState(),SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION));
         }
         if (user == null) {
             throw exception(MDE_USER_NOT_EXISTS);
@@ -367,6 +369,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
     public AppMdeAuthLoginRespVO weixinMiniAppLogin(AppMdeAuthWeixinMiniAppLoginReqVO reqVO) {
         // 获得对应的手机号信息
         SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
+                SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION,
                 UserTypeEnum.MEMBER.getValue(), reqVO.getPhoneCode()).getCheckedData();
         Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
 
@@ -377,15 +380,15 @@ public class MdeAuthServiceImpl implements MdeAuthService {
 
         // 绑定社交用户
         String openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                SocialTypeEnum.WECHAT_MINI_APP.getType(), reqVO.getLoginCode(), reqVO.getState())).getCheckedData();
+                SocialTypeEnum.WECHAT_MINI_APP.getType(), reqVO.getLoginCode(), reqVO.getState(),SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION)).getCheckedData();
 
         // 创建 Token 令牌,记录登录日志
         return createTokenAfterLoginSuccess(user, user.getPhone(), LoginLogTypeEnum.LOGIN_SOCIAL, openid);
     }
 
     @Override
-    public String getSocialAuthorizeUrl(String type, String redirectUri) {
-        return socialClientApi.getAuthorizeUrl(Integer.valueOf(type), UserTypeEnum.MEMBER.getValue(), redirectUri).getCheckedData();
+    public String getSocialAuthorizeUrl(String application, String type, String redirectUri) {
+        return socialClientApi.getAuthorizeUrl(application, Integer.valueOf(type), UserTypeEnum.MEMBER.getValue(), redirectUri).getCheckedData();
     }
 
     @Override

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairService.java

@@ -71,6 +71,12 @@ public interface FairService {
      **/
     List<FairDO> list();
 
+    /**
+     * 获取在时间段内的招聘会列表
+     **/
+    List<FairDO> listByEnterpriseId(Long enterpriseId);
+
+
     /**
      * 企业将职位加入招聘会
      **/

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairServiceImpl.java

@@ -210,6 +210,10 @@ public class FairServiceImpl implements FairService {
         );
     }
 
+    @Override
+    public List<FairDO> listByEnterpriseId(Long enterpriseId) {
+        return fairMapper.selectListByEnterpriseId(enterpriseId);
+    }
 
     @Override
     @DSTransactional
@@ -294,6 +298,8 @@ public class FairServiceImpl implements FairService {
 
         // 购买门票的企业, 增加发布职位的数量
         fairWhiteService.increaseAdmissionNum(LoginUserContext.getEnterpriseId(), reqVO.getJobFairId());
+        // 清除招聘会职位标识
+        jobAdvertisedService.cleanFairMark(LoginUserContext.getEnterpriseId(), reqVO.getJobFairId(), reqVO.getJobId());
 
     }
 

+ 2 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairWhiteServiceImpl.java

@@ -46,11 +46,11 @@ public class FairWhiteServiceImpl implements FairWhiteService {
 
     @Override
     @DSTransactional
-    public void addWhiteList(Long jobFairId, List<Long> enterpriseIds,Integer sort) {
+    public void addWhiteList(Long jobFairId, List<Long> enterpriseIds, Integer sort) {
         for (Long enterpriseId : enterpriseIds) {
             FairWhiteDO fairWhiteDO = get(enterpriseId, jobFairId);
             if (null != fairWhiteDO) {
-                if(!Objects.equals(fairWhiteDO.getSort(), sort)) {
+                if (!Objects.equals(fairWhiteDO.getSort(), sort)) {
                     fairWhiteDO.setSort(sort);
                     mapper.updateById(fairWhiteDO);
                 }
@@ -150,7 +150,6 @@ public class FairWhiteServiceImpl implements FairWhiteService {
             return;
         }
         mapper.increase(enterpriseId, jobFairId, 1);
-
     }
 
     @Override

+ 4 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteServiceImpl.java

@@ -285,10 +285,10 @@ public class InterviewInviteServiceImpl implements InterviewInviteService {
         if (LocalDateTime.now().isAfter(reqVO.getTime())) {
             throw exception(INTERVIEW_INVITE_TIME_LESS_THAN_NOW);
         }
-        if (mapper.checkExistsTime(reqVO.getId(), enterpriseId, userId, reqVO.getJobId(), reqVO.getTime())) {
-            // 该时间段已有其他面试者预约
-            throw exception(INTERVIEW_INVITE_TIME_OVERLAP);
-        }
+//        if (mapper.checkExistsTime(reqVO.getId(), enterpriseId, userId, reqVO.getJobId(), reqVO.getTime())) {
+//            // 该时间段已有其他面试者预约
+//            throw exception(INTERVIEW_INVITE_TIME_OVERLAP);
+//        }
 
         if (!isMobile(reqVO.getInvitePhone())) {
             throw exception(INTERVIEW_INVITE_INVITE_PHONE_FORMAT_ERROR);

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java

@@ -96,6 +96,14 @@ public interface JobAdvertisedService {
      **/
     List<JobAdvertisedDO> getListByEnterpriseIdAndType(Long enterpriseId, List<String> types);
 
+    /**
+     * 清除招聘会职位标识
+     *
+     * @param enterpriseId 企业id
+     * @param jobFairId    招聘会id
+     **/
+    void cleanFairMark(Long enterpriseId, Long jobFairId,Long jobId);
+
     // ========== 求职端 ==========
 
     /**

+ 18 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java

@@ -9,6 +9,7 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.dict.core.DictFrameworkUtils;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.aop.VipEntitlementCheck;
 import com.citu.module.menduner.system.aop.VipEntitlementCheckAspect;
@@ -31,6 +32,7 @@ import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedExtendDO;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedExtendMapper;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
+import com.citu.module.menduner.system.enums.job.JobSourceEnum;
 import com.citu.module.menduner.system.enums.job.JobStatusEnum;
 import com.citu.module.menduner.system.enums.sync.OperateTypeEnum;
 import com.citu.module.menduner.system.enums.sync.SyncConstants;
@@ -165,6 +167,22 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         return mapper.selectListByEnterpriseIdAndTypeAndNotHire(enterpriseId, types);
     }
 
+    @Override
+    public void cleanFairMark(Long enterpriseId, Long jobFairId,Long jobId) {
+        List<JobAdvertisedDO> List = mapper.selectList(new LambdaQueryWrapperX<JobAdvertisedDO>()
+                .eq(JobAdvertisedDO::getEnterpriseId, enterpriseId)
+                .eq(JobAdvertisedDO::getSource, JobSourceEnum.FAIR.getType())
+                .eq(JobAdvertisedDO::getBizId, jobFairId)
+                .eqIfPresent(JobAdvertisedDO::getId, jobId)
+        );
+        for (JobAdvertisedDO jobAdvertisedDO : List) {
+            jobAdvertisedDO.setSource(JobSourceEnum.MANAGER.getType());
+            jobAdvertisedDO.setBizId(null);
+            mapper.updateById(jobAdvertisedDO);
+        }
+
+    }
+
     @Override
     public PageResult<AppJobAdvertisedHomeRespVO> getRecommendedPage(PageParam pageParam) {
 

+ 2 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobEntitlementOperateHandler.java

@@ -23,12 +23,14 @@ public class JobEntitlementOperateHandler implements JobOperateHandler {
     @Lazy
     private VipEntitlementCheckAspect vipEntitlementCheckAspect;
 
+
     @Override
     public void beforeCreate(JobAdvertisedDO job) {
         if (JobSourceEnum.FAIR.getType().equals(job.getSource())) {
             // 招聘会来源不做处理
             return;
         }
+
         // 不是众聘职位 和 不是待开启的职位才需要权益
         boolean triggerVip = !job.getHire() && !JobStatusEnum.WAIT_ENABLE.getStatus().equals(job.getStatus());
         // 扣除额度

+ 48 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobFairOperateHandler.java

@@ -1,9 +1,13 @@
 package com.citu.module.menduner.system.service.job.handler;
 
+import com.citu.module.menduner.system.controller.app.recruit.job.vo.joinJobFairReqVO;
+import com.citu.module.menduner.system.dal.dataobject.fair.FairWhiteDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.enums.job.JobSourceEnum;
 import com.citu.module.menduner.system.enums.job.JobStatusEnum;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
+import com.citu.module.menduner.system.service.fair.FairService;
+import com.citu.module.menduner.system.service.fair.FairWhiteService;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
@@ -12,8 +16,7 @@ import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL;
-import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_JOB_ADVERTISED_TIME_ERROR_24;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 
 
 /**
@@ -28,6 +31,13 @@ public class JobFairOperateHandler implements JobOperateHandler {
     @Lazy
     private EnterpriseService enterpriseService;
 
+    @Resource
+    @Lazy
+    private FairWhiteService fairWhiteService;
+
+    @Resource
+    @Lazy
+    private FairService fairService;
 
     @Override
     public void beforeCreate(JobAdvertisedDO job) {
@@ -36,9 +46,28 @@ public class JobFairOperateHandler implements JobOperateHandler {
                 // 没有填写来源(招聘会id)
                 throw exception(MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL);
             }
+            FairWhiteDO fairWhite = fairWhiteService.get(job.getEnterpriseId(), job.getBizId());
+            if(null == fairWhite) {
+                throw exception(JOB_FAIR_NO_PERMISSION);
+            }
         }
     }
 
+    @Override
+    public void afterCreate(JobAdvertisedDO job) {
+        if (JobSourceEnum.FAIR.getType().equals(job.getSource())) {
+            // 基于招聘会创建职位
+            if(JobStatusEnum.ENABLE.getStatus().equals(job.getStatus())){
+                // 创建完招聘会后,同步职位到招聘会里面
+                fairService.joinJobFair(joinJobFairReqVO
+                        .builder()
+                        .jobFairId(job.getBizId())
+                        .jobId(job.getId())
+                        .build()
+                );
+            }
+        }
+    }
 
     @Override
     public void beforeUpdate(JobAdvertisedDO job, JobAdvertisedDO oldJob) {
@@ -51,4 +80,21 @@ public class JobFairOperateHandler implements JobOperateHandler {
             }
         }
     }
+
+    @Override
+    public void afterUpdate(JobAdvertisedDO job, JobAdvertisedDO oldJob) {
+        // 判断之前职位不是属于招聘会,现在改为招聘会的情况
+        if (JobSourceEnum.FAIR.getType().equals(job.getSource())) {
+            // 基于招聘会修改职位
+            if(JobStatusEnum.ENABLE.getStatus().equals(oldJob.getStatus())){
+                // 修改完招聘会后,同步职位到招聘会里面
+                fairService.joinJobFair(joinJobFairReqVO
+                        .builder()
+                        .jobFairId(job.getBizId())
+                        .jobId(job.getId())
+                        .build()
+                );
+            }
+        }
+    }
 }

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoService.java

@@ -136,6 +136,6 @@ public interface PersonInfoService {
      *
      * @param reqVO 姓名
      */
-    void saveStudentInfo(AppStudentSaveReqVO reqVO);
+    void saveStudentInfo(Long userId,AppStudentSaveReqVO reqVO);
 
 }

+ 1 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java

@@ -280,14 +280,12 @@ public class PersonInfoServiceImpl implements PersonInfoService {
 
     @Override
     @DSTransactional
-    public void saveStudentInfo(AppStudentSaveReqVO reqVO) {
+    public void saveStudentInfo(Long userId,AppStudentSaveReqVO reqVO) {
         if (StringUtils.hasText(reqVO.getPhone()) && !ValidationUtils.isMobile(reqVO.getPhone())) {
             // 手机号不合法
             throw exception(MDE_PERSON_PHONE_ERROR);
         }
 
-        Long userId = LoginUserContext.getUserId();
-
         StudentDO student = studentMapper.selectByUserId(userId);
         StudentDO reqObj = BeanUtils.toBean(reqVO, StudentDO.class);
         reqObj.setUserId(userId);

+ 10 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserServiceImpl.java

@@ -13,7 +13,10 @@ import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.datapermission.core.util.DataPermissionUtils;
 import com.citu.module.menduner.common.dto.TimeRangeBasePageReqVO;
 import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
-import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.*;
+import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.AppMdeUserCreatePhonePCReqVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.AppMdeUserUpdatePasswordReqVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.AppMdeUserUpdatePhoneByWeixinReqVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.AppMdeUserUpdatePhoneReqVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisPageReqVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserPageReqVO;
@@ -23,7 +26,6 @@ import com.citu.module.menduner.system.controller.base.userperson.UserPersonResp
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.dal.mysql.user.MdeUserMapper;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
-import com.citu.module.menduner.system.enums.permission.MdeDefaultRoleEnum;
 import com.citu.module.menduner.system.service.permission.MdePermissionService;
 import com.citu.module.system.api.sms.SmsCodeApi;
 import com.citu.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
@@ -42,7 +44,6 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -54,6 +55,7 @@ import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRan
 import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.*;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 import static com.citu.module.menduner.system.enums.MdeLogRecordConstants.*;
+import static com.citu.module.menduner.system.enums.SocialApplicationConstants.SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION;
 import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
 import static com.citu.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS;
 
@@ -84,7 +86,7 @@ public class MdeUserServiceImpl implements MdeUserService {
 
     @Resource
     @Lazy
-    private RedisTemplate<String,String> redisTemplate;
+    private RedisTemplate<String, String> redisTemplate;
 
 
     @Override
@@ -237,7 +239,7 @@ public class MdeUserServiceImpl implements MdeUserService {
 
     @Override
     @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
-    @Lock4j(keys = {"#phone"},  acquireTimeout = 6000)
+    @Lock4j(keys = {"#phone"}, acquireTimeout = 6000)
     public MdeUserDO createUserIfAbsent(String phone, String registerIp, String terminal) {
         // 用户已经存在
         MdeUserDO user = mdeUserMapper.selectByPhone(phone);
@@ -250,7 +252,7 @@ public class MdeUserServiceImpl implements MdeUserService {
 
     @Override
     @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
-    @Lock4j(keys = {"#phone"},  acquireTimeout = 6000)
+    @Lock4j(keys = {"#phone"}, acquireTimeout = 6000)
     public MdeUserDO createUserIfAbsent(String phone, Long inviteCode) {
         // 用户已经存在
         MdeUserDO user = mdeUserMapper.selectByPhone(phone);
@@ -371,7 +373,7 @@ public class MdeUserServiceImpl implements MdeUserService {
     public void updateUserMobileByWeixin(Long userId, AppMdeUserUpdatePhoneByWeixinReqVO reqVO) {
         // 1.1 获得对应的手机号信息
         SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
-                UserTypeEnum.MEMBER.getValue(), reqVO.getCode()).getCheckedData();
+                SOCIAL_WX_PROGRAM_JOBHUNT_APPLICATION, UserTypeEnum.MEMBER.getValue(), reqVO.getCode()).getCheckedData();
         Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
         // 1.2 校验新手机是否已经被绑定
         validatePhoneUnique(userId, phoneNumberInfo.getPhoneNumber());
@@ -389,7 +391,7 @@ public class MdeUserServiceImpl implements MdeUserService {
                 .setScene(SmsSceneEnum.MENDUNER_UPDATE_PASSWORD.getScene()).setUsedIp(getClientIP())).getCheckedData();
 
         // 更新用户密码
-        updateUserPassword(userId,reqVO.getPassword());
+        updateUserPassword(userId, reqVO.getPassword());
     }