Parcourir la source

加入定时器,为指定角色自动开启blockly两节课

liyanbo il y a 4 mois
Parent
commit
ed7e28aa2c

+ 6 - 6
README.md

@@ -97,12 +97,12 @@
 
 | 项目                    | 说明                 |
 |-----------------------|--------------------|
-| `yudao-dependencies`  | Maven 依赖版本管理       |
-| `yudao-framework`     | Java 框架拓展          |
-| `yudao-server`        | 管理后台 + 用户 APP 的服务端 |
-| `yudao-module-system` | 系统功能的 Module 模块    |
-| `yudao-module-infra`  | 基础设施的 Module 模块    |
-| `yudao-module-ai`     | AI 大模型的 Module 模块  |
+| `byzs-dependencies`  | Maven 依赖版本管理       |
+| `byzs-framework`     | Java 框架拓展          |
+| `byzs-server`        | 管理后台 + 用户 APP 的服务端 |
+| `byzs-module-system` | 系统功能的 Module 模块    |
+| `byzs-module-infra`  | 基础设施的 Module 模块    |
+| `byzs-module-ai`     | AI 大模型的 Module 模块  |
 
 ### 框架
 

+ 120 - 0
byzs-blockly/src/main/java/cn/iocoder/byzs/module/blockly/job/JobBlockluAotoRoleJob.java

@@ -0,0 +1,120 @@
+package cn.iocoder.byzs.module.blockly.job;
+
+import cn.iocoder.byzs.framework.quartz.core.handler.JobHandler;
+import cn.iocoder.byzs.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.byzs.module.blockly.dal.dataobject.blocklyType.BlocklyTypeDO;
+import cn.iocoder.byzs.module.blockly.service.blocklyType.BlocklyTypeService;
+import cn.iocoder.byzs.module.system.dal.dataobject.permission.RoleDO;
+import cn.iocoder.byzs.module.system.service.permission.RoleService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 每天开2节blockly课程 Job
+ *
+ * @author j-sentinel
+ */
+@Slf4j
+@Component
+public class JobBlockluAotoRoleJob implements JobHandler {
+
+    @Resource
+    private BlocklyTypeService blocklyTypeService;
+
+    @Resource
+    private RoleService roleService;
+
+    // 定义常量
+    private static final Integer autoCount = 2; // 自动分配的课程数量
+
+    @Override
+    @TenantIgnore
+    public String execute(String roleIdParam) {
+        log.info("开始执行自动分配blockly课程权限任务, 角色ID: {}", roleIdParam);
+        Long roleId = Long.parseLong(roleIdParam);
+
+        try {
+            // 1. 获取指定租户下的角色信息
+            RoleDO role = roleService.getRole(roleId);
+            if (role == null) {
+                log.warn("未找到指定角色, roleId: {}", roleId);
+                return "未找到指定角色";
+            }
+
+            // 2. 获取角色当前的blockly权限
+            Set<Long> existingBlocklyIds = role.getDataScopeBlocklyIds();
+            if (existingBlocklyIds == null) {
+                existingBlocklyIds = new HashSet<>();
+            }
+
+            // 3. 获取所有blockly主题列表(父级ID为0的类型)
+            List<BlocklyTypeDO> themes = blocklyTypeService.getBlocklyTypeList(
+                    new cn.iocoder.byzs.module.blockly.controller.admin.blocklyType.vo.BlocklyTypeListReqVO()
+                            .setCtParentId(BlocklyTypeDO.CT_PARENT_ID_ROOT)
+            );
+
+            // 按排序字段升序排列主题
+            themes.sort(Comparator.comparing(BlocklyTypeDO::getCtTypeSort, Comparator.nullsLast(Comparator.naturalOrder())));
+
+            log.info("获取到 {} 个主题", themes.size());
+
+            // 4. 收集需要新增的课程ID
+            Set<Long> newBlocklyIds = new HashSet<>();
+
+            // 5. 遍历主题,查找每个主题下的课程类型和课程
+            for (BlocklyTypeDO theme : themes) {
+                if (newBlocklyIds.size() >= autoCount) {
+                    break; // 已经找到2个未配置的课程,跳出循环
+                }
+
+                // 获取当前主题下的所有课程类型
+                List<BlocklyTypeDO> courseTypes = blocklyTypeService.getBlocklyTypeList(
+                        new cn.iocoder.byzs.module.blockly.controller.admin.blocklyType.vo.BlocklyTypeListReqVO()
+                                .setCtParentId(theme.getId())
+                );
+
+                // 按排序字段升序排列课程类型
+                courseTypes.sort(Comparator.comparing(BlocklyTypeDO::getCtTypeSort, Comparator.nullsLast(Comparator.naturalOrder())));
+
+                log.info("主题 {} 下有 {} 个课程类型", theme.getCtType(), courseTypes.size());
+
+                // 遍历课程类型,获取课程
+                for (BlocklyTypeDO courseType : courseTypes) {
+                    if (newBlocklyIds.size() >= autoCount) {
+                        break; // 已经找到2个未配置的课程,跳出循环
+                    }
+
+                    // 检查该课程是否已经配置了权限
+                    if (!existingBlocklyIds.contains(courseType.getId())) {
+                        newBlocklyIds.add(courseType.getId());
+                        log.info("找到未配置权限的课程: ID={}, 名称={}", courseType.getId(), courseType.getCtType());
+                    }
+                }
+            }
+
+            // 6. 如果找到了新的课程ID,更新角色权限
+            if (!newBlocklyIds.isEmpty()) {
+                // 合并现有的权限和新权限
+                Set<Long> updatedBlocklyIds = new HashSet<>(existingBlocklyIds);
+                updatedBlocklyIds.addAll(newBlocklyIds);
+
+                // 更新角色的blockly权限
+                roleService.updateRoleBlocklyScope(roleId, updatedBlocklyIds);
+                log.info("成功为角色 {} 添加了 {} 个新的blockly课程权限: {}", roleId, updatedBlocklyIds.size(), updatedBlocklyIds);
+                return String.format("成功添加了 %d 个新的blockly课程权限", updatedBlocklyIds.size());
+            } else {
+                log.info("未找到需要新增的blockly课程权限");
+                return "未找到需要新增的blockly课程权限";
+            }
+        } catch (Exception e) {
+            log.error("执行自动分配blockly课程权限任务时发生错误", e);
+            return "执行任务时发生错误: " + e.getMessage();
+        }
+    }
+}

+ 1 - 1
byzs-module-infra/src/main/java/cn/iocoder/byzs/module/infra/controller/admin/file/vo/file/FileCreateReqVO.java

@@ -21,7 +21,7 @@ public class FileCreateReqVO {
     private String name;
 
     @NotNull(message = "文件 URL不能为空")
-    @Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/yudao.jpg")
+    @Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "")
     private String url;
 
     @Schema(description = "文件 MIME 类型", example = "application/octet-stream")

+ 1 - 1
byzs-module-infra/src/main/java/cn/iocoder/byzs/module/infra/controller/admin/file/vo/file/FileRespVO.java

@@ -21,7 +21,7 @@ public class FileRespVO {
     @Schema(description = "原文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "byzs.jpg")
     private String name;
 
-    @Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/yudao.jpg")
+    @Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "")
     private String url;
 
     @Schema(description = "文件MIME类型", example = "application/octet-stream")

+ 1 - 1
byzs-module-infra/src/main/resources/codegen/sql/h2.vm

@@ -33,5 +33,5 @@ CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" (
     PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}")
 ) COMMENT '${table.tableComment}';
 
--- 将该删表 SQL 语句,添加到 yudao-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里
+-- 将该删表 SQL 语句,添加到 byzs-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里
 DELETE FROM "${table.tableName}";

+ 1 - 1
byzs-server/src/main/resources/application-localProd.yaml

@@ -6,7 +6,7 @@ spring:
   autoconfigure:
     # noinspection SpringBootApplicationYaml
     exclude:
-      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
+#      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
       - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
       - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
       - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置

+ 1 - 1
byzs-server/src/main/resources/application-prod.yaml

@@ -6,7 +6,7 @@ spring:
   autoconfigure:
     # noinspection SpringBootApplicationYaml
     exclude:
-      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
+#      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
       - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
       - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
       - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置

+ 1 - 1
byzs-server/src/main/resources/application-prodDev.yaml

@@ -6,7 +6,7 @@ spring:
   autoconfigure:
     # noinspection SpringBootApplicationYaml
     exclude:
-      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
+#      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
       - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
       - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
       - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
sql/mysql/quartz.sql


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff