Parcourir la source

修复短剧创作-项目/分镜-权限

tsurumure il y a 2 mois
Parent
commit
5ef52a27ec

+ 1 - 1
db/crt_drama_project_storyboard.sql

@@ -17,7 +17,7 @@ CREATE TABLE `crt_drama_project_storyboard` (
     `story_prompt` VARCHAR(1000) COMMENT '分镜设计',
     `story_framing` VARCHAR(1000) COMMENT '景别',
     `story_scene` VARCHAR(1000) COMMENT '场景',
-    `story_weather_time` VARCHAR(500) COMMENT '天气/时间',
+    `story_weather_time` VARCHAR(1000) COMMENT '天气/时间',
     `lora_figure_ids` VARCHAR(255) COMMENT '人物LoRA ID (创建时,跟随项目的人物LoRAID)(多个人物ID以逗号分隔)',
 
     `param_image_count` INT DEFAULT '1' COMMENT '每次生成图片数量 (默认值:1,整数范围:1~4)',

+ 5 - 5
db/sys_user_role_permission.sql

@@ -47,9 +47,9 @@ INSERT INTO sys_user_role_permission(id, parent_id, permission_name, sort) VALUE
                 ('36.1.5.1', '36.1.5', 'AI短剧创作-编辑项目配置 (自己)', null),
             ('36.1.6', '36.1', 'AI短剧创作-删除项目 (全权限)', null),
                 ('36.1.6.1', '36.1.6', 'AI短剧创作-删除项目 (自己)', null),
-        ('36.2', '36', 'AI短剧创作-分镜管理', null),
-            ('36.2.1', '36.2', 'AI短剧创作-分镜列表', null),
-            ('36.2.2', '36.2', 'AI短剧创作-创建分', null),
+        ('36.2', '36', 'AI短剧创作-分集/分镜管理', null),
+            ('36.2.1', '36.2', 'AI短剧创作-分集信息/分镜列表', null),
+            ('36.2.2', '36.2', 'AI短剧创作-创建分', null),
             ('36.2.3', '36.2', 'AI短剧创作-编辑项目生图/生视频配置 (全权限)', null),
                 ('36.2.3.1', '36.2.3', 'AI短剧创作-编辑项目生图/生视频配置 (自己)', null),
             ('36.2.4', '36.2', 'AI短剧创作-编辑分镜 (全权限)', null),
@@ -138,7 +138,7 @@ INSERT INTO sys_user_role_permission(id, parent_id, permission_name, sort) VALUE
             ('10.6.1', '10.6', '导航详情', null),
             ('10.6.2', '10.6', '创建导航', null),
             ('10.6.3', '10.6', '编辑导航', null),
-            ('10.6.4', '10.6', '删除导航', null)
+            ('10.6.4', '10.6', '删除导航', null),
 
     ('11', -1, '商品管理', null),
         ('11.1', '11', '商品列表', null),
@@ -170,7 +170,7 @@ INSERT INTO sys_user_role_permission(id, parent_id, permission_name, sort) VALUE
             ('11.6.1', '11.6', '商品规格SKU详情', null),
             ('11.6.2', '11.6', '创建商品规格SKU', null),
             ('11.6.3', '11.6', '编辑商品规格SKU', null),
-            ('11.6.4', '11.6', '删除商品规格SKU', null),
+            ('11.6.4', '11.6', '删除商品规格SKU', null)
 
 
 

+ 1 - 2
db/sys_user_role_permission_relation.sql

@@ -113,8 +113,7 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
             (1, '36.2.1'),
             (1, '36.2.2'),
             (1, '36.2.3'), (1, '36.2.3.1'),
-#             (1, '36.2.4'), (1, '36.2.4.1'),
-            (1, '36.2.4.1'),
+            (1, '36.2.4'), (1, '36.2.4.1'),
 
 
     (1, '100'),

+ 3 - 3
src/main/java/com/backendsys/modules/common/config/security/utils/SecurityUtil.java

@@ -141,6 +141,9 @@ public class SecurityUtil {
      * - securityUtil.hasPermissions(Arrays.asList("3.2.1", "3.2.2"), MatchType.OR)
      * - 注意:权限储存在Token中,更新权限需要重新登录
      */
+    public Boolean hasPermissions(List<String> permis) {
+        return hasPermissions(permis, MatchType.AND);
+    }
     public Boolean hasPermissions(List<String> permis, MatchType matchType) {
         if (isSuper()) return true;
         List<String> permission_ids = getPermissionIds();
@@ -153,8 +156,5 @@ public class SecurityUtil {
         }
         return false;
     }
-    public Boolean hasPermissions(List<String> permis) {
-        return hasPermissions(permis, MatchType.AND);
-    }
 
 }

+ 12 - 5
src/main/java/com/backendsys/modules/crt/controller/CrtDramaProjectController.java

@@ -3,6 +3,7 @@ package com.backendsys.modules.crt.controller;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.common.utils.Result;
 import com.backendsys.modules.crt.entity.CrtDramaProject;
+import com.backendsys.modules.crt.entity.CrtDramaProjectSettings;
 import com.backendsys.modules.crt.service.CrtDramaProjectService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -19,14 +20,14 @@ public class CrtDramaProjectController {
     @Autowired
     private CrtDramaProjectService crtDramaProjectService;
 
-    @Operation(summary = "获取短剧创作-项目列表 (全权限)")
+    @Operation(summary = "项目列表 (全权限)")
     @PreAuthorize("@sr.hasPermission('36.1.1')")
     @GetMapping("/api/crt/drama/getDramaProjectAllList")
     public Result getDramaProjectAllList(@Validated CrtDramaProject crtDramaProject) {
         return Result.success().put("data", crtDramaProjectService.selectCrtDramaProjectList(crtDramaProject));
     }
 
-    @Operation(summary = "获取短剧创作-项目列表 (我的)")
+    @Operation(summary = "项目列表 (我的)")
     @PreAuthorize("@sr.hasPermissions(T(java.util.Arrays).asList('36.1.1', '36.1.2'), T(com.backendsys.modules.common.enums.MatchType).OR)")
     @GetMapping("/api/crt/drama/getDramaProjectList")
     public Result getDramaProjectList(@Validated CrtDramaProject crtDramaProject) {
@@ -34,7 +35,7 @@ public class CrtDramaProjectController {
         return Result.success().put("data", crtDramaProjectService.selectCrtDramaProjectList(crtDramaProject));
     }
 
-    @Operation(summary = "获取短剧创作-创建项目")
+    @Operation(summary = "创建项目")
     @PreAuthorize("@sr.hasPermission('36.1.2')")
     @PostMapping("/api/crt/drama/createDramaProject")
     public Result createDramaProject(@Validated(CrtDramaProject.Create.class) @RequestBody CrtDramaProject crtDramaProject) {
@@ -44,13 +45,19 @@ public class CrtDramaProjectController {
         return Result.success().put("data", crtDramaProjectService.createCrtDramaProject(crtDramaProject));
     }
 
-    @Operation(summary = "获取短剧创作-编辑项目")
+    @Operation(summary = "编辑项目")
     @PutMapping("/api/crt/drama/updateDramaProject")
     public Result updateDramaProject(@Validated(CrtDramaProject.Update.class) @RequestBody CrtDramaProject crtDramaProject) {
         return Result.success().put("data", crtDramaProjectService.updateCrtDramaProject(crtDramaProject));
     }
 
-    @Operation(summary = "获取短剧创作-删除项目")
+    @Operation(summary = "编辑项目生图/生视频配置")
+    @PutMapping("/api/crt/drama/updateDramaProjectSettings")
+    public Result updateStoryboardSettings(@Validated(CrtDramaProjectSettings.UpdateSettings.class) @RequestBody CrtDramaProjectSettings crtDramaProjectSettings) {
+        return Result.success().put("data", crtDramaProjectService.updateDramaProjectSettings(crtDramaProjectSettings));
+    }
+
+    @Operation(summary = "删除项目")
     @DeleteMapping("/api/crt/drama/deleteDramaProject")
     public Result deleteDramaProject(@Validated(CrtDramaProject.Delete.class) @RequestBody CrtDramaProject crtDramaProject) {
         return Result.success().put("data", crtDramaProjectService.deleteCrtDramaProject(crtDramaProject));

+ 4 - 10
src/main/java/com/backendsys/modules/crt/controller/CrtDramaProjectStoryboardController.java

@@ -23,27 +23,21 @@ public class CrtDramaProjectStoryboardController {
     private CrtDramaProjectStoryboardService crtDramaProjectStoryboardService;
 
 
-    @Operation(summary = "获取分镜详情")
+    @Operation(summary = "获取分集信息/分镜列表")
     @PreAuthorize("@sr.hasPermission('36.2.1')")
     @GetMapping("/api/crt/drama/getStoryboard")
     public Result getStoryboard(@Validated(CrtDramaProjectStoryboard.StoryboardDetail.class) CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
         return Result.success().put("data", crtDramaProjectStoryboardService.selectCrtDramaProjectStoryboardDetail(crtDramaProjectStoryboard));
     }
 
-    @Operation(summary = "创建分")
+    @Operation(summary = "创建分")
     @PreAuthorize("@sr.hasPermission('36.2.2')")
-    @PostMapping("/api/crt/drama/createStoryboard")
-    public Result createStoryboard(@Validated(CrtDramaProject.CreateStoryboard.class) @RequestBody CrtDramaProject crtDramaProject) {
+    @PostMapping("/api/crt/drama/initStoryboard")
+    public Result initStoryboard(@Validated(CrtDramaProject.InitStoryboard.class) @RequestBody CrtDramaProject crtDramaProject) {
         crtDramaProject.setUser_id(SecurityUtil.getUserId());
         return Result.success().put("data", crtDramaProjectStoryboardService.createStoryboard(crtDramaProject));
     }
 
-    @Operation(summary = "编辑项目生图/生视频配置")
-    @PutMapping("/api/crt/drama/updateStoryboardSettings")
-    public Result updateStoryboardSettings(@Validated(CrtDramaProjectSettings.UpdateSettings.class) @RequestBody CrtDramaProjectSettings crtDramaProjectSettings) {
-        return Result.success().put("data", crtDramaProjectStoryboardService.updateStoryboardSettings(crtDramaProjectSettings));
-    }
-
     @Operation(summary = "编辑分镜")
     @PutMapping("/api/crt/drama/updateStoryboard")
     public Result updateStoryboard(@Validated(CrtDramaProjectStoryboard.Update.class) @RequestBody CrtDramaProjectStoryboard crtDramaProjectStoryboard) {

+ 3 - 0
src/main/java/com/backendsys/modules/crt/dao/CrtDramaProjectStoryboardDao.java

@@ -6,4 +6,7 @@ import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
 public interface CrtDramaProjectStoryboardDao extends BaseMapper<CrtDramaProjectStoryboard> {
+
+    int updateStoryboard(CrtDramaProjectStoryboard crtDramaProjectStoryboard);
+
 }

+ 4 - 4
src/main/java/com/backendsys/modules/crt/entity/CrtDramaProject.java

@@ -17,7 +17,7 @@ public class CrtDramaProject {
 
     public static interface Detail{}
     public static interface Create{}
-    public static interface CreateStoryboard{}
+    public static interface InitStoryboard{}
     public static interface Update{}
     public static interface Delete{}
 
@@ -26,7 +26,7 @@ public class CrtDramaProject {
     private Long id;
 
     @TableField(exist = false)
-    @NotNull(message = "项目ID不能为空", groups = { CreateStoryboard.class, Update.class, Delete.class })
+    @NotNull(message = "项目ID不能为空", groups = { InitStoryboard.class, Update.class, Delete.class })
     private Long drama_project_id;
 
     private Long user_id;
@@ -35,8 +35,8 @@ public class CrtDramaProject {
     private String project_name;
 
     @TableField(exist = false)
-    @NotNull(message = "集数不能为空", groups = { CreateStoryboard.class })
-    @Max(value = 999, message = "集数长度不超过 {value}", groups = { CreateStoryboard.class })
+    @NotNull(message = "集数不能为空", groups = { InitStoryboard.class })
+    @Max(value = 999, message = "集数长度不超过 {value}", groups = { InitStoryboard.class })
     private Integer episode_num;
 
     @TableField(exist = false)

+ 19 - 7
src/main/java/com/backendsys/modules/crt/entity/CrtDramaProjectStoryboard.java

@@ -4,8 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import jakarta.validation.constraints.Max;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import lombok.Data;
+import org.hibernate.validator.constraints.Range;
 
 @Data
 @TableName("crt_drama_project_storyboard")
@@ -27,15 +30,22 @@ public class CrtDramaProjectStoryboard {
     private Long user_id;
 
     @NotNull(message = "项目ID不能为空", groups = { StoryboardDetail.class })
-    private Long drama_project_id;                  // 项目ID
+    private Long drama_project_id;
     @NotNull(message = "集数不能为空", groups = { StoryboardDetail.class })
-    private Integer episode_num;                    // 集数 (不超过999集)
-    private Integer sort;                           // 排序
+    @Max(value = 999, message = "集数不超过 {value}")
+    private Integer episode_num;
 
-    private String story_prompt;                    // 分镜设计
-    private String story_framing;                   // 景别
-    private String story_scene;                     // 场景
-    private String story_weather_time;              // 天气/时间
+    @Range(min = 1, max = 9999, message = "排序必须在 {min} 到 {max} 之间")
+    private Integer sort;
+
+    @Size(max = 1000, message = "分镜设计长度不超过 {max} 个字符", groups = { Update.class })
+    private String story_prompt;
+    @Size(max = 1000, message = "景别长度不超过 {max} 个字符", groups = { Update.class })
+    private String story_framing;
+    @Size(max = 1000, message = "场景长度不超过 {max} 个字符", groups = { Update.class })
+    private String story_scene;
+    @Size(max = 1000, message = "天气/时间长度不超过 {max} 个字符", groups = { Update.class })
+    private String story_weather_time;
     private String lora_figure_ids;                 // 人物LoRA ID (创建时,跟随项目的人物LoRAID)(多个人物ID以逗号分隔)
 
     private Integer param_image_count;              // 每次生成图片数量 (默认值:1,整数范围:1~4)
@@ -44,6 +54,8 @@ public class CrtDramaProjectStoryboard {
     private Integer param_step_count;               // 步数 (默认值:20,整数范围:1~30)
     private Integer param_random_seed;              // 随机种子 (默认值:1,范围:(1:随机, 2:自定义))
     private String param_random_seed_custom;        // 随机种子自定义值 (长度: 0~64位整数)
+
+    @Size(max = 2000, message = "文生图提示词 长度不超过 {max} 个字符", groups = { Update.class })
     private String text_to_image_prompt;            // 文生图提示词 (生图时必填)
 
     private Integer param_video_reference_type;     // 生视频模式 (1:首尾帧模式, 2:多图参考模式)

+ 8 - 4
src/main/java/com/backendsys/modules/crt/service/CrtDramaProjectService.java

@@ -2,22 +2,26 @@ package com.backendsys.modules.crt.service;
 
 import com.backendsys.modules.cms.article.entity.ArticleCategory;
 import com.backendsys.modules.crt.entity.CrtDramaProject;
+import com.backendsys.modules.crt.entity.CrtDramaProjectSettings;
 import com.backendsys.utils.response.PageEntity;
 
 import java.util.Map;
 
 public interface CrtDramaProjectService {
 
-    // 获取短剧创作-项目列表
+    // 获取项目列表
     PageEntity selectCrtDramaProjectList(CrtDramaProject crtDramaProject);
 
-    // 创建短剧创作-项目
+    // 创建项目
     Map<String, Object> createCrtDramaProject(CrtDramaProject crtDramaProject);
 
-    // 编辑短剧创作-项目
+    // 编辑项目
     Map<String, Object> updateCrtDramaProject(CrtDramaProject crtDramaProject);
 
-    // 删除短剧创作-项目
+    // 编辑项目生图/生视频配置
+    Map<String, Object> updateDramaProjectSettings(CrtDramaProjectSettings crtDramaProjectSettings);
+
+    // 删除项目
     Map<String, Object> deleteCrtDramaProject(CrtDramaProject crtDramaProject);
 
 }

+ 2 - 5
src/main/java/com/backendsys/modules/crt/service/CrtDramaProjectStoryboardService.java

@@ -10,15 +10,12 @@ import java.util.Map;
 
 public interface CrtDramaProjectStoryboardService {
 
-    // 获取分镜详情
+    // 获取分集信息/分镜列表
     StoryboardResponse selectCrtDramaProjectStoryboardDetail(CrtDramaProjectStoryboard crtDramaProjectStoryboard);
 
-    // 创建分
+    // 创建分
     Map<String, Object> createStoryboard(CrtDramaProject crtDramaProject);
 
-    // 编辑项目生图/生视频配置
-    Map<String, Object> updateStoryboardSettings(CrtDramaProjectSettings crtDramaProjectSettings);
-
     // 编辑分镜
     Map<String, Object> updateStoryboard(CrtDramaProjectStoryboard crtDramaProjectStoryboard);
 

+ 87 - 18
src/main/java/com/backendsys/modules/crt/service/impl/CrtDramaProjectServiceImpl.java

@@ -1,5 +1,9 @@
 package com.backendsys.modules.crt.service.impl;
 
+import com.backendsys.exception.CustException;
+import com.backendsys.modules.common.config.security.enums.SecurityEnum;
+import com.backendsys.modules.common.config.security.utils.SecurityUtil;
+import com.backendsys.modules.common.enums.MatchType;
 import com.backendsys.modules.crt.dao.CrtDramaProjectDao;
 import com.backendsys.modules.crt.dao.CrtDramaProjectSettingsDao;
 import com.backendsys.modules.crt.dao.CrtDramaProjectStoryboardDao;
@@ -9,7 +13,6 @@ import com.backendsys.modules.crt.entity.CrtDramaProjectStoryboard;
 import com.backendsys.modules.crt.enums.AspectRatioEnums;
 import com.backendsys.modules.crt.enums.ProjectSettingTypeEnums;
 import com.backendsys.modules.crt.service.CrtDramaProjectService;
-import com.backendsys.modules.crt.utils.CrtUtil;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.v2.PageUtils;
@@ -18,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -25,7 +29,7 @@ import java.util.Map;
 public class CrtDramaProjectServiceImpl implements CrtDramaProjectService {
 
     @Autowired
-    private CrtUtil crtUtil;
+    private SecurityUtil securityUtil;
     @Autowired
     private CrtDramaProjectDao crtDramaProjectDao;
     @Autowired
@@ -72,43 +76,108 @@ public class CrtDramaProjectServiceImpl implements CrtDramaProjectService {
     }
 
     /**
-     * 编辑短剧创作-项目
+     * 编辑项目
      */
     @Override
     public Map<String, Object> updateCrtDramaProject(CrtDramaProject crtDramaProject) {
 
+        Long project_id = crtDramaProject.getDrama_project_id();
+        CrtDramaProject projectDetail = crtDramaProjectDao.selectById(project_id);
+        if (projectDetail == null)  throw new CustException("项目不存在");
+
+        // 是否 [项目] 拥有者,权限:
+        // - 编辑自己的 (需 36.1.4.1 权限)
+        // - 编辑自己及他人的 (需要 36.1.4 权限或超级管理员)
+        Boolean isOwner = projectDetail.getUser_id() == SecurityUtil.getUserId();
+        if (isOwner && !securityUtil.hasPermissions(Arrays.asList("36.1.4", "36.1.4.1"), MatchType.OR)) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        if (!isOwner && !securityUtil.hasPermission("36.1.4")) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        // ---------------------------------------------------------------------------
 
+        // [DB] 更新项目
+        crtDramaProjectDao.update(crtDramaProject, new LambdaQueryWrapper<CrtDramaProject>()
+                .eq(CrtDramaProject::getId, crtDramaProject.getDrama_project_id()));
+        return Map.of("drama_project_id", crtDramaProject.getDrama_project_id());
 
-
-
-        // 有问题,还要判断自己是否具备 36.1.4.1 权限呢
-
-        // 判断项目是否存在,并且是否具备操作权限
-        crtUtil.checkProject(crtDramaProject.getDrama_project_id(), "36.1.4");
-
+    }
 
 
 
 
-        // [DB] 更新项目
-        crtDramaProjectDao.update(crtDramaProject, new LambdaQueryWrapper<CrtDramaProject>()
-                .eq(CrtDramaProject::getId, crtDramaProject.getDrama_project_id()));
-        return Map.of("drama_project_id", crtDramaProject.getDrama_project_id());
+    /**
+     * 编辑项目生图/生视频配置
+     */
+    @Override
+    public Map<String, Object> updateDramaProjectSettings(CrtDramaProjectSettings crtDramaProjectSettings) {
+
+        Long project_id = crtDramaProjectSettings.getDrama_project_id();
+        CrtDramaProject projectDetail = crtDramaProjectDao.selectById(project_id);
+        if (projectDetail == null)  throw new CustException("项目不存在");
+
+        // 是否 [项目] 拥有者,权限:
+        // - 编辑自己的 (需 36.2.3.1 权限)
+        // - 编辑自己及他人的 (需要 36.2.3 权限或超级管理员)
+        Boolean isOwner = projectDetail.getUser_id() == SecurityUtil.getUserId();
+        if (isOwner && !securityUtil.hasPermissions(Arrays.asList("36.2.3", "36.2.3.1"), MatchType.OR)) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        if (!isOwner && !securityUtil.hasPermission("36.2.3")) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        // ---------------------------------------------------------------------------
+
+        // 项目配置类型 (1: 生图配置, 2: 生视频配置)
+        Integer setting_type = crtDramaProjectSettings.getDrama_project_setting_type();
+
+        // 查询条件
+        LambdaQueryWrapper<CrtDramaProjectSettings> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CrtDramaProjectSettings::getDrama_project_id, crtDramaProjectSettings.getDrama_project_id());
+        wrapper.eq(CrtDramaProjectSettings::getDrama_project_setting_type, setting_type);
+
+        // 更新字段
+        CrtDramaProjectSettings entity = new CrtDramaProjectSettings();
+        entity.setAspect_ratio(crtDramaProjectSettings.getAspect_ratio());
+
+        // 生图配置:基础模型、风格LoRA、风格LoRA强度
+        if (setting_type == 1) {
+            entity.setModel_id(crtDramaProjectSettings.getModel_id());
+            entity.setLora_style_id(crtDramaProjectSettings.getLora_style_id());
+            entity.setLora_style_strength(crtDramaProjectSettings.getLora_style_strength());
+        }
+
+        crtDramaProjectSettingsDao.update(entity, wrapper);
+        return Map.of("drama_project_id", crtDramaProjectSettings.getDrama_project_id());
 
     }
 
+
     /**
-     * 删除短剧创作-项目
+     * 删除项目
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> deleteCrtDramaProject(CrtDramaProject crtDramaProject) {
 
-        // 判断项目是否存在,并且是否具备操作权限
-        crtUtil.checkProject(crtDramaProject.getDrama_project_id(), "36.1.6");
+        Long project_id = crtDramaProject.getDrama_project_id();
+        CrtDramaProject projectDetail = crtDramaProjectDao.selectById(project_id);
+        if (projectDetail == null)  throw new CustException("项目不存在");
+
+        // 是否 [项目] 拥有者,权限:
+        // - 编辑自己的 (需 36.1.6.1 权限)
+        // - 编辑自己及他人的 (需要 36.1.6 权限或超级管理员)
+        Boolean isOwner = projectDetail.getUser_id() == SecurityUtil.getUserId();
+        if (isOwner && !securityUtil.hasPermissions(Arrays.asList("36.1.6", "36.1.6.1"), MatchType.OR)) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        if (!isOwner && !securityUtil.hasPermission("36.1.6")) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        // ---------------------------------------------------------------------------
 
         // [DB] 删除 [项目],同时删除 [项目配置]、[项目分集/分镜]
-        Long project_id = crtDramaProject.getDrama_project_id();
         crtDramaProjectDao.delete(new LambdaQueryWrapper<CrtDramaProject>().eq(CrtDramaProject::getId, project_id));
         crtDramaProjectSettingsDao.delete(new LambdaQueryWrapper<CrtDramaProjectSettings>()
             .eq(CrtDramaProjectSettings::getDrama_project_id, project_id));

+ 26 - 48
src/main/java/com/backendsys/modules/crt/service/impl/CrtDramaProjectStoryboardServiceImpl.java

@@ -3,6 +3,7 @@ package com.backendsys.modules.crt.service.impl;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.security.enums.SecurityEnum;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
+import com.backendsys.modules.common.enums.MatchType;
 import com.backendsys.modules.crt.dao.CrtDramaProjectDao;
 import com.backendsys.modules.crt.dao.CrtDramaProjectSettingsDao;
 import com.backendsys.modules.crt.dao.CrtDramaProjectStoryboardDao;
@@ -11,12 +12,11 @@ import com.backendsys.modules.crt.entity.CrtDramaProjectSettings;
 import com.backendsys.modules.crt.entity.CrtDramaProjectStoryboard;
 import com.backendsys.modules.crt.entity.StoryboardResponse;
 import com.backendsys.modules.crt.service.CrtDramaProjectStoryboardService;
-import com.backendsys.modules.crt.utils.CrtUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.LinkedHashMap;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -24,8 +24,6 @@ import java.util.stream.Collectors;
 @Service
 public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStoryboardService {
 
-    @Autowired
-    private CrtUtil crtUtil;
     @Autowired
     private SecurityUtil securityUtil;
     @Autowired
@@ -36,7 +34,7 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
     private CrtDramaProjectStoryboardDao crtDramaProjectStoryboardDao;
 
     /**
-     * 获取分镜详情
+     * 获取分集信息/分镜列表
      */
     @Override
     public StoryboardResponse selectCrtDramaProjectStoryboardDetail(CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
@@ -52,6 +50,9 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
         wrapperStoryboard.eq(CrtDramaProjectStoryboard::getEpisode_num, episode_num);
         List<CrtDramaProjectStoryboard> storyboardList = crtDramaProjectStoryboardDao.selectList(wrapperStoryboard);
         if (storyboardList.isEmpty()) throw new CustException("分镜不存在");
+        System.out.println("project_id = " + project_id);
+        System.out.println("episode_num = " + episode_num);
+        System.out.println("storyboardList = " + storyboardList);
 
         // 查询项目设置
         LambdaQueryWrapper<CrtDramaProjectSettings> wrapperSettings = new LambdaQueryWrapper<>();
@@ -82,7 +83,7 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
     }
 
     /**
-     * 创建分
+     * 创建分
      */
     @Override
     public Map<String, Object> createStoryboard(CrtDramaProject crtDramaProject) {
@@ -90,7 +91,6 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
         Long user_id = crtDramaProject.getUser_id();
         Long drama_project_id = crtDramaProject.getDrama_project_id();
         Integer episode_num = crtDramaProject.getEpisode_num();
-        Integer sort = 1;
 
         // 判断 项目 是否存在
         LambdaQueryWrapper<CrtDramaProject> wrapperDramaProject = new LambdaQueryWrapper<>();
@@ -110,65 +110,43 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
         entity.setUser_id(user_id);
         entity.setDrama_project_id(drama_project_id);
         entity.setEpisode_num(episode_num);
-        entity.setSort(sort);
+        entity.setSort(1);
         crtDramaProjectStoryboardDao.insert(entity);
 
         return Map.of("id", entity.getId());
     }
 
 
-    /**
-     * 编辑项目生图/生视频配置
-     */
-    @Override
-    public Map<String, Object> updateStoryboardSettings(CrtDramaProjectSettings crtDramaProjectSettings) {
-
-        // 判断项目是否存在,并且是否具备操作权限(全权限)
-        crtUtil.checkProject(crtDramaProjectSettings.getDrama_project_id(), "36.2.3");
-
-        // 项目配置类型 (1: 生图配置, 2: 生视频配置)
-        Integer setting_type = crtDramaProjectSettings.getDrama_project_setting_type();
-
-        // 查询条件
-        LambdaQueryWrapper<CrtDramaProjectSettings> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(CrtDramaProjectSettings::getDrama_project_id, crtDramaProjectSettings.getDrama_project_id());
-        wrapper.eq(CrtDramaProjectSettings::getDrama_project_setting_type, setting_type);
-
-        // 更新字段
-        CrtDramaProjectSettings entity = new CrtDramaProjectSettings();
-        entity.setAspect_ratio(crtDramaProjectSettings.getAspect_ratio());
-
-        // 生图配置:基础模型、风格LoRA、风格LoRA强度
-        if (setting_type == 1) {
-            entity.setModel_id(crtDramaProjectSettings.getModel_id());
-            entity.setLora_style_id(crtDramaProjectSettings.getLora_style_id());
-            entity.setLora_style_strength(crtDramaProjectSettings.getLora_style_strength());
-        }
-
-        crtDramaProjectSettingsDao.update(entity, wrapper);
-        return Map.of("drama_project_id", crtDramaProjectSettings.getDrama_project_id());
-    }
-
-
     /**
      * 编辑分镜
+     *
      */
     @Override
     public Map<String, Object> updateStoryboard(CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
 
-        // 判断分镜是否存在
-        Long drama_project_storyboard_id = crtDramaProjectStoryboard.getDrama_project_storyboard_id();
-        CrtDramaProjectStoryboard storyboardDetail = crtDramaProjectStoryboardDao.selectById(drama_project_storyboard_id);
+        Long storyboard_id = crtDramaProjectStoryboard.getDrama_project_storyboard_id();
+        CrtDramaProjectStoryboard storyboardDetail = crtDramaProjectStoryboardDao.selectById(storyboard_id);
         if (storyboardDetail == null) throw new CustException("分镜不存在");
 
-        // 判断用户是否具备操作权限(全权限)
-        crtUtil.checkByUser(crtDramaProjectStoryboard.getUser_id(), "36.2.4");
+        // 是否 [分镜] 拥有者,权限:
+        // - 编辑自己的 (需 36.2.4.1 权限)
+        // - 编辑自己及他人的 (需要 36.2.4 权限或超级管理员)
+        Boolean isOwner = storyboardDetail.getUser_id() == SecurityUtil.getUserId();
+        if (isOwner && !securityUtil.hasPermissions(Arrays.asList("36.2.4", "36.2.4.1"), MatchType.OR)) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        if (!isOwner && !securityUtil.hasPermission("36.2.4")) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+        // ---------------------------------------------------------------------------
+
+        // [DB] 更新分镜
+        // crtDramaProjectStoryboardDao.updateStoryboard(crtDramaProjectStoryboard);
 
 
-        // 权限还没好
 
 
-        return Map.of("drama_project_storyboard_id", drama_project_storyboard_id);
+        return Map.of("drama_project_storyboard_id", crtDramaProjectStoryboard.getDrama_project_storyboard_id());
     }
 
 }

+ 0 - 39
src/main/java/com/backendsys/modules/crt/utils/CrtUtil.java

@@ -1,39 +0,0 @@
-package com.backendsys.modules.crt.utils;
-
-import com.backendsys.exception.CustException;
-import com.backendsys.modules.common.config.security.enums.SecurityEnum;
-import com.backendsys.modules.common.config.security.utils.SecurityUtil;
-import com.backendsys.modules.crt.dao.CrtDramaProjectDao;
-import com.backendsys.modules.crt.entity.CrtDramaProject;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CrtUtil {
-
-    @Autowired
-    private SecurityUtil securityUtil;
-    @Autowired
-    private CrtDramaProjectDao crtDramaProjectDao;
-
-    /**
-     * 判断项目是否存在,并且是否具备操作权限 (不是拥有者,又不具备[全权限],则不允许操作)
-     */
-    public void checkProject(Long project_id, String permission) {
-        CrtDramaProject detail = crtDramaProjectDao.selectById(project_id);
-        if (detail == null)  throw new CustException("项目不存在");
-        if (detail.getUser_id() != SecurityUtil.getUserId() && !securityUtil.hasPermission(permission)) {
-            throw new CustException(SecurityEnum.NOAUTH);
-        }
-    }
-
-    /**
-     * 判断用户是否具备操作权限 (不是拥有者,又不具备[全权限],则不允许操作)
-     */
-    public void checkByUser(Long user_id, String permission) {
-        if (user_id != SecurityUtil.getUserId() && !securityUtil.hasPermission(permission)) {
-            throw new CustException(SecurityEnum.NOAUTH);
-        }
-    }
-
-}

+ 7 - 7
src/main/java/com/backendsys/modules/upload/controller/SysFileController.java

@@ -98,17 +98,17 @@ public class SysFileController {
         SysFile querySysFile = sysFileService.getOne(new LambdaQueryWrapper<SysFile>().eq(SysFile::getObject_key, object_key));
         if (querySysFile == null) throw new CustException("文件不存在");
 
-        // 权限:
-        // - 删除自己 (需权限) (1.1.6)
-        // - 删除其他人 (需要子权限或超级管理员) (1.1.5)
-        Long my_user_id = SecurityUtil.getUserId();
-        Long file_user_id = querySysFile.getUser_id();
-        if (file_user_id.equals(my_user_id) && !securityUtil.hasPermissions(Arrays.asList("1.1.5", "1.1.6"), MatchType.OR)) {
+        // 是否 [文件] 拥有者,权限:
+        // - 删除自己的 (需 1.1.6 权限)
+        // - 删除自己及他人的 (需要 1.1.5 权限或超级管理员)
+        Boolean isOwner = querySysFile.getUser_id() == SecurityUtil.getUserId();
+        if (isOwner && !securityUtil.hasPermissions(Arrays.asList("1.1.5", "1.1.6"), MatchType.OR)) {
             throw new CustException(SecurityEnum.NOAUTH);
         }
-        if (!file_user_id.equals(my_user_id) && !securityUtil.hasPermission("1.1.5")) {
+        if (!isOwner && !securityUtil.hasPermission("1.1.5")) {
             throw new CustException(SecurityEnum.NOAUTH);
         }
+        // ---------------------------------------------------------------------------
 
         return Result.success().put("data", sysFileService.removeUploadFile(sysFile, querySysFile));
     }

+ 71 - 0
src/main/resources/mapper/crt/drama/CrtDramaProjectStoryboardDao.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.backendsys.modules.crt.dao.CrtDramaProjectStoryboardDao">
+
+
+
+    <!-- 编辑 用户角色 -->
+    <update id="updateStoryboard" parameterType="com.backendsys.modules.crt.entity.CrtDramaProjectStoryboard">
+        UPDATE crt_drama_project_storyboard SET
+        <trim suffixOverrides="," suffix=" ">
+            <if test="sort != null and sort != ''">sort = #{sort},</if>
+            <if test="story_prompt != null and story_prompt != ''">story_prompt = #{story_prompt},</if>
+            <if test="story_framing != null and story_framing != ''">story_framing = #{story_framing},</if>
+            <if test="story_scene != null and story_scene != ''">story_scene = #{story_scene},</if>
+            <if test="story_weather_time != null and story_weather_time != ''">story_weather_time = #{story_weather_time},</if>
+            <if test="lora_figure_ids != null and lora_figure_ids != ''">lora_figure_ids = #{lora_figure_ids},</if>
+<!--            <if test="role_description != null and role_description != ''">role_description = #{role_description},</if>-->
+<!--            <if test="sort != null and sort != ''">sort = #{sort},</if>-->
+<!--            <if test="status != null and status != ''">status = #{status},</if>-->
+        </trim>
+        WHERE id = #{drama_project_storyboard_id}
+    </update>
+
+
+
+<!--    <sql id="includeCrtDramaProject">-->
+<!--        p.id,-->
+<!--        p.id drama_project_id,-->
+<!--        p.user_id,-->
+<!--        p.project_name,-->
+<!--        COALESCE(p.drama_lora_style_id, '') drama_lora_style_id,-->
+<!--        COALESCE(p.drama_lora_character_ids, '') drama_lora_character_ids,-->
+<!--        p.create_user_id,-->
+<!--        p.create_time,-->
+<!--        p.update_time-->
+<!--    </sql>-->
+
+<!--    <resultMap id="resultMapCrtDramaProject" type="java.util.LinkedHashMap">-->
+<!--        <id property="id" column="id" jdbcType="BIGINT" />-->
+<!--        <result property="drama_project_id" column="drama_project_id" javaType="java.lang.Long" />-->
+<!--        <result property="user_id" column="user_id" javaType="java.lang.Long" />-->
+<!--        <result property="project_name" column="project_name" />-->
+<!--        <result property="storyboard_episode_nums" column="storyboard_episode_nums" javaType="java.util.List"-->
+<!--                jdbcType="VARCHAR" typeHandler="com.backendsys.config.Mybatis.handler.StringToListTypeHandler" />-->
+<!--        <result property="drama_lora_style_id" column="drama_lora_style_id" javaType="java.lang.Long" />-->
+<!--        <result property="drama_lora_character_ids" column="drama_lora_character_ids" />-->
+<!--        <result property="create_user_id" column="create_user_id" />-->
+<!--        <result property="create_time" column="create_time" />-->
+<!--        <result property="update_time" column="update_time" />-->
+<!--    </resultMap>-->
+
+<!--    &lt;!&ndash; 查 列表 &ndash;&gt;-->
+<!--    <select id="selectCrtDramaProjectList" resultMap="resultMapCrtDramaProject">-->
+<!--        SELECT-->
+<!--            <include refid="includeCrtDramaProject" />,-->
+<!--            GROUP_CONCAT(ps.episode_num ORDER BY ps.episode_num) AS storyboard_episode_nums-->
+<!--        FROM crt_drama_project p-->
+<!--        LEFT JOIN crt_drama_project_storyboard ps ON p.id = ps.drama_project_id-->
+<!--        <where>-->
+<!--            <if test="user_id != null and user_id != ''">-->
+<!--                AND p.user_id = #{user_id}-->
+<!--            </if>-->
+<!--            <if test="project_name != null and project_name != ''">-->
+<!--                AND p.project_name LIKE CONCAT('%', #{project_name}, '%')-->
+<!--            </if>-->
+<!--        </where>-->
+<!--        GROUP BY p.id-->
+<!--        ORDER BY p.create_time DESC-->
+<!--    </select>-->
+
+</mapper>