Kaynağa Gözat

生成剧本扣除积分适配普通模式

lh 1 ay önce
ebeveyn
işleme
45ce349af4
1 değiştirilmiş dosya ile 47 ekleme ve 10 silme
  1. 47 10
      app/Services/DeepSeek/DeepSeekService.php

+ 47 - 10
app/Services/DeepSeek/DeepSeekService.php

@@ -3854,6 +3854,11 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         }
         $is_multi = getProp($anime, 'is_multi');
         $is_single = (int)$is_multi !== 1;
+
+        // 积分余额预检(仅单剧集模式收费)
+        if ($is_single) {
+            $this->pointsService->checkUserPointsEnough(PointsService::CHAT_CHARGE_POINTS, $uid);
+        }
         $question = getProp($data, 'question', $is_single ? "请根据实例格式完成单剧集剧本及分镜\n" : "请根据实例格式完成剧本大纲\n");
         if ($prompt) {
             $question .= "本次修改要求如下:\n{$prompt}";
@@ -4505,11 +4510,19 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                     ]
                 ];
 
-                $boolen4 = DB::table('mp_anime_records')->insert($episode_records);
-                if (!$boolen4) {
-                    Utils::throwError('20003:单剧集分镜记录保存失败');
-                }
-            }
+                        $boolen4 = DB::table('mp_anime_records')->insert($episode_records);
+                        if (!$boolen4) {
+                            Utils::throwError('20003:单剧集分镜记录保存失败');
+                        }
+                        
+                        // 单剧集模式调用成功,返回结果前扣除积分并记录明细(与保存同事务)
+                        if ($is_single && !empty($single_episode)) {
+                            $this->chargeChatSuccess($uid, $this->pointsService->getTokensFromUsage($usage), [
+                                'anime_id' => $anime_id,
+                                'episode_id' => $episode_id ?? 0,
+                            ]);
+                        }
+                    }
         }catch (\Exception $e) {
             DB::rollBack();
             dLog('deepseek')->info('新建对话错误信息: '.$e->getMessage());
@@ -4584,6 +4597,11 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         }
         $is_multi = getProp($anime, 'is_multi', 1);
         $is_single = (int)$is_multi !== 1;
+
+        // 积分余额预检(仅单剧集模式收费)
+        if ($is_single) {
+            $this->pointsService->checkUserPointsEnough(PointsService::CHAT_CHARGE_POINTS, $uid);
+        }
         
         // 单剧集模式下,如果已经生成了剧集,则不允许继续调整大纲
         if ($is_single) {
@@ -5300,11 +5318,19 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                     ]
                 ];
 
-                $boolen4 = DB::table('mp_anime_records')->insert($episode_records);
-                if (!$boolen4) {
-                    Utils::throwError('20003:单剧集分镜记录保存失败');
-                }
-            }
+                        $boolen4 = DB::table('mp_anime_records')->insert($episode_records);
+                        if (!$boolen4) {
+                            Utils::throwError('20003:单剧集分镜记录保存失败');
+                        }
+                        
+                        // 单剧集模式调用成功,返回结果前扣除积分并记录明细(与保存同事务)
+                        if ($is_single && !empty($single_episode)) {
+                            $this->chargeChatSuccess($uid, $this->pointsService->getTokensFromUsage($usage), [
+                                'anime_id' => $anime_id,
+                                'episode_id' => $episode_id ?? 0,
+                            ]);
+                        }
+                    }
             
         }catch (\Exception $e) {
             DB::rollBack();
@@ -5350,6 +5376,10 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
 
     public function chat($data) {
         $uid = Site::getUid();
+
+        // 积分余额预检(不足直接报错)
+        $this->pointsService->checkUserPointsEnough(PointsService::CHAT_CHARGE_POINTS, $uid);
+
         $anime_id = getProp($data, 'anime_id');
         $file = getProp($data, 'file');
         $content = getProp($data, 'content', '');
@@ -6061,6 +6091,13 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             }
             
             DB::table('mp_animes')->where('id', $anime_id)->update($update_anime_data);
+
+            // 调用成功,返回结果前扣除积分并记录明细(与保存同事务)
+            $this->chargeChatSuccess($uid, $this->pointsService->getTokensFromUsage($usage), [
+                'anime_id' => $anime_id,
+                'episode_number' => $episode_number,
+                'model' => $model,
+            ]);
         }catch (\Exception $e) {
             DB::rollBack();
             dLog('deepseek')->info('新建对话错误信息: '.$e->getMessage());