This commit is contained in:
2026-07-09 09:10:49 +08:00
parent 2882d37112
commit fec47bf47a
54 changed files with 5985 additions and 992 deletions
@@ -88,6 +88,8 @@ from app.services.module_generation_step_update_service import (
update_module_video_prompt_schema,
)
from app.services.resource_signed_url_service import build_resource_signed_url
from app.enums.upload_resource import UploadResourceModuleEnum, UploadResourceSourceModelEnum
from app.services.upload_resource import bind_upload_resources, release_upload_resources_by_source
from app.services.video_prompt_schema_config_service import fallback_runtime_schema_snapshot, get_runtime_schema_snapshot
from app.utils.id_gen import generate_id
from app.models.shot_replicate_segment import ShotReplicateSegment
@@ -513,6 +515,7 @@ async def create_shot_replicate_project(db: AsyncSession, current_user: User, re
input_data={
"material_video_url": req.material_video_url,
"material_image_url": req.material_image_url,
"material_image_resource_id": getattr(req, "material_image_resource_id", None),
"source_project_name": req.source_project_name,
"target_project_name": req.target_project_name,
"core_content_point": req.core_content_point,
@@ -1493,7 +1496,13 @@ async def delete_shot_replicate_project(
project_id: str,
refund_unfinished: bool = False,
) -> ShotReplicateDeleteOut:
"""内部 helper:只软删除指定 ModuleGenerationProject 自身。
这里不是对外 API,不反查 ShotReplicateSegment / ShotReplicateTaskSet
不 commit、不 rollback、不删除真实 UploadResource 文件。
"""
project = await _get_project_for_user(db, project_id=project_id, user=current_user, for_update=True)
project_id_snapshot = project.id
deleted_at = _now()
release_stats: dict[str, int] = {"released_size_bytes": 0}
@@ -1509,21 +1518,34 @@ async def delete_shot_replicate_project(
refund_unfinished=refund_unfinished,
release_stats=release_stats,
)
upload_release = await release_upload_resources_by_source(
db,
source_model=UploadResourceSourceModelEnum.MODULE_GENERATION_PROJECT.value,
source_ids=[project_id_snapshot],
module=UploadResourceModuleEnum.SHOT_REPLICATE.value,
)
pending_ids = list(upload_release.get("released_resource_ids") or [])
generated_released = int(release_stats.get("released_size_bytes", 0) or 0)
upload_released_size = int(upload_release.get("released_size_bytes") or 0)
await log_module_event(
db,
project=project,
event_type=ModuleEventTypeEnum.PROJECT_DELETED.value,
message="软删除拆镜复刻项目",
message="软删除拆镜复刻内部项目",
detail={
"refund_unfinished": refund_unfinished,
"released_size_bytes": int(release_stats.get("released_size_bytes", 0)),
"generated_resource_released_size_bytes": generated_released,
"upload_resource_release": {k: v for k, v in upload_release.items() if k != "released_resource_ids"},
"pending_delete_resource_count": len(pending_ids),
},
)
return ShotReplicateDeleteOut(
message="项目已删除",
project_id=project.id,
project_id=project_id_snapshot,
deleted=True,
released_size_bytes=int(release_stats.get("released_size_bytes", 0)),
released_size_bytes=generated_released + upload_released_size,
upload_resource_released=int(upload_release.get("released") or 0),
pending_delete_resource_ids=pending_ids,
)
@@ -1583,6 +1605,7 @@ async def create_shot_replicate_project_from_segment(
"material_video_url": segment.segment_video_url,
"material_video_locked": True,
"material_image_url": req.material_image_url,
"material_image_resource_id": getattr(req, "material_image_resource_id", None),
"source_project_name": segment.segment_category or segment.original_video_category or "拆镜片段",
"target_project_name": req.target_project_name,
"core_content_point": req.core_content_point,
@@ -1626,6 +1649,16 @@ async def create_shot_replicate_project_from_segment(
)
project.current_step_code = ShotReplicateStepCodeEnum.MATERIAL_INPUT.value
project.status = ModuleProjectStatusEnum.WAITING_USER.value
await bind_upload_resources(
db,
user_id=current_user.id,
module=UploadResourceModuleEnum.SHOT_REPLICATE.value,
source_model=UploadResourceSourceModelEnum.MODULE_GENERATION_PROJECT.value,
source_id=project.id,
resource_ids=[getattr(req, "material_image_resource_id", None)],
urls=[req.material_image_url, segment.segment_video_url],
allow_common_migrate=True,
)
segment.module_project_id = project.id
segment.replicate_status = ShotSegmentReplicateStatusEnum.PROJECT_CREATED.value
await log_module_event(