新增魔剪工作台任务查询接口

This commit is contained in:
xiaohai 2025-09-30 15:21:08 +08:00
parent d765e74098
commit 7140734107
5 changed files with 217 additions and 5 deletions

View File

@ -11,5 +11,6 @@ from . import views
urlpatterns = [ urlpatterns = [
# path('datetime/', views.get_datetime, name='get_datetime'), # path('datetime/', views.get_datetime, name='get_datetime'),
path('api/task_details/', views.get_task_details, name='task_details') path('api/task_details/', views.get_task_details, name='task_details'),
path('api/magic_task/', views.get_magic_task_info, name='magic_task_info')
] ]

View File

@ -7,8 +7,10 @@
@Motto : Catch as catch can.... @Motto : Catch as catch can....
""" """
from chuangliangBaidu.migrations.BaidutaskQuery import AsyncTaskDataQuery from chuangliangBaidu.migrations.BaidutaskQuery import AsyncTaskDataQuery
from chuangliangProject.magic_cat.task_client_magic import MagicTaskQuery
from django.http import JsonResponse from django.http import JsonResponse
from django.views.decorators.http import require_GET from django.views.decorators.http import require_GET
from django.views.decorators.http import require_http_methods
from django.utils import timezone from django.utils import timezone
from django.shortcuts import render from django.shortcuts import render
import json import json
@ -128,3 +130,46 @@ def get_task_details(request):
}) })
logger.error(error_data) logger.error(error_data)
return JsonResponse(error_data, status=500, json_dumps_params={'ensure_ascii': False}) return JsonResponse(error_data, status=500, json_dumps_params={'ensure_ascii': False})
# @csrf_exempt # 如果不需要CSRF保护可以添加此装饰器
@require_http_methods(["GET"]) # 限制只允许GET请求
def get_magic_task_info(request):
"""
获取魔剪任务信息的GET接口
接收参数task - 任务ID
"""
task_id = request.GET.get('taskid')
# 验证参数
if not task_id:
return JsonResponse({
'status': 'error',
'message': '缺少必要参数: task'
}, status=400, json_dumps_params={'ensure_ascii': False})
try:
# 将参数转换为整数
task_id = int(task_id)
except ValueError:
return JsonResponse({
'status': 'error',
'message': '参数格式错误: task必须是整数'
}, status=400, json_dumps_params={'ensure_ascii': False})
try:
# 创建查询实例并获取任务信息
task_query = MagicTaskQuery(task_id)
result = task_query.get_task_info()
# 返回成功响应
return JsonResponse(result, status=200, json_dumps_params={'ensure_ascii': False})
except Exception as e:
# 记录错误日志(实际项目中应该使用日志模块)
print(f"查询魔剪任务信息失败: {str(e)}")
# 返回错误响应
return JsonResponse({
'status': 'error',
'message': f'查询失败: {str(e)}'
}, status=500, json_dumps_params={'ensure_ascii': False})

View File

View File

@ -0,0 +1,165 @@
import requests
import json
import pandas as pd
from typing import List, Dict, Any, Optional
from chuangliangTool.db_base import Chuangliang_ad_magic_task_skit, Chuangliang_ad_magic_cut, Material1_db, Material2_db
class MagicTaskQuery:
def __init__(self, task_id: int):
self.task_id = task_id
self.base_url = "https://tos.mobgi.com/"
self.sql = f"SELECT task_id, batch_id, status, task_param, result_data, main_user_id, create_user_id " \
f"FROM chuangliang_ad_task_skit.task_log_client_mix_shear " \
f"WHERE task_id = {self.task_id}"
self.detail_sql = f"SELECT rule_id, fission_mode, video_duration, create_task_time, " \
f"procssing_task_time, finish_task_time, main_user_id " \
f"FROM chuangliang_ad_task_skit.task_log_detail " \
f"WHERE task_id = {self.task_id}"
self.material_sql = f"SELECT new_material_id, material_id, material_id_start, material_id_start_end, " \
f"start_time, end_time, use_duration, is_effect " \
f"FROM chuangliang_ad_magic_cut.client_material_relation " \
f"WHERE task_id = {self.task_id}"
def _fetch_url_content(self, path: str) -> Optional[Dict[str, Any]]:
"""获取指定URL的内容并转换为JSON格式"""
try:
full_url = self.base_url + path
response = requests.get(full_url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"HTTP请求失败: {str(e)}")
return None
except json.JSONDecodeError as e:
print(f"JSON解析失败: {str(e)}")
return None
def _parse_json_string(self, json_str: str) -> Dict[str, Any]:
"""解析JSON字符串"""
try:
return json.loads(json_str)
except json.JSONDecodeError:
return {"error_data": json_str}
def _get_material_uri(self, material_id: int) -> Optional[str]:
"""获取素材URI"""
material_sql = f"SELECT file_uri FROM chuangliang_ad_material.material WHERE material_id = {material_id}"
# 先查询第一个库表
try:
result = Material1_db.query_database_select_to_dataframe(material_sql)
if result and len(result) > 0:
file_uri = result[0].get('file_uri')
if file_uri:
return f"{self.base_url}{file_uri}"
except Exception as e:
print(f"查询material_id {material_id} 时Material1_db出错: {e}")
# 第一个库表无结果或出错时查询第二个库表
try:
result = Material2_db.query_database_select_to_dataframe(material_sql)
if result and len(result) > 0:
file_uri = result[0].get('file_uri')
if file_uri:
return f"{self.base_url}{file_uri}"
except Exception as e:
print(f"查询material_id {material_id} 时Material2_db出错: {e}")
return None
def _process_material_data(self, query_results: List[Dict[str, Any]]) -> Dict[str, Any]:
"""处理素材关联表查询结果生成指定JSON结构"""
if not query_results:
return {"new_material_id": None, "sum_use_duration": 0, "material_info": []}
new_material_id = query_results[0]["new_material_id"]
sum_use_duration = sum(record.get("use_duration", 0) for record in query_results)
material_info = []
for record in query_results:
material_id = record["material_id"]
material_uri = self._get_material_uri(material_id)
material_record = {
"material_id": material_id,
"material_id_start": record.get("material_id_start"),
"material_id_start_end": record.get("material_id_start_end"),
"start_time": record.get("start_time"),
"end_time": record.get("end_time"),
"use_duration": record.get("use_duration"),
"is_effect": record.get("is_effect"),
"material_uri": material_uri
}
material_info.append(material_record)
return {
"new_material_id": new_material_id,
"sum_use_duration": sum_use_duration,
"material_info": material_info
}
def get_task_info(self) -> Dict[str, Any]:
"""获取任务信息并组合成最终结果"""
# 获取主任务数据
task_data_list = Chuangliang_ad_magic_task_skit.query_database_select_to_dataframe(self.sql)
if not task_data_list:
return {"error": f"未找到task_id为{self.task_id}的任务"}
task_data = task_data_list[0]
# 获取任务详情
task_detail_list = Chuangliang_ad_magic_task_skit.query_database_select_to_dataframe(self.detail_sql)
if not task_detail_list:
return {"error": f"未找到task_id为{self.task_id}的任务详情"}
detail_data = task_detail_list[0]
# 获取任务参数
if task_data['status'] != 'success':
task_param = self._parse_json_string(task_data['task_param'])
else:
task_param = self._fetch_url_content(task_data['task_param'])
# 处理结果数据
result_data = self._parse_json_string(task_data['result_data'])
# 获取素材信息
material_info = Chuangliang_ad_magic_cut.query_database_select_to_dataframe(self.material_sql)
material_detail = self._process_material_data(material_info)
# 构建最终结果
return {
"task_info": {
"task_id": task_data['task_id'],
"batch_id": task_data['batch_id'],
"status": task_data['status'],
"main_user_id": task_data['main_user_id'],
"create_user_id": task_data['create_user_id']
},
"task_param": task_param,
"result_data": result_data,
"task_detail": {
"rule_id": detail_data['rule_id'],
"fission_mode": detail_data['fission_mode'],
"video_duration": detail_data['video_duration'],
"create_task_time": str(detail_data.get('create_task_time', '')),
"procssing_task_time": str(detail_data.get('procssing_task_time', '')),
"finish_task_time": str(detail_data.get('finish_task_time', '')),
"main_user_id": detail_data['main_user_id']
},
"material_detail": material_detail
}
def main():
"""主函数示例"""
task_id = 31544930
task_query = MagicTaskQuery(task_id)
result = task_query.get_task_info()
# 格式化输出JSON
formatted_result = json.dumps(result, ensure_ascii=False)
print(formatted_result)
if __name__ == "__main__":
main()

View File

@ -136,7 +136,7 @@ config_chuangliang_ad_magic_cut = {
'database_name': "chuangliang_ad_magic_cut" 'database_name': "chuangliang_ad_magic_cut"
} }
# 生产魔剪任务库配置 # 生产魔剪任务库配置
config_chuangliang_ad_task_skit = { config_chuangliang_ad_magic_task_skit = {
'jump_host_ip': "180.184.103.38", 'jump_host_ip': "180.184.103.38",
'jump_host_port': 2222, 'jump_host_port': 2222,
'jump_host_user': "cl_ad", 'jump_host_user': "cl_ad",
@ -156,11 +156,12 @@ Material1_db = JumpHostDatabaseConnector(config_material1)
Material2_db = JumpHostDatabaseConnector(config_material2) Material2_db = JumpHostDatabaseConnector(config_material2)
Async_create_ad_batch_db = JumpHostDatabaseConnector(config_async_create_ad_batch) Async_create_ad_batch_db = JumpHostDatabaseConnector(config_async_create_ad_batch)
Chuangliang_ad_magic_cut = JumpHostDatabaseConnector(config_chuangliang_ad_magic_cut) Chuangliang_ad_magic_cut = JumpHostDatabaseConnector(config_chuangliang_ad_magic_cut)
Chuangliang_ad_task_skit = JumpHostDatabaseConnector(config_chuangliang_ad_task_skit) Chuangliang_ad_magic_task_skit = JumpHostDatabaseConnector(config_chuangliang_ad_magic_task_skit)
if __name__ == '__main__': if __name__ == '__main__':
sql = "SELECT * FROM chuangliang_ad_magic_cut.config_apollo WHERE `key` = 'client_task_num_day_limit'" sql = "SELECT * FROM chuangliang_ad_magic_cut.config_apollo WHERE `key` = 'client_task_num_day_limit'"
magic_sql = "SELECT task_id,batch_id,task_param,result_data,main_user_id,create_user_id FROM chuangliang_ad_task_skit.task_log_client_mix_shear WHERE task_id = 19110555" magic_sql = "SELECT task_id,batch_id,task_param,result_data,main_user_id,create_user_id FROM chuangliang_ad_task_skit.task_log_client_mix_shear WHERE task_id = 30821620"
material_sql = "SELECT new_material_id,material_id,material_id_start,material_id_start_end,start_time,end_time,use_duration,rule_id,task_id,is_effect FROM chuangliang_ad_magic_cut.client_material_relation WHERE task_id = 30821691"
# 执行查询 # 执行查询
results = Chuangliang_ad_task_skit.query_database_select_to_dataframe(magic_sql) results = Chuangliang_ad_magic_cut.query_database_select_to_dataframe(material_sql)
print(results) print(results)