1、智能排片支持只展示定时任务+手动测试的数据

2、修复影院管理中显示错误的问题
main
rogersun 1 day ago
parent aab33a6917
commit d60ad41705
  1. 18
      ai/migrations/0026_aishow_create_datetime.py
  2. 1
      ai/models.py
  3. 33
      ai/utils/show_database.py
  4. 7
      ai/utils/show_func.py
  5. 28
      ai/utils/show_process.py
  6. 14
      ai/utils/sql.py
  7. 18
      ai/views.py
  8. 2
      env.py
  9. 2
      update/utils/get_version.py

@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2026-07-16 04:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ai', '0025_movieguidance_type'),
]
operations = [
migrations.AddField(
model_name='aishow',
name='create_datetime',
field=models.CharField(default='', max_length=50),
),
]

@ -68,6 +68,7 @@ class AiShow(models.Model):
prompt = models.TextField() # 生成的用户提示词部分 prompt = models.TextField() # 生成的用户提示词部分
result = models.TextField() # ai返回结果中最终输出部分 result = models.TextField() # ai返回结果中最终输出部分
message = models.TextField() # ai返回结果的完整信息 message = models.TextField() # ai返回结果的完整信息
create_datetime = models.CharField(max_length=50, default='') # 生成的时间
created_at = models.DateTimeField(auto_now_add=True) # ai返回结果的时间 created_at = models.DateTimeField(auto_now_add=True) # ai返回结果的时间
updated_at = models.DateTimeField(auto_now=True) updated_at = models.DateTimeField(auto_now=True)
take_times = models.IntegerField(default=0) # 从提示词发给ai到取得返回结果的时间,单位秒 take_times = models.IntegerField(default=0) # 从提示词发给ai到取得返回结果的时间,单位秒

@ -59,31 +59,30 @@ class GetData:
# 获取指定日期的可用于排片的影片 # 获取指定日期的可用于排片的影片
def get_handle_movie(self, date): def get_handle_movie(self, date):
if get_runtime_val('real_target') == '0': if get_runtime_val('real_target') == '0':
start_datetime = datetime.datetime.today().replace(hour=6, minute=0,second=0,microsecond=0) movie_date_start = datetime.datetime.today().replace(hour=6, minute=0, second=0, microsecond=0)
end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, movie_date_end = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59,
seconds=59) seconds=59)
show_date_limit = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6, minutes=0,
seconds=0)
bl_bool, bl_str, bl_list = get_black_list(self.zz_code)
if bl_bool:
sql = GET_HANDLE_MOVIE_TEST + bl_str + ');'
self.cur.execute(sql, (movie_date_start, movie_date_end, show_date_limit, *bl_list))
print(self.cur.mogrify(sql, (movie_date_start, movie_date_end, show_date_limit, *bl_list)))
else:
sql = GET_HANDLE_MOVIE_TEST + bl_str + ');'
self.cur.execute(sql, (movie_date_start, movie_date_end, show_date_limit))
print(self.cur.mogrify(sql, (movie_date_start, movie_date_end, show_date_limit)))
else: else:
start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59,
seconds=59) seconds=59)
end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6) end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6)
print('get_handle_movie-start_datetime', datetime.datetime.strftime(start_datetime, '%Y-%m-%d %H:%M:%S')) bl_bool, bl_str, bl_list = get_black_list(self.zz_code)
print('get_handle_movie-end_datetime', datetime.datetime.strftime(end_datetime, '%Y-%m-%d %H:%M:%S')) if bl_bool:
bl_bool, bl_str, bl_list = get_black_list(self.zz_code)
if bl_bool:
if get_runtime_val('real_target') == '0':
sql = GET_HANDLE_MOVIE_TEST + bl_str + ');'
self.cur.execute(sql, (start_datetime, end_datetime, *bl_list))
print(self.cur.mogrify(sql, (start_datetime, end_datetime, *bl_list)))
else:
sql = GET_HANDLE_MOVIE + bl_str + ');' sql = GET_HANDLE_MOVIE + bl_str + ');'
self.cur.execute(sql, (start_datetime, end_datetime, *bl_list)) self.cur.execute(sql, (start_datetime, end_datetime, *bl_list))
print(self.cur.mogrify(sql, (start_datetime, end_datetime, *bl_list))) print(self.cur.mogrify(sql, (start_datetime, end_datetime, *bl_list)))
else:
if get_runtime_val('real_target') == '0':
sql = GET_HANDLE_MOVIE_TEST + bl_str + ');'
self.cur.execute(sql, (start_datetime, end_datetime))
print(self.cur.mogrify(sql, (start_datetime, end_datetime)))
else: else:
sql = GET_HANDLE_MOVIE + bl_str + ');' sql = GET_HANDLE_MOVIE + bl_str + ');'
self.cur.execute(sql, (start_datetime, end_datetime)) self.cur.execute(sql, (start_datetime, end_datetime))

@ -47,7 +47,8 @@ def get_cinema_show_result_func(_zz_code, _show_date):
result='', result='',
message='', message='',
take_times=0, take_times=0,
take_tokens='0' take_tokens='0',
create_datetime=datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S'),
) )
except Exception as e: except Exception as e:
print(e) print(e)
@ -213,5 +214,5 @@ def get_movie_guidance(cinema, show_date):
def get_test_date_from_db(cinema_code: str, show_date: str) -> list: def get_test_date_from_db(cinema_code: str, show_date: str) -> list:
test_data = AiShow.objects.filter( test_data = AiShow.objects.filter(
Q(zz_code=cinema_code) & Q(show_date>=show_date) & Q(is_ai_show=True) & Q(is_manual_test=True)).all() Q(zz_code=cinema_code) & Q(show_date=show_date) & Q(is_ai_show=True)).order_by('-create_datetime').all()
return [test.prompt_version for test in test_data] return [(test.create_datetime, test.is_manual_test) for test in test_data]

@ -86,6 +86,7 @@ def show_main_process(zz_code=None, day_delta=None):
take_times=int((end - start).seconds), take_times=int((end - start).seconds),
take_tokens=tokens, take_tokens=tokens,
prompt_version=prompt_ver, prompt_version=prompt_ver,
create_datetime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S'),
) )
except Exception as e: except Exception as e:
print(e) print(e)
@ -96,17 +97,26 @@ def show_manual_process(zz_code: str, show_date: str, prompt: str):
cinema = TestCinema.objects.filter(zz_code=zz_code).first() cinema = TestCinema.objects.filter(zz_code=zz_code).first()
ai = ShowAI(cinema, show_date) ai = ShowAI(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,语言,放映日期,开始时间,结束时间,片长,场间'
# 开始请求AI
start = datetime.datetime.now() # 开始计时 start = datetime.datetime.now() # 开始计时
result, message, tokens = ai.get_show_result_ai(prompt) result, message, tokens = ai.get_show_result_ai(prompt)
end = datetime.datetime.now() # 结束计时 end = datetime.datetime.now() # 结束计时
# 打印返回结果
print('prompt:', prompt) print('prompt:', prompt)
print('result:', result) print('result:', result)
print('message:', message) print('message:', message)
print('tokens:', tokens) print('tokens:', tokens)
# 获取排片数据 # 获取当前模型根据模型处理返回结果
print('result:', result)
# 获取当前模型
model = AiModel.objects.filter(current_used=True).first() model = AiModel.objects.filter(current_used=True).first()
if model.config_name in ['lmstudio_qwen3.6_35b', 'company_qwen3.5_35b']: if model.config_name in ['lmstudio_qwen3.6_35b', 'company_qwen3.5_35b']:
result_obj = json.loads(result.replace('```json', '').replace('}\n```', '}').strip()) result_obj = json.loads(result.replace('```json', '').replace('}\n```', '}').strip())
@ -119,11 +129,6 @@ def show_manual_process(zz_code: str, show_date: str, prompt: str):
# 预测销售数据 # 预测销售数据
_sales = str(result_obj['income']).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: try:
AiShow.objects.create( AiShow.objects.create(
@ -133,9 +138,9 @@ def show_manual_process(zz_code: str, show_date: str, prompt: str):
is_ai_show=True, is_ai_show=True,
is_manual_test=True, is_manual_test=True,
ai_model=model.config_name, ai_model=model.config_name,
template=ai_data.template if ai_data is not None else '', template=template_show,
temp_date=ai_data.temp_date if ai_data is not None else '', temp_date=template_date,
target=ai_data.target if ai_data is not None else '', target=target_show,
show=data_cleansing(_show), show=data_cleansing(_show),
sales=_sales, sales=_sales,
prompt=prompt, prompt=prompt,
@ -144,6 +149,7 @@ def show_manual_process(zz_code: str, show_date: str, prompt: str):
take_times=int((end - start).seconds), take_times=int((end - start).seconds),
take_tokens=tokens, take_tokens=tokens,
prompt_version=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), prompt_version=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
create_datetime=datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S'),
) )
except Exception as e: except Exception as e:
print(e) print(e)

@ -202,7 +202,7 @@ SELECT cmi.cinema_movie_alias,
cmi.cinema_movie_id, cmi.cinema_movie_id,
cmi.cinema_movie_time, cmi.cinema_movie_time,
cmlt.cinema_movie_lang_type_desc as language, cmlt.cinema_movie_lang_type_desc as language,
scvm.system_const_val_desc as media_type, scvm.system_const_val_desc as media_type,
cmi.cinema_movie_start_datetime, cmi.cinema_movie_start_datetime,
cmi.cinema_movie_end_datetime cmi.cinema_movie_end_datetime
FROM cinema_movie_info cmi FROM cinema_movie_info cmi
@ -210,11 +210,13 @@ FROM cinema_movie_info cmi
JOIN system_const_val_map scvm ON cmi.cinema_movie_media_type = scvm.system_const_val_value JOIN system_const_val_map scvm ON cmi.cinema_movie_media_type = scvm.system_const_val_value
WHERE scvm.system_const_sub_module = 'new_media_type' WHERE scvm.system_const_sub_module = 'new_media_type'
AND cmi.cinema_movie_id IN (SELECT ms.cinema_movie_id AND cmi.cinema_movie_id IN (SELECT ms.cinema_movie_id
FROM cinema_movie_show ms FROM cinema_movie_show ms
WHERE ms.cinema_del_flag = 1 WHERE ms.cinema_del_flag = 1
AND ms.cinema_movie_show_start_time >= %s AND ms.cinema_movie_show_start_time >= %s
AND ms.cinema_movie_show_start_time <= %s AND ms.cinema_movie_show_start_time <= %s
GROUP BY ms.cinema_movie_num) AND cmi.cinema_movie_num NOT IN ( GROUP BY ms.cinema_movie_num)
AND cmi.cinema_movie_end_datetime > %s
AND cmi.cinema_movie_num NOT IN ('
""" """
# 获取新上映的影片 # 获取新上映的影片

@ -1,5 +1,6 @@
from anyio import sleep from anyio import sleep
from django.http import JsonResponse from django.http import JsonResponse
from django.utils.timezone import make_aware, utc
from django.db.models import Q from django.db.models import Q
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
import json import json
@ -70,15 +71,14 @@ def report(request):
if test is None or test == '': if test is None or test == '':
last_ai_data = AiShow.objects.filter(Q(is_ai_show=True) & last_ai_data = AiShow.objects.filter(Q(is_ai_show=True) &
Q(is_manual_test=False) &
Q(zz_code=zz_code) & Q(zz_code=zz_code) &
Q(show_date=show_date)).order_by('-id').first() Q(show_date=show_date)).order_by('-id').first()
else: else:
print('test', test)
last_ai_data = AiShow.objects.filter(Q(is_ai_show=True) & last_ai_data = AiShow.objects.filter(Q(is_ai_show=True) &
Q(is_manual_test=True) &
Q(zz_code=zz_code) & Q(zz_code=zz_code) &
Q(show_date=show_date) & Q(show_date=show_date) &
Q(prompt_version=test)).order_by('-id').first() Q(create_datetime=test)).first()
if not last_ai_data: if not last_ai_data:
result_dict = { result_dict = {
'status': 'Failure', 'status': 'Failure',
@ -102,9 +102,7 @@ def report(request):
real_count, real_total = count_show(real_dict) real_count, real_total = count_show(real_dict)
target_count, target_total = count_show(target_dict) target_count, target_total = count_show(target_dict)
template_count, template_total = count_show(temp_dict) template_count, template_total = count_show(temp_dict)
# 生成时间
create_time = datetime.datetime.strftime((last_ai_data.created_at + datetime.timedelta(hours=8)),
'%Y-%m-%d %H:%M:%S')
if last_ai_data.ai_model in ['lmstudio_qwen3.6_35b', 'company_qwen3.5_35b']: if last_ai_data.ai_model in ['lmstudio_qwen3.6_35b', 'company_qwen3.5_35b']:
think = json.loads(last_ai_data.message)['choices'][0]['message']['reasoning'] think = json.loads(last_ai_data.message)['choices'][0]['message']['reasoning']
else: else:
@ -136,15 +134,18 @@ def report(request):
'target_total': target_total, 'target_total': target_total,
'template_total': template_total, 'template_total': template_total,
'result': last_ai_data.result, 'result': last_ai_data.result,
'is_manual_test': last_ai_data.is_manual_test,
'prompt_version': last_ai_data.prompt_version,
'think': think, 'think': think,
'ai_model': last_ai_data.ai_model, 'ai_model': last_ai_data.ai_model,
'create_time': create_time 'create_time': last_ai_data.create_datetime
} }
} }
print(result_dict) print(result_dict)
return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False}) return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False})
# 获取已经生成排片的日期范围
@csrf_exempt @csrf_exempt
def get_report_date_api(request): def get_report_date_api(request):
start, end = get_report_date() start, end = get_report_date()
@ -208,6 +209,7 @@ def get_test_date(request):
return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False}) return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False})
# 获取指定日和和影院的提示词用于手动验证
@csrf_exempt @csrf_exempt
def get_prompt(request): def get_prompt(request):
cinema_code = request.GET.get('cinema_code') cinema_code = request.GET.get('cinema_code')
@ -218,4 +220,4 @@ def get_prompt(request):
'data': get_prompt_process(cinema_code, show_date) 'data': get_prompt_process(cinema_code, show_date)
} }
print(result_dict) print(result_dict)
return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False}) return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False})

@ -1 +1 @@
ENV = 'local' ENV = ('dev')

@ -79,7 +79,7 @@ class GetVersion(object):
if cinema_config.get('url').endswith('cinema.yhz.com'): if cinema_config.get('url').endswith('cinema.yhz.com'):
is_cloud = 'SAAS版' is_cloud = 'SAAS版'
else: else:
is_cloud = '云版本' if res.get('dx_sys_version', '--') == 'CLOUD' else '--', is_cloud = '云版本' if res.get('dx_sys_version', '--') == 'CLOUD' else '--'
update_data = { update_data = {
'name': res['cinema_name'], 'name': res['cinema_name'],
'zz_num': res['cinema_num'], 'zz_num': res['cinema_num'],

Loading…
Cancel
Save