Prechádzať zdrojové kódy

新增批量注册家长课堂账号、角色、短信通知功能

liyanbo 1 mesiac pred
rodič
commit
1a88477122

+ 64 - 1
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/user/UserController.java

@@ -13,7 +13,10 @@ import cn.iocoder.byzs.module.system.convert.user.UserConvert;
 import cn.iocoder.byzs.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.byzs.module.system.dal.dataobject.user.AdminUserDO;
 import cn.iocoder.byzs.module.system.enums.common.SexEnum;
+import cn.iocoder.byzs.module.system.enums.sms.SmsSceneEnum;
 import cn.iocoder.byzs.module.system.service.dept.DeptService;
+import cn.iocoder.byzs.module.system.service.permission.PermissionService;
+import cn.iocoder.byzs.module.system.service.sms.SmsSendService;
 import cn.iocoder.byzs.module.system.service.user.AdminUserService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -23,12 +26,14 @@ import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -46,6 +51,10 @@ public class UserController {
     private AdminUserService userService;
     @Resource
     private DeptService deptService;
+    @Resource
+    private SmsSendService smsSendService;
+    @Resource
+    private PermissionService permissionService;
 
     @PostMapping("/create")
     @Operation(summary = "新增用户")
@@ -170,4 +179,58 @@ public class UserController {
         return success(userService.importUserList(list, updateSupport));
     }
 
-}
+    @PostMapping("/parent-class-register")
+    @Operation(summary = "家长课堂注册")
+    @Transactional(rollbackFor = Exception.class)
+    public CommonResult<Long> parentClassRegister(@Valid @RequestBody ParentClassRegisterReqVO reqVO) {
+        if ("batch".equals(reqVO.getType())) {
+            List<String> batchMobiles = reqVO.getBatchMobiles();
+            if (CollUtil.isEmpty(batchMobiles)) {
+                return success(null);
+            }
+            Long firstUserId = null;
+            for (String mobile : batchMobiles) {
+                UserSaveReqVO saveReqVO = new UserSaveReqVO();
+                saveReqVO.setUsername(mobile);
+                saveReqVO.setPassword(mobile);
+                saveReqVO.setMobile(mobile);
+                String nickname = mobile.length() >= 4 ? mobile.substring(mobile.length() - 4) : mobile;
+                saveReqVO.setNickname(nickname);
+                saveReqVO.setDeptId(reqVO.getDeptId());
+                Long userId = userService.createUser(saveReqVO);
+                if (firstUserId == null) {
+                    firstUserId = userId;
+                }
+                if (reqVO.getRoleIds() != null && !reqVO.getRoleIds().isEmpty()) {
+                    permissionService.assignUserRole(userId, reqVO.getRoleIds());
+                }
+                if (Boolean.TRUE.equals(reqVO.getSendSms())) {
+                    sendRegisterSms(mobile);
+                }
+            }
+            return success(firstUserId);
+        } else {
+            UserSaveReqVO saveReqVO = new UserSaveReqVO();
+            saveReqVO.setUsername(reqVO.getUsername());
+            saveReqVO.setPassword(reqVO.getPassword());
+            saveReqVO.setMobile(reqVO.getMobile());
+            saveReqVO.setNickname(reqVO.getNickname());
+            saveReqVO.setDeptId(reqVO.getDeptId());
+            Long userId = userService.createUser(saveReqVO);
+            if (reqVO.getRoleIds() != null && !reqVO.getRoleIds().isEmpty()) {
+                permissionService.assignUserRole(userId, reqVO.getRoleIds());
+            }
+            if (Boolean.TRUE.equals(reqVO.getSendSms())) {
+                sendRegisterSms(reqVO.getMobile());
+            }
+            return success(userId);
+        }
+    }
+
+    private void sendRegisterSms(String mobile) {
+        Map<String, Object> templateParams = new HashMap<>();
+        smsSendService.sendSingleSmsToAdmin(mobile, null,
+                SmsSceneEnum.TXY_MEMBER_REGISTER_NOTICE.getTemplateCode(), templateParams);
+    }
+
+}

+ 46 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/user/vo/user/ParentClassRegisterReqVO.java

@@ -0,0 +1,46 @@
+package cn.iocoder.byzs.module.system.controller.admin.user.vo.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+@Schema(description = "管理后台 - 家长课堂注册 Request VO")
+@Data
+public class ParentClassRegisterReqVO {
+
+    @Schema(description = "注册类型:single-单个,batch-批量", requiredMode = Schema.RequiredMode.REQUIRED, example = "single")
+    @NotBlank(message = "注册类型不能为空")
+    private String type;
+
+    @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "byzs")
+    private String username;
+
+    @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "lyb")
+    private String nickname;
+
+    @Schema(description = "手机号码", example = "15601691300")
+    private String mobile;
+
+    @Schema(description = "部门编号", example = "我是一个用户")
+    private Long deptId;
+
+    @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
+    private String password;
+
+    @Schema(description = "批量手机号列表(一行一个)", example = "[\"15601691300\", \"15601691301\"]")
+    private List<String> batchMobiles;
+
+    @Schema(description = "角色编号列表", example = "1,3,5")
+    private Set<Long> roleIds = Collections.emptySet(); // 兜底
+
+    @Schema(description = "是否发送短信通知", example = "true")
+    private Boolean sendSms;
+
+    @Schema(description = "备注", example = "我是一个用户")
+    private String remark;
+
+}

+ 4 - 2
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/enums/sms/SmsSceneEnum.java

@@ -28,7 +28,9 @@ public enum SmsSceneEnum implements ArrayValuable<Integer> {
 
     ALY_MEMBER_PUSH_INVITATION_CODE(30, "aly-sms-push-invitation-code", "阿里云 - 邀请码推送登录"),
     TXY_MEMBER_PUSH_INVITATION_CODE(31, "txy-sms-push-invitation-code", "腾讯云 - 邀请码推送登录"),
-    SYY_MEMBER_PUSH_INVITATION_CODE(32, "syy-sms-push-invitation-code", "赛邮云 - 邀请码推送登录");
+    SYY_MEMBER_PUSH_INVITATION_CODE(32, "syy-sms-push-invitation-code", "赛邮云 - 邀请码推送登录"),
+    
+    TXY_MEMBER_REGISTER_NOTICE(33, "txy-sms-register-notice", "腾讯云 - 家长课堂注册通知");
 
     public static final Integer[] ARRAYS = Arrays.stream(values()).map(SmsSceneEnum::getScene).toArray(Integer[]::new);
 
@@ -55,4 +57,4 @@ public enum SmsSceneEnum implements ArrayValuable<Integer> {
                 values());
     }
 
-}
+}