|
|
|
|
import json
|
|
|
|
|
from ai.models import *
|
|
|
|
|
from ai.utils.show_prompt import *
|
|
|
|
|
from ai.utils.show_func import *
|
|
|
|
|
from ai.utils.basic_func import *
|
|
|
|
|
import datetime
|
|
|
|
|
from django_redis import get_redis_connection
|
|
|
|
|
from django.db.models import Q
|
|
|
|
|
from ai.models import TestCinema
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ai排片主流程
|
|
|
|
|
def show_main_process(zz_code=None, day_delta=None):
|
|
|
|
|
# 查看状态
|
|
|
|
|
redis_conn = get_redis_connection()
|
|
|
|
|
redis_key = f'ai_show{datetime.date.today().strftime("%Y%m%d")}'
|
|
|
|
|
if redis_conn.exists(redis_key):
|
|
|
|
|
return False
|
|
|
|
|
# 获取影院列表
|
|
|
|
|
redis_conn.set(redis_key, 1, ex=60 * 60 * 20)
|
|
|
|
|
if not zz_code:
|
|
|
|
|
test_cinema_list = TestCinema.objects.filter(is_active=True).all()
|
|
|
|
|
else:
|
|
|
|
|
test_cinema_list = TestCinema.objects.filter(Q(zz_code=zz_code) & Q(is_active=True)).all()
|
|
|
|
|
day_delta = int(get_runtime_val('day_delta')) if day_delta is None else int(day_delta)
|
|
|
|
|
# 获取提示词版本
|
|
|
|
|
prompt_ver = PromptTemplate.objects.filter(
|
|
|
|
|
Q(del_flag=False) & Q(prompt_type='version') & Q(prompt_key='ShowPromptVersion')).first().prompt_val
|
|
|
|
|
# 开始处理提示词
|
|
|
|
|
# 生成目标日期
|
|
|
|
|
show_date = datetime.date.strftime(datetime.date.today() + datetime.timedelta(days=day_delta), '%Y-%m-%d')
|
|
|
|
|
# 获取当前模型
|
|
|
|
|
model = AiModel.objects.filter(current_used=True).first()
|
|
|
|
|
|
|
|
|
|
# 按照影院生成排片
|
|
|
|
|
for cinema in test_cinema_list:
|
|
|
|
|
print(cinema.name)
|
|
|
|
|
show_ai = ShowAI(cinema, show_date)
|
|
|
|
|
# template_show, template_date = get_template_show(cinema, show_date)
|
|
|
|
|
template_show, template_date = get_template_show_tomorrow(cinema)
|
|
|
|
|
if str(get_runtime_val('real_target')) == '1':
|
|
|
|
|
target_show = get_target_show(cinema, show_date)
|
|
|
|
|
else:
|
|
|
|
|
target_show = '影厅别名,影厅id,影片别名,本地影片id,语言,放映日期,开始时间,结束时间,片长,场间'
|
|
|
|
|
prompt = show_ai.general_prompt()
|
|
|
|
|
if str(get_runtime_val('test')) == '0':
|
|
|
|
|
start = datetime.datetime.now() # 开始计时
|
|
|
|
|
result, message, tokens = show_ai.get_show_result_ai()
|
|
|
|
|
end = datetime.datetime.now() # 结束计时
|
|
|
|
|
print('prompt:', prompt)
|
|
|
|
|
print('result:', result)
|
|
|
|
|
print('message:', message)
|
|
|
|
|
print('tokens:', tokens)
|
|
|
|
|
|
|
|
|
|
# 获取排片数据
|
|
|
|
|
print('result:', result)
|
|
|
|
|
if model.config_name in ['lmstudio_qwen3.6_35b', 'company_qwen3.5_35b']:
|
|
|
|
|
result_obj = json.loads(result.replace('```json', '').replace('}\n```', '}').strip())
|
|
|
|
|
else:
|
|
|
|
|
result_obj = json.loads(result.strip())
|
|
|
|
|
|
|
|
|
|
# 预测排片数据
|
|
|
|
|
_show = result_obj['show'].replace('```', '').replace('csv', '').strip()
|
|
|
|
|
|
|
|
|
|
# 预测销售数据
|
|
|
|
|
_sales = str(result_obj['income']).strip()
|
|
|
|
|
|
|
|
|
|
# 处理返回结果
|
|
|
|
|
try:
|
|
|
|
|
AiShow.objects.create(
|
|
|
|
|
cinema=cinema.name,
|
|
|
|
|
zz_code=cinema.zz_code,
|
|
|
|
|
show_date=show_date,
|
|
|
|
|
is_ai_show=True,
|
|
|
|
|
is_manual_test=False,
|
|
|
|
|
ai_model=model.config_name,
|
|
|
|
|
template=template_show,
|
|
|
|
|
temp_date=template_date,
|
|
|
|
|
target=target_show,
|
|
|
|
|
show=data_cleansing(_show),
|
|
|
|
|
sales=_sales,
|
|
|
|
|
prompt=prompt,
|
|
|
|
|
result=result,
|
|
|
|
|
message=message,
|
|
|
|
|
take_times=int((end - start).seconds),
|
|
|
|
|
take_tokens=tokens,
|
|
|
|
|
prompt_version=prompt_ver,
|
|
|
|
|
)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def show_manual_process(zz_code: str, show_date: str, prompt: str):
|
|
|
|
|
cinema = TestCinema.objects.filter(zz_code=zz_code).first()
|
|
|
|
|
ai = ShowAI(cinema, show_date)
|
|
|
|
|
|
|
|
|
|
start = datetime.datetime.now() # 开始计时
|
|
|
|
|
result, message, tokens = ai.get_show_result_ai(prompt)
|
|
|
|
|
end = datetime.datetime.now() # 结束计时
|
|
|
|
|
print('prompt:', prompt)
|
|
|
|
|
print('result:', result)
|
|
|
|
|
print('message:', message)
|
|
|
|
|
print('tokens:', tokens)
|
|
|
|
|
|
|
|
|
|
# 获取排片数据
|
|
|
|
|
print('result:', result)
|
|
|
|
|
# 获取当前模型
|
|
|
|
|
model = AiModel.objects.filter(current_used=True).first()
|
|
|
|
|
if model.config_name in ['lmstudio_qwen3.6_35b', 'company_qwen3.5_35b']:
|
|
|
|
|
result_obj = json.loads(result.replace('```json', '').replace('}\n```', '}').strip())
|
|
|
|
|
else:
|
|
|
|
|
result_obj = json.loads(result.strip())
|
|
|
|
|
|
|
|
|
|
# 预测排片数据
|
|
|
|
|
_show = result_obj['show'].replace('```', '').replace('csv', '').strip()
|
|
|
|
|
|
|
|
|
|
# 预测销售数据
|
|
|
|
|
_sales = str(result_obj['income']).strip()
|
|
|
|
|
|
|
|
|
|
ai_data = AiShow.objects.filter(Q(is_ai_show=True) &
|
|
|
|
|
Q(is_manual_test=False) &
|
|
|
|
|
Q(zz_code=zz_code) &
|
|
|
|
|
Q(show_date=show_date)).order_by('-id').first()
|
|
|
|
|
print(ai_data)
|
|
|
|
|
# 处理返回结果
|
|
|
|
|
try:
|
|
|
|
|
AiShow.objects.create(
|
|
|
|
|
cinema=cinema.name,
|
|
|
|
|
zz_code=cinema.zz_code,
|
|
|
|
|
show_date=show_date,
|
|
|
|
|
is_ai_show=True,
|
|
|
|
|
is_manual_test=True,
|
|
|
|
|
ai_model=model.config_name,
|
|
|
|
|
template=ai_data.template if ai_data is not None else '',
|
|
|
|
|
temp_date=ai_data.temp_date if ai_data is not None else '',
|
|
|
|
|
target=ai_data.target if ai_data is not None else '',
|
|
|
|
|
show=data_cleansing(_show),
|
|
|
|
|
sales=_sales,
|
|
|
|
|
prompt=prompt,
|
|
|
|
|
result=result,
|
|
|
|
|
message=message,
|
|
|
|
|
take_times=int((end - start).seconds),
|
|
|
|
|
take_tokens=tokens,
|
|
|
|
|
prompt_version=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
|
|
)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return e
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_prompt_process(zz_code=None, show_date=None):
|
|
|
|
|
print('zz_code:', zz_code)
|
|
|
|
|
print('show_date:', show_date)
|
|
|
|
|
if zz_code == '' or show_date == '' :
|
|
|
|
|
return '请检查影院编码和排片日期'
|
|
|
|
|
# 获取影院
|
|
|
|
|
cinema = TestCinema.objects.filter(Q(zz_code=zz_code) & Q(is_active=True)).first()
|
|
|
|
|
# 获取提示词版本
|
|
|
|
|
prompt_ver = PromptTemplate.objects.filter(
|
|
|
|
|
Q(del_flag=False) & Q(prompt_type='version') & Q(prompt_key='ShowPromptVersion')).first().prompt_val
|
|
|
|
|
# 开始处理提示词
|
|
|
|
|
# 按照影院生成排片
|
|
|
|
|
print(cinema.name)
|
|
|
|
|
show_ai = ShowAI(cinema, show_date)
|
|
|
|
|
prompt = show_ai.general_prompt()
|
|
|
|
|
return prompt
|
|
|
|
|
|