Procházet zdrojové kódy

新增更改分集道具列表功能

lh před 1 dnem
rodič
revize
a4b8bac9e8

+ 7 - 0
app/Http/Controllers/Anime/AnimeController.php

@@ -223,6 +223,13 @@ class AnimeController extends BaseController
         return $this->success(['success'=>$result ? 1 : 0]);
     }
 
+    // 修改分集道具列表
+    public function changeEpisodeProps(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->changeEpisodeProps($data);
+        return $this->success(['success'=>$result ? 1 : 0]);
+    }
+
     // 编辑分镜剧本
     public function editSegment(Request $request) {
         $data = $request->all();

+ 214 - 0
app/Services/Anime/AnimeService.php

@@ -1473,6 +1473,220 @@ class AnimeService
         return true;
     }
 
+    public function changeEpisodeProps($data) {
+        $anime_id = getProp($data, 'anime_id');
+        $episode_id = getProp($data, 'episode_id');
+        $target_props = getProp($data, 'props');
+        $is_deleted = getProp($data, 'is_deleted', 0);
+
+        // 参数验证
+        if (!$anime_id) Utils::throwError('20003:请提供动漫ID');
+        if (!$episode_id) Utils::throwError('20003:请提供剧集ID');
+        if (!$target_props) Utils::throwError('20003:请提供道具信息');
+
+        // 验证剧集是否存在
+        $episode = DB::table('mp_anime_episodes')
+            ->where('anime_id', $anime_id)
+            ->where('id', $episode_id)
+            ->first();
+        
+        if (!$episode) Utils::throwError('20003:该剧集不存在');
+        $props = json_decode(getProp($episode, 'props'), true);
+
+        // 获取anime信息,检查是否有关联的script_id
+        $anime = DB::table('mp_animes')->where('id', $anime_id)->first();
+        if (!$anime) Utils::throwError('20003:动漫不存在');
+        
+        $script_id = getProp($anime, 'script_id');
+        $episode_number = getProp($episode, 'episode_number', 1);
+        $uid = Site::getUid();
+        $cpid = Site::getCpid();
+
+        try {
+            $target_prop_name = getProp($target_props, 'prop');
+            
+            // 如果是删除操作
+            if ($is_deleted == 1) {
+                // 从道具列表中移除该道具
+                $props = array_values(array_filter($props, function($prop) use ($target_prop_name) {
+                    return getProp($prop, 'prop') !== $target_prop_name;
+                }));
+                
+                // 更新道具列表
+                $result = DB::table('mp_anime_episodes')
+                    ->where('anime_id', $anime_id)
+                    ->where('id', $episode_id)
+                    ->update([
+                        'props' => json_encode($props, 256),
+                        'updated_at' => date('Y-m-d H:i:s')
+                    ]);
+
+                if ($result === false) {
+                    Utils::throwError('20003:删除道具失败');
+                }
+            } else {
+                // 新增或更新操作
+                $prop_found = false;
+                $is_new_prop = false;
+                
+                // 查找并更新已存在的道具
+                foreach($props as &$prop) {
+                    if (getProp($prop, 'prop') === $target_prop_name) {
+                        $prop = $target_props;
+                        $prop_found = true;
+                        break;
+                    }
+                }
+                
+                // 如果道具不存在,则新增
+                if (!$prop_found) {
+                    $props[] = $target_props;
+                    $is_new_prop = true;
+                }
+
+                // 更新道具列表
+                $result = DB::table('mp_anime_episodes')
+                    ->where('anime_id', $anime_id)
+                    ->where('id', $episode_id)
+                    ->update([
+                        'props' => json_encode($props, 256),
+                        'updated_at' => date('Y-m-d H:i:s')
+                    ]);
+
+                if ($result === false) {
+                    Utils::throwError('20003:更新道具列表失败');
+                }
+
+                // 如果有关联的script_id,则同步到mp_products表
+                if ($script_id) {
+                    // 查询剧本信息
+                    $script = DB::table('mp_scripts')
+                        ->where('id', $script_id)
+                        ->where('is_deleted', 0)
+                        ->first();
+                    
+                    if ($script) {
+                        $script_name = $script->script_name ?? 'script_' . $script_id;
+                        $product_name = getProp($target_props, 'prop');
+                        $pic_prompt = getProp($target_props, 'pic_prompt', '');
+                        $url = getProp($target_props, 'url', '');
+                        $product_type = 3; // 3=道具
+                        
+                        // 查找或创建以script_name命名的文件夹
+                        $folder = DB::table('mp_products')
+                            ->where('cpid', $cpid)
+                            ->where('type', 2) // 文件夹类型
+                            ->where('product', $product_type) // 道具类型
+                            ->where('product_name', $script_name)
+                            ->where('parent_id', 0)
+                            ->where('is_deleted', 0)
+                            ->first();
+                        
+                        if (!$folder) {
+                            // 创建文件夹
+                            $folder_id = DB::table('mp_products')->insertGetId([
+                                'user_id' => $uid,
+                                'cpid' => $cpid,
+                                'type' => 2, // 文件夹
+                                'product' => $product_type, // 道具类型
+                                'parent_id' => 0,
+                                'level' => 1,
+                                'product_name' => $script_name,
+                                'sort_order' => time(),
+                                'is_deleted' => 0,
+                                'created_at' => date('Y-m-d H:i:s'),
+                                'updated_at' => date('Y-m-d H:i:s')
+                            ]);
+                        } else {
+                            $folder_id = $folder->id;
+                        }
+                        
+                        // 查找该文件夹下是否已存在同名资产
+                        $existing_product = DB::table('mp_products')
+                            ->where('cpid', $cpid)
+                            ->where('type', 1) // 资产类型
+                            ->where('product', $product_type)
+                            ->where('parent_id', $folder_id)
+                            ->where('product_name', $product_name)
+                            ->where('is_deleted', 0)
+                            ->first();
+                        
+                        if ($existing_product) {
+                            // 更新已存在的资产
+                            $updateData = [
+                                'pic_task_status' => '生成成功'
+                            ];
+                            if ($pic_prompt) $updateData['pic_prompt'] = $pic_prompt;
+                            if ($url) $updateData['url'] = $url;
+                            
+                            // 处理versions字段
+                            $versions = getProp($target_props, 'versions', []);
+                            if ($versions && is_array($versions)) {
+                                $updateData['versions'] = json_encode($versions, 256);
+                            }
+                            
+                            $updateData['updated_at'] = date('Y-m-d H:i:s');
+                            
+                            DB::table('mp_products')
+                                ->where('id', $existing_product->id)
+                                ->update($updateData);
+                            
+                            $product_id = $existing_product->id;
+                        } else {
+                            // 创建新资产
+                            $versions = getProp($target_props, 'versions', []);
+                            
+                            $product_id = DB::table('mp_products')->insertGetId([
+                                'user_id' => $uid,
+                                'cpid' => $cpid,
+                                'type' => 1, // 资产
+                                'product' => $product_type, // 道具
+                                'parent_id' => $folder_id,
+                                'level' => 2,
+                                'product_name' => $product_name,
+                                'url' => $url,
+                                'pic_prompt' => $pic_prompt,
+                                'versions' => is_array($versions) ? json_encode($versions, 256) : '[]',
+                                'sort_order' => time(),
+                                'is_deleted' => 0,
+                                'pic_task_status' => '生成成功',
+                                'created_at' => date('Y-m-d H:i:s'),
+                                'updated_at' => date('Y-m-d H:i:s')
+                            ]);
+                        }
+                        
+                        // 建立或更新绑定关系
+                        $existing_mapping = DB::table('mp_script_product_mappings')
+                            ->where('script_id', $script_id)
+                            ->where('product_id', $product_id)
+                            ->where('episode_number', $episode_number)
+                            ->first();
+                        
+                        if (!$existing_mapping) {
+                            // 创建绑定关系
+                            DB::table('mp_script_product_mappings')->insert([
+                                'script_id' => $script_id,
+                                'product_id' => $product_id,
+                                'episode_number' => $episode_number,
+                                'created_at' => date('Y-m-d H:i:s'),
+                                'updated_at' => date('Y-m-d H:i:s')
+                            ]);
+                        }
+                    }
+                }
+            }
+        } catch (\Exception $e) {
+            dLog('anime')->error('更新剧集道具失败', [
+                'anime_id' => $anime_id,
+                'episode_id' => $episode_id,
+                'error' => $e->getMessage()
+            ]);
+            Utils::throwError('20003:更新道具列表失败 ' . $e->getMessage());
+        }
+
+        return true;
+    }
+
     public function editSegment($data) {
         $segment_id = getProp($data, 'segment_id');
         $segment_content = getProp($data, 'segment_content');

+ 1 - 0
routes/api.php

@@ -168,6 +168,7 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
             Route::get('bindEpisodeVersion', [AnimeController::class, 'bindEpisodeVersion']);       // 绑定剧集版本
             Route::post('changeEpisodeRoles', [AnimeController::class, 'changeEpisodeRoles']);      // 更改分集主体列表
             Route::post('changeEpisodeScenes', [AnimeController::class, 'changeEpisodeScenes']);    // 更改分集场景列表
+            Route::post('changeEpisodeProps', [AnimeController::class, 'changeEpisodeProps']);      // 更改分集道具列表
             Route::post('editSegment', [AnimeController::class, 'editSegment']);                    // 编辑分镜
             Route::post('batchUploadImg', [ImageGenerationController::class, 'batchUploadImg']);    // 批量上传图片
             Route::post('batchSetRoleImg', [AnimeController::class, 'batchSetRoleImg']);            // 批量生成角色形象