|
|
@@ -341,7 +341,11 @@ class AnimeService
|
|
|
try {
|
|
|
$params = [
|
|
|
'prompt' => $description,
|
|
|
- 'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : []
|
|
|
+ 'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : [],
|
|
|
+ // 计费锚点(动漫/剧集/剧本),用于积分明细归属统计
|
|
|
+ 'anime_id' => $anime_id,
|
|
|
+ 'episode_id' => $episode_id,
|
|
|
+ 'episode_number' => getProp($episode, 'episode_number'),
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -410,7 +414,11 @@ class AnimeService
|
|
|
try {
|
|
|
$params = [
|
|
|
'prompt' => $description,
|
|
|
- 'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : []
|
|
|
+ 'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : [],
|
|
|
+ // 计费锚点(动漫/剧集/剧本),用于积分明细归属统计
|
|
|
+ 'anime_id' => $anime_id,
|
|
|
+ 'episode_id' => $episode_id,
|
|
|
+ 'episode_number' => getProp($episode, 'episode_number'),
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -1187,9 +1195,10 @@ class AnimeService
|
|
|
|
|
|
// 如果有关联的script_id,则同步到mp_products表
|
|
|
if ($script_id) {
|
|
|
- // 查询剧本信息
|
|
|
+ // 查询剧本信息(仅同步属于当前用户的剧本,不属于则跳过后续资产同步)
|
|
|
$script = DB::table('mp_scripts')
|
|
|
->where('id', $script_id)
|
|
|
+ ->where('user_id', $uid)
|
|
|
->where('is_deleted', 0)
|
|
|
->first();
|
|
|
|
|
|
@@ -1198,6 +1207,15 @@ class AnimeService
|
|
|
$product_name = getProp($target_roles, 'role');
|
|
|
$pic_prompt = getProp($target_roles, 'pic_prompt', '');
|
|
|
$url = getProp($target_roles, 'url', '');
|
|
|
+ $three_view_image_url = trim(getProp($target_roles, 'three_view_image_url', ''));
|
|
|
+ // 兼容 versions 传入数组或 JSON 字符串
|
|
|
+ $versions = getProp($target_roles, 'versions', null);
|
|
|
+ if (is_string($versions) && $versions !== '') {
|
|
|
+ $decoded_versions = json_decode($versions, true);
|
|
|
+ if (is_array($decoded_versions)) {
|
|
|
+ $versions = $decoded_versions;
|
|
|
+ }
|
|
|
+ }
|
|
|
$product_type = 1; // 1=角色
|
|
|
|
|
|
// 查找或创建以script_name命名的文件夹
|
|
|
@@ -1246,10 +1264,13 @@ class AnimeService
|
|
|
];
|
|
|
if ($pic_prompt) $updateData['pic_prompt'] = $pic_prompt;
|
|
|
if ($url) $updateData['url'] = $url;
|
|
|
+ // 显式传入三视图(含空值)时同步写入,空值表示当前版本没有三视图
|
|
|
+ if (is_array($target_roles) && array_key_exists('three_view_image_url', $target_roles)) {
|
|
|
+ $updateData['three_view_image_url'] = trim(getProp($target_roles, 'three_view_image_url', ''));
|
|
|
+ }
|
|
|
|
|
|
- // 处理versions字段
|
|
|
- $versions = getProp($target_roles, 'versions', []);
|
|
|
- if ($versions && is_array($versions)) {
|
|
|
+ // 处理versions字段,显式传入数组(含空数组)时覆盖
|
|
|
+ if (is_array($versions)) {
|
|
|
$updateData['versions'] = json_encode($versions, 256);
|
|
|
}
|
|
|
|
|
|
@@ -1262,8 +1283,6 @@ class AnimeService
|
|
|
$product_id = $existing_product->id;
|
|
|
} else {
|
|
|
// 创建新资产
|
|
|
- $versions = getProp($target_roles, 'versions', []);
|
|
|
-
|
|
|
$product_id = DB::table('mp_products')->insertGetId([
|
|
|
'user_id' => $uid,
|
|
|
'cpid' => $cpid,
|
|
|
@@ -1273,6 +1292,7 @@ class AnimeService
|
|
|
'level' => 2,
|
|
|
'product_name' => $product_name,
|
|
|
'url' => $url,
|
|
|
+ 'three_view_image_url' => $three_view_image_url,
|
|
|
'pic_prompt' => $pic_prompt,
|
|
|
'versions' => is_array($versions) ? json_encode($versions, 256) : '[]',
|
|
|
'sort_order' => time(),
|
|
|
@@ -1409,9 +1429,10 @@ class AnimeService
|
|
|
|
|
|
// 如果有关联的script_id,则同步到mp_products表
|
|
|
if ($script_id) {
|
|
|
- // 查询剧本信息
|
|
|
+ // 查询剧本信息(仅同步属于当前用户的剧本,不属于则跳过后续资产同步)
|
|
|
$script = DB::table('mp_scripts')
|
|
|
->where('id', $script_id)
|
|
|
+ ->where('user_id', $uid)
|
|
|
->where('is_deleted', 0)
|
|
|
->first();
|
|
|
|
|
|
@@ -1420,6 +1441,15 @@ class AnimeService
|
|
|
$product_name = getProp($target_scenes, 'scene');
|
|
|
$pic_prompt = getProp($target_scenes, 'pic_prompt', '');
|
|
|
$url = getProp($target_scenes, 'url', '');
|
|
|
+ $three_view_image_url = trim(getProp($target_scenes, 'three_view_image_url', ''));
|
|
|
+ // 兼容 versions 传入数组或 JSON 字符串
|
|
|
+ $versions = getProp($target_scenes, 'versions', null);
|
|
|
+ if (is_string($versions) && $versions !== '') {
|
|
|
+ $decoded_versions = json_decode($versions, true);
|
|
|
+ if (is_array($decoded_versions)) {
|
|
|
+ $versions = $decoded_versions;
|
|
|
+ }
|
|
|
+ }
|
|
|
$product_type = 2; // 2=场景
|
|
|
|
|
|
// 查找或创建以script_name命名的文件夹
|
|
|
@@ -1468,10 +1498,13 @@ class AnimeService
|
|
|
];
|
|
|
if ($pic_prompt) $updateData['pic_prompt'] = $pic_prompt;
|
|
|
if ($url) $updateData['url'] = $url;
|
|
|
+ // 显式传入三视图(含空值)时同步写入,空值表示当前版本没有三视图
|
|
|
+ if (is_array($target_scenes) && array_key_exists('three_view_image_url', $target_scenes)) {
|
|
|
+ $updateData['three_view_image_url'] = trim(getProp($target_scenes, 'three_view_image_url', ''));
|
|
|
+ }
|
|
|
|
|
|
- // 处理versions字段
|
|
|
- $versions = getProp($target_scenes, 'versions', []);
|
|
|
- if ($versions && is_array($versions)) {
|
|
|
+ // 处理versions字段,显式传入数组(含空数组)时覆盖
|
|
|
+ if (is_array($versions)) {
|
|
|
$updateData['versions'] = json_encode($versions, 256);
|
|
|
}
|
|
|
|
|
|
@@ -1484,8 +1517,6 @@ class AnimeService
|
|
|
$product_id = $existing_product->id;
|
|
|
} else {
|
|
|
// 创建新资产
|
|
|
- $versions = getProp($target_scenes, 'versions', []);
|
|
|
-
|
|
|
$product_id = DB::table('mp_products')->insertGetId([
|
|
|
'user_id' => $uid,
|
|
|
'cpid' => $cpid,
|
|
|
@@ -1495,6 +1526,7 @@ class AnimeService
|
|
|
'level' => 2,
|
|
|
'product_name' => $product_name,
|
|
|
'url' => $url,
|
|
|
+ 'three_view_image_url' => $three_view_image_url,
|
|
|
'pic_prompt' => $pic_prompt,
|
|
|
'versions' => is_array($versions) ? json_encode($versions, 256) : '[]',
|
|
|
'sort_order' => time(),
|
|
|
@@ -1631,9 +1663,10 @@ class AnimeService
|
|
|
|
|
|
// 如果有关联的script_id,则同步到mp_products表
|
|
|
if ($script_id) {
|
|
|
- // 查询剧本信息
|
|
|
+ // 查询剧本信息(仅同步属于当前用户的剧本,不属于则跳过后续资产同步)
|
|
|
$script = DB::table('mp_scripts')
|
|
|
->where('id', $script_id)
|
|
|
+ ->where('user_id', $uid)
|
|
|
->where('is_deleted', 0)
|
|
|
->first();
|
|
|
|
|
|
@@ -1642,6 +1675,15 @@ class AnimeService
|
|
|
$product_name = getProp($target_props, 'prop');
|
|
|
$pic_prompt = getProp($target_props, 'pic_prompt', '');
|
|
|
$url = getProp($target_props, 'url', '');
|
|
|
+ $three_view_image_url = trim(getProp($target_props, 'three_view_image_url', ''));
|
|
|
+ // 兼容 versions 传入数组或 JSON 字符串
|
|
|
+ $versions = getProp($target_props, 'versions', null);
|
|
|
+ if (is_string($versions) && $versions !== '') {
|
|
|
+ $decoded_versions = json_decode($versions, true);
|
|
|
+ if (is_array($decoded_versions)) {
|
|
|
+ $versions = $decoded_versions;
|
|
|
+ }
|
|
|
+ }
|
|
|
$product_type = 3; // 3=道具
|
|
|
|
|
|
// 查找或创建以script_name命名的文件夹
|
|
|
@@ -1690,10 +1732,13 @@ class AnimeService
|
|
|
];
|
|
|
if ($pic_prompt) $updateData['pic_prompt'] = $pic_prompt;
|
|
|
if ($url) $updateData['url'] = $url;
|
|
|
+ // 显式传入三视图(含空值)时同步写入,空值表示当前版本没有三视图
|
|
|
+ if (is_array($target_props) && array_key_exists('three_view_image_url', $target_props)) {
|
|
|
+ $updateData['three_view_image_url'] = trim(getProp($target_props, 'three_view_image_url', ''));
|
|
|
+ }
|
|
|
|
|
|
- // 处理versions字段
|
|
|
- $versions = getProp($target_props, 'versions', []);
|
|
|
- if ($versions && is_array($versions)) {
|
|
|
+ // 处理versions字段,显式传入数组(含空数组)时覆盖
|
|
|
+ if (is_array($versions)) {
|
|
|
$updateData['versions'] = json_encode($versions, 256);
|
|
|
}
|
|
|
|
|
|
@@ -1706,8 +1751,6 @@ class AnimeService
|
|
|
$product_id = $existing_product->id;
|
|
|
} else {
|
|
|
// 创建新资产
|
|
|
- $versions = getProp($target_props, 'versions', []);
|
|
|
-
|
|
|
$product_id = DB::table('mp_products')->insertGetId([
|
|
|
'user_id' => $uid,
|
|
|
'cpid' => $cpid,
|
|
|
@@ -1717,6 +1760,7 @@ class AnimeService
|
|
|
'level' => 2,
|
|
|
'product_name' => $product_name,
|
|
|
'url' => $url,
|
|
|
+ 'three_view_image_url' => $three_view_image_url,
|
|
|
'pic_prompt' => $pic_prompt,
|
|
|
'versions' => is_array($versions) ? json_encode($versions, 256) : '[]',
|
|
|
'sort_order' => time(),
|
|
|
@@ -6306,7 +6350,10 @@ class AnimeService
|
|
|
'ref_img_urls' => '',
|
|
|
'width' => $width,
|
|
|
'height' => $height,
|
|
|
- 'image_num' => $imageNum
|
|
|
+ 'image_num' => $imageNum,
|
|
|
+ // 计费锚点(动漫/剧集/剧本),上下文没有时不记录
|
|
|
+ 'anime_id' => getProp($data, 'anime_id'),
|
|
|
+ 'episode_id' => $episode_id,
|
|
|
];
|
|
|
if ($ref_img_urls) $params['ref_img_urls'] = is_array($ref_img_urls) ? $ref_img_urls : [$ref_img_urls];
|
|
|
|
|
|
@@ -6548,7 +6595,11 @@ class AnimeService
|
|
|
|
|
|
$params = [
|
|
|
'prompt' => $description,
|
|
|
- 'ref_img_urls' => []
|
|
|
+ 'ref_img_urls' => [],
|
|
|
+ // 计费锚点(动漫/剧集/剧本),用于积分明细归属统计
|
|
|
+ 'anime_id' => $anime_id,
|
|
|
+ 'episode_id' => $episode_id,
|
|
|
+ 'episode_number' => getProp($episode, 'episode_number'),
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -6622,7 +6673,11 @@ class AnimeService
|
|
|
|
|
|
$params = [
|
|
|
'prompt' => $description,
|
|
|
- 'ref_img_urls' => []
|
|
|
+ 'ref_img_urls' => [],
|
|
|
+ // 计费锚点(动漫/剧集/剧本),用于积分明细归属统计
|
|
|
+ 'anime_id' => $anime_id,
|
|
|
+ 'episode_id' => $episode_id,
|
|
|
+ 'episode_number' => getProp($episode, 'episode_number'),
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -7535,7 +7590,7 @@ class AnimeService
|
|
|
$updateData['url'] = $url;
|
|
|
}
|
|
|
|
|
|
- // 三视图图片地址(选填),格式校验与 url 一致
|
|
|
+ // 三视图图片地址(选填),格式校验与 url 一致;显式传空表示当前版本没有三视图
|
|
|
$three_view_image_url = trim(getProp($data, 'three_view_image_url', ''));
|
|
|
if ($three_view_image_url) {
|
|
|
$threeViewPath = parse_url($three_view_image_url, PHP_URL_PATH);
|
|
|
@@ -7544,7 +7599,10 @@ class AnimeService
|
|
|
if (!in_array($threeViewExtension, $allowedExtensions)) {
|
|
|
Utils::throwError('20003:三视图图片格式不正确,仅支持 jpg、jpeg、png、gif、webp、bmp 格式');
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
+ // 显式传入三视图(含空值)时同步写入,空值表示当前版本没有三视图
|
|
|
+ if (array_key_exists('three_view_image_url', $data)) {
|
|
|
$updateData['three_view_image_url'] = $three_view_image_url;
|
|
|
}
|
|
|
|
|
|
@@ -7566,6 +7624,8 @@ class AnimeService
|
|
|
// }
|
|
|
|
|
|
$updateData['pic_prompt'] = $pic_prompt;
|
|
|
+ }else {
|
|
|
+ Utils::throwError('20003:请输入提示词');
|
|
|
}
|
|
|
|
|
|
if (empty($updateData) && !$script_id) {
|
|
|
@@ -9597,6 +9657,8 @@ class AnimeService
|
|
|
'ref_img_urls' => [],
|
|
|
'width' => $width,
|
|
|
'height' => $height,
|
|
|
+ // 计费锚点(剧本),用于积分明细归属统计
|
|
|
+ 'script_id' => $script_id,
|
|
|
]);
|
|
|
|
|
|
$task_id = $task->id;
|
|
|
@@ -9818,7 +9880,9 @@ class AnimeService
|
|
|
'model' => $model,
|
|
|
'ref_img_urls' => [],
|
|
|
'width' => $width,
|
|
|
- 'height' => $height
|
|
|
+ 'height' => $height,
|
|
|
+ // 计费锚点(剧本),用于积分明细归属统计
|
|
|
+ 'script_id' => $script_id,
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -10152,7 +10216,9 @@ class AnimeService
|
|
|
'model' => $model,
|
|
|
'ref_img_urls' => [],
|
|
|
'width' => $width,
|
|
|
- 'height' => $height
|
|
|
+ 'height' => $height,
|
|
|
+ // 计费锚点(剧本),用于积分明细归属统计
|
|
|
+ 'script_id' => $script_id,
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -10459,7 +10525,9 @@ class AnimeService
|
|
|
'model' => $model,
|
|
|
'ref_img_urls' => [],
|
|
|
'width' => $width,
|
|
|
- 'height' => $height
|
|
|
+ 'height' => $height,
|
|
|
+ // 计费锚点(剧本),用于积分明细归属统计
|
|
|
+ 'script_id' => $script_id,
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|