Files
fastmovieai/fastmovie-admin/plugin/shortplay/app/api/controller/SceneController.php
T
李建琦 eae151fd57 FastMovieAI AI短剧创作平台 二开基线
- 源码: xhadmincn/FastMovieAI (Apache 2.0)
- 二开: Docker部署, Swoole改Select, route.php修复, 补update/VERSION
- vendor/示例资源已gitignore
2026-08-26 18:37:36 +08:00

281 lines
10 KiB
PHP

<?php
namespace plugin\shortplay\app\api\controller;
use app\Basic;
use plugin\shortplay\app\model\PluginShortplayDrama;
use plugin\shortplay\app\model\PluginShortplayDramaScene;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboard;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardActor;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardProp;
use support\Request;
use support\think\Db;
class SceneController extends Basic
{
public function index(Request $request)
{
$drama_id = $request->get('drama_id');
$episode_id = $request->get('episode_id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
$PluginShortplayDramaScenes = PluginShortplayDramaScene::where(['drama_id' => $PluginShortplayDrama->id, 'episode_id' => $episode_id])->order('sort asc')->select();
return $this->resData($PluginShortplayDramaScenes);
}
public function updateSort(Request $request)
{
$drama_id = $request->post('drama_id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
$scenes = $request->post('scenes');
if (empty($scenes)) {
$id = $request->post('id');
$sort = $request->post('sort');
$PluginShortplayDramaScene = PluginShortplayDramaScene::where(['drama_id' => $PluginShortplayDrama->id, 'id' => $id])->find();
if (!$PluginShortplayDramaScene) {
return $this->fail('场景不存在');
}
$PluginShortplayDramaScene->sort = $sort;
$PluginShortplayDramaScene->save();
} else {
Db::startTrans();
try {
foreach ($scenes as $scene) {
$PluginShortplayDramaScene = PluginShortplayDramaScene::where(['drama_id' => $PluginShortplayDrama->id, 'id' => $scene['id']])->find();
if (!$PluginShortplayDramaScene) {
continue;
}
$PluginShortplayDramaScene->sort = $scene['sort'];
$PluginShortplayDramaScene->save();
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return $this->fail($th->getMessage());
}
}
return $this->success('更新成功');
}
public function copyScene(Request $request)
{
$drama_id = $request->post('drama_id');
$episode_id = $request->post('episode_id');
$scene_id = $request->post('scene_id');
// 校验短剧
$PluginShortplayDrama = PluginShortplayDrama::where([
'id' => $drama_id,
'uid' => $request->uid
])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
// 校验原场景
$origin = PluginShortplayDramaScene::where([
'drama_id' => $drama_id,
'id' => $scene_id
])->find();
if (!$origin) {
return $this->fail('原场景不存在');
}
Db::startTrans();
try {
// 3. 插入复制后的场景
unset($origin['id']); // 删除原场景ID
$origin['sort'] = PluginShortplayDramaScene::where(['drama_id' => $drama_id, 'episode_id' => $episode_id])->max('sort') + 1 ?? 1;
$origin['create_time'] = time();
$origin['update_time'] = time();
$origin['episode_id'] = $episode_id;
$PluginShortplayDramaScene = new PluginShortplayDramaScene;
$PluginShortplayDramaScene->save($origin);
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return $this->fail($th->getMessage());
}
return $this->resData($PluginShortplayDramaScene);
}
public function deleteScene(Request $request)
{
$drama_id = $request->post('drama_id');
$episode_id = $request->post('episode_id');
$id = $request->post('id');
// 校验短剧是否存在
$PluginShortplayDrama = PluginShortplayDrama::where([
'id' => $drama_id,
'uid' => $request->uid
])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
if ($id) {
// 校验场景是否存在
$PluginShortplayDramaScene = PluginShortplayDramaScene::where([
'id' => $id,
'drama_id' => $drama_id,
'episode_id' => $episode_id
])->find();
if (!$PluginShortplayDramaScene) {
return $this->fail('场景不存在');
}
}
Db::startTrans();
try {
if ($id) {
// 1. 删除该场景
PluginShortplayDramaScene::where([
'id' => $id,
'drama_id' => $drama_id
])->delete();
PluginShortplayDramaStoryboard::where([
'drama_id' => $drama_id,
'scene_id' => $PluginShortplayDramaScene->id
])->update(['scene_id' => null]);
// 2. 重新拉取该 episode 的所有场景并重排 sort
$PluginShortplayDramaScenes = PluginShortplayDramaScene::where([
'drama_id' => $drama_id,
'episode_id' => $episode_id
])
->order('sort asc')
->select()
->toArray();
$sort = 1;
foreach ($PluginShortplayDramaScenes as $sb) {
PluginShortplayDramaScene::where(['id' => $sb['id']])
->update(['sort' => $sort++]);
}
} else {
$PluginShortplayDramaScenes = PluginShortplayDramaScene::where(['drama_id' => $drama_id, 'episode_id' => $episode_id])->order('sort asc')->select();
foreach ($PluginShortplayDramaScenes as $scene) {
PluginShortplayDramaStoryboard::where(['drama_id' => $drama_id, 'scene_id' => $scene->id])->update(['scene_id' => null]);
$scene->delete();
}
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return $this->fail($th->getMessage());
}
return $this->success('删除成功');
}
public function insertAfter(Request $request)
{
$drama_id = $request->post('drama_id');
$episode_id = $request->post('episode_id');
$after_id = $request->post('after_id');
$drama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$drama) {
return $this->fail('短剧不存在');
}
$afterSort = 0;
if ($after_id) {
$after = PluginShortplayDramaScene::where([
'drama_id' => $drama->id,
'id' => $after_id,
'episode_id' => $episode_id
])->find();
if (!$after) {
return $this->fail('指定的场景不存在');
}
$afterSort = $after->sort;
}
Db::startTrans();
try {
// 从 after.sort + 1 开始,所有后续 +1
PluginShortplayDramaScene::where([
'drama_id' => $drama_id,
'episode_id' => $episode_id
])
->where('sort', '>', $afterSort)
->inc('sort', 1)
->update();
// 插入新的空白场景
$new = new PluginShortplayDramaScene();
$new->channels_uid = $request->channels_uid;
$new->drama_id = $drama->id;
$new->episode_id = $episode_id;
$new->sort = $afterSort + 1;
$new->save();
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return $this->fail($th->getMessage());
}
return $this->success('插入成功', ['id' => $new->id]);
}
public function update(Request $request)
{
$drama_id = $request->post('drama_id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
$episode_id = $request->post('episode_id');
$id = $request->post('id');
$D = $request->post();
if ($id) {
$PluginShortplayDramaScene = PluginShortplayDramaScene::where(['id' => $id, 'drama_id' => $drama_id, 'episode_id' => $episode_id])->find();
if (!$PluginShortplayDramaScene) {
return $this->fail('场景不存在');
}
} else {
$PluginShortplayDramaScene = new PluginShortplayDramaScene();
$PluginShortplayDramaScene->channels_uid = $request->channels_uid;
$PluginShortplayDramaScene->uid = $request->uid;
$PluginShortplayDramaScene->drama_id = $drama_id;
$PluginShortplayDramaScene->episode_id = $episode_id;
$PluginShortplayDramaScene->sort = PluginShortplayDramaScene::where(['drama_id' => $drama_id, 'episode_id' => $episode_id])->max('sort') + 1 ?? 1;
}
if (!empty($D['title'])) {
$PluginShortplayDramaScene->title = $D['title'];
}
if (!empty($D['scene_space'])) {
$PluginShortplayDramaScene->scene_space = $D['scene_space'];
}
if (!empty($D['scene_location'])) {
$PluginShortplayDramaScene->scene_location = $D['scene_location'];
}
if (!empty($D['scene_time'])) {
$PluginShortplayDramaScene->scene_time = $D['scene_time'];
}
if (!empty($D['scene_weather'])) {
$PluginShortplayDramaScene->scene_weather = $D['scene_weather'];
}
if (!empty($D['description'])) {
$PluginShortplayDramaScene->description = $D['description'];
}
if (!empty($D['atmosphere'])) {
$PluginShortplayDramaScene->atmosphere = $D['atmosphere'];
}
if (!empty($D['image'])) {
$PluginShortplayDramaScene->image = $D['image'];
}
$PluginShortplayDramaScene->save();
return $this->resData($PluginShortplayDramaScene);
}
}