lh преди 1 месец
родител
ревизия
1e5a20d67e
променени са 1 файла, в които са добавени 54 реда и са изтрити 16 реда
  1. 54 16
      app/Services/Anime/AnimeService.php

+ 54 - 16
app/Services/Anime/AnimeService.php

@@ -6831,13 +6831,13 @@ class AnimeService
         // 根据is_public参数确定存储的user_id(公共库user_id=0,cpid保持不变)
         $store_uid = $is_public ? 0 : $uid;
         
-        // 新增参数:剧本ID和剧集序号(多个序号用英文逗号隔开)
+        // 新增参数:剧本ID和剧集序号(支持数组传参,多个序号也可用英文逗号隔开)
         $script_id = (int)getProp($data, 'script_id', 0);
-        $episode_number = trim(getProp($data, 'episode_number', ''));
-        if ($script_id && $episode_number === '') {
+        $episode_numbers = $this->normalizeEpisodeNumbers(getProp($data, 'episode_number', []));
+        if ($script_id && empty($episode_numbers)) {
             Utils::throwError('20003:剧集序号不能为空');
         }
-        if (!$script_id && $episode_number !== '') {
+        if (!$script_id && !empty($episode_numbers)) {
             Utils::throwError('20003:请提供剧本ID');
         }
         
@@ -6910,7 +6910,7 @@ class AnimeService
             
             // 保存剧本资产关联关系
             if ($script_id) {
-                $this->saveProductScriptMapping($id, $script_id, $episode_number);
+                $this->saveProductScriptMapping($id, $script_id, $episode_numbers);
             }
             
             DB::commit();
@@ -6941,13 +6941,13 @@ class AnimeService
         $versions = getProp($data, 'versions');
         $is_public = getProp($data, 'is_public', 0); // 0=个人资产库 1=公共资产库
         
-        // 新增参数:剧本ID和剧集序号(多个序号用英文逗号隔开)
+        // 新增参数:剧本ID和剧集序号(支持数组传参,多个序号也可用英文逗号隔开)
         $script_id = (int)getProp($data, 'script_id', 0);
-        $episode_number = trim(getProp($data, 'episode_number', ''));
-        if ($script_id && $episode_number === '') {
+        $episode_numbers = $this->normalizeEpisodeNumbers(getProp($data, 'episode_number', []));
+        if ($script_id && empty($episode_numbers)) {
             Utils::throwError('20003:剧集序号不能为空');
         }
-        if (!$script_id && $episode_number !== '') {
+        if (!$script_id && !empty($episode_numbers)) {
             Utils::throwError('20003:请提供剧本ID');
         }
         
@@ -7082,7 +7082,7 @@ class AnimeService
             
             // 保存剧本资产关联关系
             if ($script_id) {
-                $this->saveProductScriptMapping($id, $script_id, $episode_number);
+                $this->saveProductScriptMapping($id, $script_id, $episode_numbers);
             }
             
             DB::commit();
@@ -7099,10 +7099,12 @@ class AnimeService
      *
      * @param int $product_id 资产ID
      * @param int $script_id 剧本ID
-     * @param string $episode_number_str 剧集序号,多个序号用英文逗号隔开(序号从1开始)
+     * @param array $episode_numbers 剧集序号数组(序号从1开始)
      * @return int 新增关联数量
      */
-    private function saveProductScriptMapping($product_id, $script_id, $episode_number_str) {
+    private function saveProductScriptMapping($product_id, $script_id, $episode_numbers) {
+        $uid = Site::getUid();
+        
         // 验证剧本是否存在
         $script = DB::table('mp_scripts')
             ->where('id', $script_id)
@@ -7113,15 +7115,23 @@ class AnimeService
             Utils::throwError('20003:剧本不存在');
         }
         
+        // 验证剧本归属:只能关联自己的剧本
+        if ((int)$script->user_id !== (int)$uid) {
+            Utils::throwError('20003:只能添加到自己的剧本');
+        }
+        
         // 使用 splitContent 拆分剧本内容获取总集数
         $totalEpisodes = $this->getScriptTotalEpisodeCount($script);
         
-        // 解析剧集序号(英文逗号分隔)
+        // 解析剧集序号(数组
         $episodes = [];
-        foreach (explode(',', $episode_number_str) as $item) {
-            $item = trim($item);
+        foreach ($episode_numbers as $item) {
+            if (is_array($item)) {
+                continue;
+            }
+            $item = trim((string)$item);
             if ($item === '' || !is_numeric($item)) {
-                Utils::throwError('20003:剧集序号格式不正确,多个序号请用英文逗号隔开');
+                Utils::throwError('20003:剧集序号格式不正确,仅支持数字数组或英文逗号分隔的数字');
             }
             $episodes[] = (int)$item;
         }
@@ -7171,6 +7181,34 @@ class AnimeService
     }
     
     /**
+     * 规范化剧集序号参数,统一为数组
+     * 兼容传入数组(如 [1, 3, 5])、逗号分隔字符串(如 "1,3,5")以及字符串数组(如 ["1,3", 5])
+     *
+     * @param mixed $episode_number 剧集序号参数
+     * @return array
+     */
+    private function normalizeEpisodeNumbers($episode_number) {
+        if (!is_array($episode_number)) {
+            $episode_number = explode(',', (string)$episode_number);
+        }
+        
+        $items = [];
+        foreach ($episode_number as $item) {
+            if (is_array($item)) {
+                continue;
+            }
+            foreach (explode(',', (string)$item) as $part) {
+                $part = trim($part);
+                if ($part !== '') {
+                    $items[] = $part;
+                }
+            }
+        }
+        
+        return $items;
+    }
+    
+    /**
      * 获取剧本总集数(通过 splitContent 拆分剧本内容)
      *
      * @param object $script 剧本记录