From 281d666036f4d8cbeb68596d9a951d268c3e591f Mon Sep 17 00:00:00 2001 From: rogersun Date: Mon, 20 Jul 2026 11:37:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8F=AF=E6=8E=92=E5=BD=B1?= =?UTF-8?q?=E7=89=87=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai/utils/manual_utils.py | 74 ++++++++++++++++++++++++++++++- ai/utils/show_database.py | 78 ++++++++++++++++++++++++--------- ai/utils/show_func.py | 30 +++++++++++++ ai/utils/sql.py | 54 +++++++++++++++++++++++ ai/views.py | 9 +++- dingxin_toolbox_drf/settings.py | 2 +- 6 files changed, 223 insertions(+), 24 deletions(-) diff --git a/ai/utils/manual_utils.py b/ai/utils/manual_utils.py index ed2830b..18c3a09 100644 --- a/ai/utils/manual_utils.py +++ b/ai/utils/manual_utils.py @@ -1,4 +1,5 @@ import csv +import json from io import StringIO import pymysql from pymysql.cursors import DictCursor @@ -54,6 +55,61 @@ s = """ 2楼 三江VIP厅,9,特立独行,4280,国语,2026-07-14,20:20,22:23,123,11 """ +json_str = """[ +{"hall_name": "IMAX厅(儿童需购票)", "hall_id": "1", "movie_alias": "小黄人与大怪兽(IMAX 2D/原声)", "movie_id": "3736", "language": "原声", "show_date": "2026-07-18", "start": "09:00", "end": "10:30", "length": "90", "duration": "0"}, +{"hall_name": "IMAX厅(儿童需购票)", "hall_id": "1", "movie_alias": "八仙!(IMAX 2D/国语)", "movie_id": "3756", "language": "国语", "show_date": "2026-07-18", "start": "10:40", "end": "13:04", "length": "144", "duration": "10"}, +{"hall_name": "IMAX厅(儿童需购票)", "hall_id": "1", "movie_alias": "抓特务(IMAX 2D/国语)", "movie_id": "3754", "language": "国语", "show_date": "2026-07-18", "start": "14:00", "end": "16:21", "length": "141", "duration": "56"}, +{"hall_name": "IMAX厅(儿童需购票)", "hall_id": "1", "movie_alias": "八仙!(IMAX 2D/国语)", "movie_id": "3756", "language": "国语", "show_date": "2026-07-18", "start": "17:00", "end": "19:24", "length": "144", "duration": "39"}, +{"hall_name": "IMAX厅(儿童需购票)", "hall_id": "1", "movie_alias": "八仙!(IMAX 2D/国语)", "movie_id": "3756", "language": "国语", "show_date": "2026-07-18", "start": "19:45", "end": "22:09", "length": "144", "duration": "21"}, +{"hall_name": "IMAX厅(儿童需购票)", "hall_id": "1", "movie_alias": "八仙!(IMAX 2D/国语)", "movie_id": "3756", "language": "国语", "show_date": "2026-07-18", "start": "22:30", "end": "00:54", "length": "144", "duration": "21"}, +{"hall_name": "4号厅", "hall_id": "4", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "10:30", "end": "12:54", "length": "144", "duration": "0"}, +{"hall_name": "4号厅", "hall_id": "4", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "13:15", "end": "15:39", "length": "144", "duration": "21"}, +{"hall_name": "4号厅", "hall_id": "4", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "16:00", "end": "18:24", "length": "144", "duration": "21"}, +{"hall_name": "4号厅", "hall_id": "4", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "18:45", "end": "21:09", "length": "144", "duration": "21"}, +{"hall_name": "4号厅", "hall_id": "4", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "21:30", "end": "23:54", "length": "144", "duration": "21"}, +{"hall_name": "5号厅", "hall_id": "5", "movie_alias": "四渡(2D/国语)", "movie_id": "3717", "language": "国语", "show_date": "2026-07-18", "start": "10:00", "end": "12:02", "length": "122", "duration": "0"}, +{"hall_name": "5号厅", "hall_id": "5", "movie_alias": "想你了(2D/国语)", "movie_id": "3755", "language": "国语", "show_date": "2026-07-18", "start": "12:20", "end": "14:07", "length": "107", "duration": "18"}, +{"hall_name": "5号厅", "hall_id": "5", "movie_alias": "想你了(2D/国语)", "movie_id": "3755", "language": "国语", "show_date": "2026-07-18", "start": "14:25", "end": "16:12", "length": "107", "duration": "18"}, +{"hall_name": "5号厅", "hall_id": "5", "movie_alias": "想你了(2D/国语)", "movie_id": "3755", "language": "国语", "show_date": "2026-07-18", "start": "16:30", "end": "18:17", "length": "107", "duration": "18"}, +{"hall_name": "5号厅", "hall_id": "5", "movie_alias": "想你了(2D/国语)", "movie_id": "3755", "language": "国语", "show_date": "2026-07-18", "start": "18:35", "end": "20:22", "length": "107", "duration": "18"}, +{"hall_name": "5号厅", "hall_id": "5", "movie_alias": "哈姆雷特(2D/原声)", "movie_id": "3757", "language": "原声", "show_date": "2026-07-18", "start": "20:40", "end": "23:35", "length": "175", "duration": "18"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "09:20", "end": "10:59", "length": "99", "duration": "0"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "11:20", "end": "12:59", "length": "99", "duration": "21"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "13:20", "end": "14:59", "length": "99", "duration": "21"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "15:20", "end": "16:59", "length": "99", "duration": "21"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "17:20", "end": "18:59", "length": "99", "duration": "21"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "19:17", "end": "20:56", "length": "99", "duration": "18"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "21:15", "end": "22:54", "length": "99", "duration": "19"}, +{"hall_name": "6号厅(有无障碍服务)", "hall_id": "6", "movie_alias": "恐怖游轮(2D/原声)", "movie_id": "3751", "language": "原声", "show_date": "2026-07-18", "start": "23:15", "end": "00:54", "length": "99", "duration": "21"}, +{"hall_name": "RealD Cinema 厅(儿童需购票)有无障碍服务", "hall_id": "7", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "09:45", "end": "12:09", "length": "144", "duration": "0"}, +{"hall_name": "RealD Cinema 厅(儿童需购票)有无障碍服务", "hall_id": "7", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "12:30", "end": "14:54", "length": "144", "duration": "21"}, +{"hall_name": "RealD Cinema 厅(儿童需购票)有无障碍服务", "hall_id": "7", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "15:15", "end": "17:39", "length": "144", "duration": "21"}, +{"hall_name": "RealD Cinema 厅(儿童需购票)有无障碍服务", "hall_id": "7", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "18:00", "end": "20:24", "length": "144", "duration": "21"}, +{"hall_name": "RealD Cinema 厅(儿童需购票)有无障碍服务", "hall_id": "7", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "20:45", "end": "23:09", "length": "144", "duration": "21"}, +{"hall_name": "RealD Cinema 厅(儿童需购票)有无障碍服务", "hall_id": "7", "movie_alias": "八仙!(2D/国语)", "movie_id": "3753", "language": "国语", "show_date": "2026-07-18", "start": "23:30", "end": "01:54", "length": "144", "duration": "21"}, +{"hall_name": "Onyx LED 厅(儿童需购票)", "hall_id": "8", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "09:55", "end": "11:41", "length": "106", "duration": "0"}, +{"hall_name": "Onyx LED 厅(儿童需购票)", "hall_id": "8", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "12:00", "end": "13:46", "length": "106", "duration": "19"}, +{"hall_name": "Onyx LED 厅(儿童需购票)", "hall_id": "8", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "14:05", "end": "15:51", "length": "106", "duration": "19"}, +{"hall_name": "Onyx LED 厅(儿童需购票)", "hall_id": "8", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "16:10", "end": "17:56", "length": "106", "duration": "19"}, +{"hall_name": "Onyx LED 厅(儿童需购票)", "hall_id": "8", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "18:15", "end": "20:01", "length": "106", "duration": "19"}, +{"hall_name": "Onyx LED 厅(儿童需购票)", "hall_id": "8", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "20:20", "end": "22:06", "length": "106", "duration": "19"}, +{"hall_name": "Onyx LED 厅(儿童需购票)", "hall_id": "8", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "22:25", "end": "00:11", "length": "106", "duration": "19"}, +{"hall_name": "9号厅", "hall_id": "9", "movie_alias": "三国第一部:争洛阳(2D/国语)", "movie_id": "3738", "language": "国语", "show_date": "2026-07-18", "start": "09:45", "end": "12:02", "length": "137", "duration": "0"}, +{"hall_name": "9号厅", "hall_id": "9", "movie_alias": "三国第一部:争洛阳(2D/国语)", "movie_id": "3738", "language": "国语", "show_date": "2026-07-18", "start": "12:20", "end": "14:37", "length": "137", "duration": "18"}, +{"hall_name": "9号厅", "hall_id": "9", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "15:00", "end": "16:46", "length": "106", "duration": "23"}, +{"hall_name": "9号厅", "hall_id": "9", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "17:05", "end": "18:51", "length": "106", "duration": "19"}, +{"hall_name": "9号厅", "hall_id": "9", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "19:10", "end": "20:56", "length": "106", "duration": "19"}, +{"hall_name": "9号厅", "hall_id": "9", "movie_alias": "三国第一部:争洛阳(2D/国语)", "movie_id": "3738", "language": "国语", "show_date": "2026-07-18", "start": "21:15", "end": "23:32", "length": "137", "duration": "19"}, +{"hall_name": "9号厅", "hall_id": "9", "movie_alias": "三国第一部:争洛阳(2D/国语)", "movie_id": "3738", "language": "国语", "show_date": "2026-07-18", "start": "23:50", "end": "02:07", "length": "137", "duration": "18"}, +{"hall_name": "4DX 厅(儿童需购票)", "hall_id": "10", "movie_alias": "玩具总动员5(4DX3D/原声)", "movie_id": "3722", "language": "原声", "show_date": "2026-07-18", "start": "09:00", "end": "10:42", "length": "102", "duration": "0"}, +{"hall_name": "4DX 厅(儿童需购票)", "hall_id": "10", "movie_alias": "玩具总动员5(4DX3D/原声)", "movie_id": "3722", "language": "原声", "show_date": "2026-07-18", "start": "11:00", "end": "12:42", "length": "102", "duration": "18"}, +{"hall_name": "4DX 厅(儿童需购票)", "hall_id": "10", "movie_alias": "功夫女足(2D/国语)", "movie_id": "3743", "language": "国语", "show_date": "2026-07-18", "start": "14:00", "end": "15:46", "length": "106", "duration": "78"}, +{"hall_name": "4DX 厅(儿童需购票)", "hall_id": "10", "movie_alias": "特立独行(2D/国语)", "movie_id": "3742", "language": "国语", "show_date": "2026-07-18", "start": "16:05", "end": "18:08", "length": "123", "duration": "19"}, +{"hall_name": "4DX 厅(儿童需购票)", "hall_id": "10", "movie_alias": "后室(4DX2D/原声)", "movie_id": "3730", "language": "原声", "show_date": "2026-07-18", "start": "18:25", "end": "20:16", "length": "111", "duration": "17"}, +{"hall_name": "4DX 厅(儿童需购票)", "hall_id": "10", "movie_alias": "后室(4DX2D/原声)", "movie_id": "3730", "language": "原声", "show_date": "2026-07-18", "start": "20:35", "end": "22:26", "length": "111", "duration": "19"}, +{"hall_name": "4DX 厅(儿童需购票)", "hall_id": "10", "movie_alias": "后室(4DX2D/原声)", "movie_id": "3730", "language": "原声", "show_date": "2026-07-18", "start": "22:45", "end": "00:36", "length": "111", "duration": "19"} +]""" + # 将csv转化成字典 def csv_to_obj(csv_data): @@ -126,6 +182,22 @@ def show_data(zz_code: str, show_date: str): print(hall_show_count) +def parse_json(json_data: str): + data = json.loads(json_data) + movie = dict() + total = 0 + for d in data: + total += 1 + if d['movie_alias'] not in movie.keys(): + movie[d['movie_alias']] = 1 + else: + movie[d['movie_alias']] += 1 + print(total) + for key, value in movie.items(): + print(key, round(value / total * 100, 2)) + + if __name__ == '__main__': - count_data(csv_to_obj(s)) + # count_data(csv_to_obj(s)) # show_data('33040301', '2026-07-13') + parse_json(json_str) diff --git a/ai/utils/show_database.py b/ai/utils/show_database.py index 4a8645f..ac424a3 100644 --- a/ai/utils/show_database.py +++ b/ai/utils/show_database.py @@ -58,6 +58,7 @@ class GetData: # 获取指定日期的可用于排片的影片 def get_handle_movie(self, date): + new = None if get_runtime_val('real_target') == '0': movie_date_start = datetime.datetime.today().replace(hour=6, minute=0, second=0, microsecond=0) movie_date_end = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, @@ -73,21 +74,51 @@ class GetData: sql = GET_HANDLE_MOVIE_TEST + bl_str + ');' print(self.cur.mogrify(sql, (movie_date_start, movie_date_end, show_date_limit))) self.cur.execute(sql, (movie_date_start, movie_date_end, show_date_limit)) + available_movie = self.cur.fetchall() else: - 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) + limit_end = datetime.datetime.today().replace(hour=6, minute=0, second=0, microsecond=0) + limit_start = limit_end + datetime.timedelta(days=-7) + print(self.cur.mogrify(GET_SHOW_COUNT_LIMIT, (limit_start, limit_end))) + self.cur.execute(GET_SHOW_COUNT_LIMIT, (limit_start, limit_end)) + limit = int(self.cur.fetchone()['limit_count']) + + show_start = datetime.datetime.today().replace(hour=6, minute=0, second=0, microsecond=0) + show_end = datetime.datetime.strptime(date, '%Y-%m-%d').replace(hour=6, minute=0, second=0, microsecond=0) + movie_end = datetime.datetime.strptime(date, '%Y-%m-%d').replace(hour=6, minute=0, second=0, microsecond=0) + movie_start = movie_end + datetime.timedelta(days=1) bl_bool, bl_str, bl_list = get_black_list(self.zz_code) if bl_bool: - sql = GET_HANDLE_MOVIE + bl_str + ');' - print(self.cur.mogrify(sql, (start_datetime, end_datetime, *bl_list))) - self.cur.execute(sql, (start_datetime, end_datetime, *bl_list)) + sql = GET_MOVIE_INFO_BY_INCOME_AND_COUNT_START + bl_str + GET_MOVIE_INFO_BY_INCOME_AND_COUNT_END + print(self.cur.mogrify(sql, (show_start, show_end, movie_start, movie_end, *bl_list, limit))) + self.cur.execute(sql, (show_start, show_end, movie_start, movie_end, *bl_list, limit)) else: - sql = GET_HANDLE_MOVIE + bl_str + ');' - print(self.cur.mogrify(sql, (start_datetime, end_datetime))) - self.cur.execute(sql, (start_datetime, end_datetime)) - available_movie = self.cur.fetchall() + sql = GET_MOVIE_INFO_BY_INCOME_AND_COUNT_START + bl_str + GET_MOVIE_INFO_BY_INCOME_AND_COUNT_END + print(self.cur.mogrify(sql, (show_start, show_end, movie_start, movie_end, limit))) + self.cur.execute(sql, (show_start, show_end, movie_start, movie_end, limit)) + available_movie = self.cur.fetchall() + if len(available_movie) == 0: + show_end = datetime.datetime.today().replace(hour=6, minute=0, second=0, microsecond=0) + show_start = limit_end + datetime.timedelta(days=-3) + if bl_bool: + + sql = GET_MOVIE_INFO_BY_INCOME_AND_COUNT_START + bl_str + GET_MOVIE_INFO_BY_INCOME_AND_COUNT_END + print(self.cur.mogrify(sql, (show_start, show_end, movie_start, movie_end, *bl_list, limit))) + self.cur.execute(sql, (show_start, show_end, movie_start, movie_end, *bl_list, limit)) + else: + sql = GET_MOVIE_INFO_BY_INCOME_AND_COUNT_START + bl_str + GET_MOVIE_INFO_BY_INCOME_AND_COUNT_END + print(self.cur.mogrify(sql, (show_start, show_end, movie_start, movie_end, limit))) + self.cur.execute(sql, (show_start, show_end, movie_start, movie_end, limit)) + available_movie = self.cur.fetchall() + + new_start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + new_end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, + seconds=59) + self.cur.execute(GET_NEW_MOVIE, (new_start_datetime, new_end_datetime)) + new = self.cur.fetchall() + + if new is not None and len(new) > 0: + list(available_movie).extend(list(new)) 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] @@ -183,6 +214,21 @@ class GetData: # 按工作日和节假日计算销售数据 def get_sell_data_by_day_type(self, start_datetime, end_datetime): + movie_sell_data_list = self.get_sell_data_by_day_type_obj(start_datetime, end_datetime) + sell_data_mapping = { + 'movie_alias_name': '影片别名', + 'movie_id': '本地影片id', + 'average_viewer_workday': '场均人次(工作日)', + 'average_ticket_price_workday': '平均票价(工作日)', + 'average_income_workday': '场均收入(工作日)', + 'average_viewer_holiday': '场均人次(节假日)', + 'average_ticket_price_holiday': '平均票价(节假日)', + 'average_income_holiday': '场均收入(节假日)', + } + return self.format_to_csv(movie_sell_data_list, sell_data_mapping) + + # 按工作日和节假日计算销售数据通用方法 + def get_sell_data_by_day_type_obj(self, start_datetime, end_datetime=None): # 获取过去7天的数据 print('get_sell_data_by_day_type_start_datetime', start_datetime) date_list = [datetime.datetime.strptime(start_datetime, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=n) for n @@ -249,17 +295,7 @@ class GetData: 'average_income_holiday': round( float(0 if m['show']['holiday'] == 0 else m['income']['holiday'] / m['show']['holiday']), 2), }) - sell_data_mapping = { - 'movie_alias_name': '影片别名', - 'movie_id': '本地影片id', - 'average_viewer_workday': '场均人次(工作日)', - 'average_ticket_price_workday': '平均票价(工作日)', - 'average_income_workday': '场均收入(工作日)', - 'average_viewer_holiday': '场均人次(节假日)', - 'average_ticket_price_holiday': '平均票价(节假日)', - 'average_income_holiday': '场均收入(节假日)', - } - return self.format_to_csv(movie_sell_data_list, sell_data_mapping) + return movie_sell_data_list # 获取指定范围的影片销售总额 def get_total_income(self, start_datetime, end_datetime): diff --git a/ai/utils/show_func.py b/ai/utils/show_func.py index 23a39fe..90daf05 100644 --- a/ai/utils/show_func.py +++ b/ai/utils/show_func.py @@ -216,3 +216,33 @@ def get_test_date_from_db(cinema_code: str, show_date: str) -> list: test_data = AiShow.objects.filter( Q(zz_code=cinema_code) & Q(show_date=show_date) & Q(is_ai_show=True)).order_by('-create_datetime').all() return [(test.create_datetime, test.is_manual_test) for test in test_data] + + +def self_count(cinema_code, show_date:str, show_data:dict): + _is_holiday = is_holiday(datetime.datetime.strptime(show_date, '%Y-%m-%d')) + cinema = TestCinema.objects.filter(zz_code=cinema_code).first() + data = GetData(cinema) + sell_data = data.get_sell_data_by_day_type_obj(show_date+' 06:00:00') + print('self_count-sell_data', sell_data) + show_dict = dict() + for show in show_data: + if show['影片别名'] not in show_dict.keys(): + income = 0 + for sell in sell_data: + if str(show['本地影片id']) == str(sell['movie_id']): + income = sell['average_income_holiday'] if _is_holiday is True else sell['average_income_workday'] + show_dict[show['影片别名']] = { + 'count': 1, + 'average_income': income + + } + else: + show_dict[show['影片别名']]['count'] += 1 + + show_list = [] + for show, info in show_dict.items(): + show_list.append(f"{show}: 共{info['count']}场,历史场均{info['average_income']}元") + total = 0 + for info in show_dict.values(): + total += info['count'] * info['average_income'] + return show_list, total diff --git a/ai/utils/sql.py b/ai/utils/sql.py index 8950e49..08b43c1 100644 --- a/ai/utils/sql.py +++ b/ai/utils/sql.py @@ -322,3 +322,57 @@ FROM cinema_movie_info cmi WHERE cmi.cinema_movie_start_datetime <= %s AND cmi.cinema_movie_end_datetime > %s AND cmi.cinema_movie_num NOT IN (""" + +GET_MOVIE_INFO_BY_INCOME_AND_COUNT_START = """ +SELECT sd.cinema_movie_alias, + sd.cinema_movie_num, + sd.cinema_movie_id, + sd.cinema_movie_time, + sd.language, + sd.media_type, + sd.cinema_movie_start_datetime, + sd.cinema_movie_end_datetime, + SUM(sd.total_income) total_income, + COUNT(sd.cinema_movie_show_id) show_count +FROM (SELECT mi.cinema_movie_alias, + mi.cinema_movie_num, + mi.cinema_movie_id, + mi.cinema_movie_time, + cmlt.cinema_movie_lang_type_desc as language, + scvm.system_const_val_desc as media_type, + mi.cinema_movie_start_datetime, + mi.cinema_movie_end_datetime, + CAST(ms.cinema_movie_show_id AS CHAR) cinema_movie_show_id, + SUM(IF(sl.cinema_ticket_status <> 3, sl.cinema_ticket_income, 0)) total_income + FROM cinema_movie_show ms + LEFT JOIN cinema_sell_log sl ON ms.cinema_movie_show_id = sl.cinema_movie_show_id + JOIN cinema_movie_info mi ON ms.cinema_movie_id = mi.cinema_movie_id + JOIN cinema_hall_info hi ON ms.cinema_hall_id = hi.cinema_hall_id + JOIN cinema_movie_lang_type cmlt ON mi.cinema_movie_lang_id = cmlt.cinema_movie_lang_type_id + JOIN system_const_val_map scvm ON mi.cinema_movie_media_type = scvm.system_const_val_value + WHERE ms.cinema_movie_show_joinflg = 0 + AND ms.cinema_movie_show_start_time >= %s + AND ms.cinema_movie_show_start_time <= %s + AND ms.cinema_del_flag = 1 + AND mi.cinema_movie_start_datetime < %s + AND mi.cinema_movie_end_datetime > %s + AND NOT (ms.cinema_movie_show_sold_num = 0 AND ms.cinema_movie_show_status <> 1) + GROUP BY ms.cinema_movie_show_id, CAST(ms.cinema_movie_show_id AS CHAR)) sd +WHERE sd.cinema_movie_num NOT IN ( +""" + +GET_MOVIE_INFO_BY_INCOME_AND_COUNT_END = """ +) +GROUP BY sd.cinema_movie_id +ORDER BY total_income DESC, show_count DESC +LIMIT %s;""" + +GET_SHOW_COUNT_LIMIT = """ +SELECT FLOOR(COUNT(dc.date_count) / 7) limit_count +FROM (SELECT cms.cinema_movie_show_start_date, cms.cinema_movie_id, COUNT(cms.cinema_movie_id) date_count + FROM cinema_movie_show cms + WHERE cms.cinema_movie_show_start_date > %s + AND cms.cinema_movie_show_start_date < %s + AND cms.cinema_del_flag = 1 + GROUP BY cms.cinema_movie_show_start_date, cms.cinema_movie_id) dc; +""" diff --git a/ai/views.py b/ai/views.py index ba9a727..f3f4d59 100644 --- a/ai/views.py +++ b/ai/views.py @@ -103,6 +103,9 @@ def report(request): target_count, target_total = count_show(target_dict) template_count, template_total = count_show(temp_dict) + ai_count_detail, ai_count_total = self_count(zz_code, show_date, ai_dict) + real_count_detail, real_count_total = self_count(zz_code, show_date, real_dict) + 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'] else: @@ -138,7 +141,11 @@ def report(request): 'prompt_version': last_ai_data.prompt_version, 'think': think, 'ai_model': last_ai_data.ai_model, - 'create_time': last_ai_data.create_datetime + 'create_time': last_ai_data.create_datetime, + 'ai_count_detail': ai_count_detail, + 'ai_count_total': ai_count_total, + 'real_count_detail': real_count_detail, + 'real_count_total': real_count_total, } } print(result_dict) diff --git a/dingxin_toolbox_drf/settings.py b/dingxin_toolbox_drf/settings.py index 6616e85..9baf6b4 100644 --- a/dingxin_toolbox_drf/settings.py +++ b/dingxin_toolbox_drf/settings.py @@ -42,7 +42,7 @@ CONFIG = { "USER": "test", "PASSWORD": "cine123456", }, - 'REDIS_IP': '172.16.1.168', + 'REDIS_IP': '127.0.0.1', 'ECARD_DB': { "HOST": '10.10.0.61', "PORT": 3306,