diff --git a/ai/models.py b/ai/models.py index 93867c1..2e438f0 100644 --- a/ai/models.py +++ b/ai/models.py @@ -57,3 +57,18 @@ class AiShow(models.Model): verbose_name = 'AI排片数据' verbose_name_plural = 'AI排片数据' db_table = 'ai_show_result' + + +class CinemaHall(models.Model): + id = models.AutoField(primary_key=True) + cinema_code = models.CharField(max_length=50) + hall_id = models.CharField(max_length=50) + hall_name = models.CharField(max_length=50) + + def __str__(self): + return self.hall_name + + class Meta: + verbose_name = '影厅数据' + verbose_name_plural = '影厅数据' + db_table = 'ai_show_hall' \ No newline at end of file diff --git a/ai/utils/show_database.py b/ai/utils/show_database.py index c7067b6..920e778 100644 --- a/ai/utils/show_database.py +++ b/ai/utils/show_database.py @@ -1,14 +1,18 @@ import pymysql from pymysql.cursors import DictCursor +from ai.models import * +from ai.models import TestCinema from ai.utils.sql import * import datetime import pandas as pd +import json class GetData: - def __init__(self, db_config): - self.conn = pymysql.connect(**db_config) + def __init__(self, cinema): + self.conn = pymysql.connect(**json.loads(cinema.db_config)) self.cur = self.conn.cursor(cursor=DictCursor) + self.zz_code = cinema.zz_code def exit(self): try: @@ -64,9 +68,9 @@ class GetData: # 获取指定日期的可放映影片 def get_available_movie(self, date): - start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6) - end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, - seconds=59) + start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, + seconds=59) + end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6) self.cur.execute(GET_AVAILABLE_MOVIE, (start_datetime, end_datetime)) available_movie = self.cur.fetchall() available_movie_list = [ @@ -74,6 +78,19 @@ class GetData: for m in available_movie] return '\n'.join(available_movie_list) + # 获取指定日期的可用于排片的影片 + def get_handle_movie(self, date): + start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, + seconds=59) + end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6) + black_list = json.loads(TestCinema.objects.filter(zz_code=self.zz_code).first().user_config)['movie_black_list'] + self.cur.execute(GET_HANDLE_MOVIE, (start_datetime, end_datetime, black_list)) + available_movie = self.cur.fetchall() + available_movie_list = [ + f"\t《{m['cinema_movie_alias']}》 - 影片id:{m['cinema_movie_id']},影片时长:{m['cinema_movie_time']},语言:{m['language']},制式:{m['media_type']}, 最早排片开始时间:{m['cinema_movie_start_datetime']}, 最晚排片截止时间:{m['cinema_movie_end_datetime']};" + for m in available_movie] + return '\n'.join(available_movie_list) + # 获取新上映的影片 def get_new_movie(self, date): start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') @@ -122,15 +139,3 @@ class GetData: def get_media_type(self): self.cur.execute(GET_HALL_MEDIA_TYPE) - - -if __name__ == '__main__': - from main import cinema_list - - data = GetData(cinema_list[0]['db']) - # print(data.get_show_data('2026-05-28 06:00:00', '2026-06-04 05:59:59')) - # print(data.get_sell_data('2026-05-28 06:00:00', '2026-06-04 05:59:59')) - # print(data.get_available_movie('2026-06-05')) - print(data.get_new_movie('2026-06-05')) - # print(data.get_hall_media_type()) - # print(data.get_template_date('2026-05-28 06:00:00', '2026-06-04 05:59:59')) diff --git a/ai/utils/show_prompt.py b/ai/utils/show_prompt.py index cd84653..114fa29 100644 --- a/ai/utils/show_prompt.py +++ b/ai/utils/show_prompt.py @@ -10,9 +10,10 @@ from openai import OpenAI class ShowAI: def __init__(self, cinema_info, show_date): - self.cinema_name = cinema_info.name - self.cinema_zz_code = cinema_info.zz_code - self.cinema_db_config = json.loads(cinema_info.db_config) + self.cinema = cinema_info + # self.cinema_name = cinema_info.name + # self.cinema_zz_code = cinema_info.zz_code + # self.cinema_db_config = json.loads(cinema_info.db_config) self.user_config = json.loads(cinema_info.user_config) self.show_date = show_date self.prompt = "" @@ -23,7 +24,7 @@ class ShowAI: # 生成提示词 def general_prompt(self): - data = GetData(self.cinema_db_config) + data = GetData(self.cinema) # 准备各种日期时间 history_start, history_end, target_start, target_end = get_data_datetime(self.show_date) temp = datetime.datetime.strftime(data.get_template_date(history_start, history_end), '%Y-%m-%d') @@ -54,7 +55,8 @@ class ShowAI: # 处理影片和影厅信息 movie_hall = PromptTemplate.objects.filter( Q(del_flag=False) & Q(prompt_type='show') & Q(prompt_key='MovieHall')).first().prompt_val # 获取提示词模板 - movie_hall = movie_hall.replace('{available_movie}', data.get_available_movie(self.show_date)) # 处理可排影片 + movie_hall = movie_hall.replace('{available_movie}', data.get_available_movie(self.show_date)) # 处理上映影片 + movie_hall = movie_hall.replace('{handle_movie}', data.get_handle_movie(self.show_date)) # 处理可排影片 movie_hall = movie_hall.replace('{hall_info}', data.get_hall_media_type()) # 处理影厅信息 free_hall = self.user_config['holiday_date_free_hall'] if target_date_is_holiday else self.user_config[ 'holiday_date_free_hall'] @@ -74,7 +76,8 @@ class ShowAI: new_movie_str_list.append( f"\t增加{new}的场次,建议排{str(random.randint(2, 4))}场,可根据影片热度和口碑适当增加;") rules = rules.replace('{new_movie}', - '\t无新片上映' if len(new_movie_str_list) == 0 else '\n'.join(new_movie_str_list)) # 处理新片数据 + '\t无新片上映' if len(new_movie_str_list) == 0 else '\n'.join( + new_movie_str_list)) # 处理新片数据 prompt_list.append(rules) # 处理基本规则 diff --git a/ai/utils/sql.py b/ai/utils/sql.py index 05d2f31..c337857 100644 --- a/ai/utils/sql.py +++ b/ai/utils/sql.py @@ -108,6 +108,24 @@ WHERE scvm.system_const_sub_module = 'new_media_type' AND cmi.cinema_movie_end_datetime > %s; """ +# 获取指定日期的可用于排片的影片 +GET_HANDLE_MOVIE = """ +SELECT cmi.cinema_movie_alias, + cmi.cinema_movie_id, + cmi.cinema_movie_time, + cmlt.cinema_movie_lang_type_desc as language, + scvm.system_const_val_desc as media_type, + cmi.cinema_movie_start_datetime, + cmi.cinema_movie_end_datetime +FROM cinema_movie_info cmi + JOIN cinema_movie_lang_type cmlt ON cmi.cinema_movie_lang_id = cmlt.cinema_movie_lang_type_id + 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' + AND cmi.cinema_movie_start_datetime <= %s + AND cmi.cinema_movie_end_datetime > %s + AND cmi.cinema_movie_id NOT IN (%s); +""" + # 获取新上映的影片 GET_NEW_MOVIE = """SELECT cmi.cinema_movie_alias, cmi.cinema_movie_id, diff --git a/ai/views.py b/ai/views.py index fd7aed6..00c7e82 100644 --- a/ai/views.py +++ b/ai/views.py @@ -38,7 +38,7 @@ def get_cinema_show_result(request): income = '' if cinema: print(cinema) - data = GetData(json.loads(cinema.db_config)) + data = GetData(cinema) show = data.get_show_data(start, end) income = data.get_total_income(start, end) print(show, income) @@ -79,3 +79,7 @@ def clear_lock(request): 'message': '完成', } return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False}) + +# @csrf_exempt +# def show_diff(request): +# # \ No newline at end of file