修正可排影片的逻辑

main
rogersun 4 weeks ago
parent 5c5952ee49
commit 281d666036
  1. 74
      ai/utils/manual_utils.py
  2. 76
      ai/utils/show_database.py
  3. 30
      ai/utils/show_func.py
  4. 54
      ai/utils/sql.py
  5. 9
      ai/views.py
  6. 2
      dingxin_toolbox_drf/settings.py

@ -1,4 +1,5 @@
import csv import csv
import json
from io import StringIO from io import StringIO
import pymysql import pymysql
from pymysql.cursors import DictCursor from pymysql.cursors import DictCursor
@ -54,6 +55,61 @@ s = """
2 三江VIP厅,9,特立独行,4280,国语,2026-07-14,20:20,22:23,123,11 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转化成字典 # 将csv转化成字典
def csv_to_obj(csv_data): def csv_to_obj(csv_data):
@ -126,6 +182,22 @@ def show_data(zz_code: str, show_date: str):
print(hall_show_count) 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__': if __name__ == '__main__':
count_data(csv_to_obj(s)) # count_data(csv_to_obj(s))
# show_data('33040301', '2026-07-13') # show_data('33040301', '2026-07-13')
parse_json(json_str)

@ -58,6 +58,7 @@ class GetData:
# 获取指定日期的可用于排片的影片 # 获取指定日期的可用于排片的影片
def get_handle_movie(self, date): def get_handle_movie(self, date):
new = None
if get_runtime_val('real_target') == '0': if get_runtime_val('real_target') == '0':
movie_date_start = 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)
movie_date_end = 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,
@ -73,21 +74,51 @@ class GetData:
sql = GET_HANDLE_MOVIE_TEST + bl_str + ');' sql = GET_HANDLE_MOVIE_TEST + bl_str + ');'
print(self.cur.mogrify(sql, (movie_date_start, movie_date_end, show_date_limit))) 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)) self.cur.execute(sql, (movie_date_start, movie_date_end, show_date_limit))
available_movie = self.cur.fetchall()
else: else:
start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59, limit_end = datetime.datetime.today().replace(hour=6, minute=0, second=0, microsecond=0)
seconds=59) limit_start = limit_end + datetime.timedelta(days=-7)
end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6) 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) bl_bool, bl_str, bl_list = get_black_list(self.zz_code)
if bl_bool: if bl_bool:
sql = GET_HANDLE_MOVIE + bl_str + ');' sql = GET_MOVIE_INFO_BY_INCOME_AND_COUNT_START + bl_str + GET_MOVIE_INFO_BY_INCOME_AND_COUNT_END
print(self.cur.mogrify(sql, (start_datetime, end_datetime, *bl_list))) print(self.cur.mogrify(sql, (show_start, show_end, movie_start, movie_end, *bl_list, limit)))
self.cur.execute(sql, (start_datetime, end_datetime, *bl_list)) self.cur.execute(sql, (show_start, show_end, movie_start, movie_end, *bl_list, limit))
else: else:
sql = GET_HANDLE_MOVIE + bl_str + ');' sql = GET_MOVIE_INFO_BY_INCOME_AND_COUNT_START + bl_str + GET_MOVIE_INFO_BY_INCOME_AND_COUNT_END
print(self.cur.mogrify(sql, (start_datetime, end_datetime))) print(self.cur.mogrify(sql, (show_start, show_end, movie_start, movie_end, limit)))
self.cur.execute(sql, (start_datetime, end_datetime)) 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() 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 = [ 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']}" 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] for m in available_movie]
@ -183,6 +214,21 @@ class GetData:
# 按工作日和节假日计算销售数据 # 按工作日和节假日计算销售数据
def get_sell_data_by_day_type(self, start_datetime, end_datetime): 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天的数据 # 获取过去7天的数据
print('get_sell_data_by_day_type_start_datetime', start_datetime) 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 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( 'average_income_holiday': round(
float(0 if m['show']['holiday'] == 0 else m['income']['holiday'] / m['show']['holiday']), 2), float(0 if m['show']['holiday'] == 0 else m['income']['holiday'] / m['show']['holiday']), 2),
}) })
sell_data_mapping = { return movie_sell_data_list
'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_total_income(self, start_datetime, end_datetime): def get_total_income(self, start_datetime, end_datetime):

@ -216,3 +216,33 @@ 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)).order_by('-create_datetime').all() 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] 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

@ -322,3 +322,57 @@ FROM cinema_movie_info cmi
WHERE cmi.cinema_movie_start_datetime <= %s WHERE cmi.cinema_movie_start_datetime <= %s
AND cmi.cinema_movie_end_datetime > %s AND cmi.cinema_movie_end_datetime > %s
AND cmi.cinema_movie_num NOT IN (""" 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;
"""

@ -103,6 +103,9 @@ def report(request):
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)
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']: 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:
@ -138,7 +141,11 @@ def report(request):
'prompt_version': last_ai_data.prompt_version, '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': 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) print(result_dict)

@ -42,7 +42,7 @@ CONFIG = {
"USER": "test", "USER": "test",
"PASSWORD": "cine123456", "PASSWORD": "cine123456",
}, },
'REDIS_IP': '172.16.1.168', 'REDIS_IP': '127.0.0.1',
'ECARD_DB': { 'ECARD_DB': {
"HOST": '10.10.0.61', "HOST": '10.10.0.61',
"PORT": 3306, "PORT": 3306,

Loading…
Cancel
Save