From bd7c08b8b8f26aaeb9f02e350c14445d409a2d44 Mon Sep 17 00:00:00 2001 From: rogersun Date: Tue, 14 Jul 2026 14:34:46 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E5=8F=82=E6=95=B0=E4=B8=BAjson=202?= =?UTF-8?q?=E3=80=81=E4=BC=98=E5=8C=96=E9=94=80=E5=94=AE=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E6=8C=89=E7=85=A7=E5=B7=A5=E4=BD=9C=E6=97=A5=E5=92=8C?= =?UTF-8?q?=E8=8A=82=E5=81=87=E6=97=A5=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai/utils/show_database.py | 84 +++++++++++++++++++++++++++++++++++++++ ai/utils/show_prompt.py | 4 +- ai/utils/sql.py | 24 +++++++++++ ai/views.py | 13 +++--- command.txt | 1 + 5 files changed, 119 insertions(+), 7 deletions(-) diff --git a/ai/utils/show_database.py b/ai/utils/show_database.py index 6071234..b1366a6 100644 --- a/ai/utils/show_database.py +++ b/ai/utils/show_database.py @@ -1,4 +1,5 @@ import pymysql +from chinese_calendar import is_holiday from pymysql.cursors import DictCursor from ai.models import * from ai.models import TestCinema @@ -173,6 +174,89 @@ class GetData: } return self.format_to_csv(sell_data, sell_data_mapping) + # 按工作日和节假日计算销售数据 + def get_sell_data_by_day_type(self, start_datetime, end_datetime): + # 获取过去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 + in range(-7, 0, 1)] + print('get_sell_data_by_day_type', [n for n in range(-7, 0, 1)]) + print('get_sell_data_by_day_type', + [datetime.datetime.strptime(start_datetime, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=n) for n + in range(-7, 0, -1)]) + sell_data_dict = { + 'holiday': [], + 'workday': [], + } + for date in date_list: + start = datetime.datetime.strftime(date, '%Y-%m-%d %H:%M:%S') + end = datetime.datetime.strftime(date + datetime.timedelta(days=1), '%Y-%m-%d %H:%M:%S') + self.cur.execute(GET_SELL_DATA_SELF_CALCULATE, (start, end)) + sell_data = self.cur.fetchall() + print('get_sell_data_by_movie', start, end, sell_data) + if is_holiday(date): + sell_data_dict['holiday'].append(sell_data) + else: + sell_data_dict['workday'].append(sell_data) + + movie_sell_data = dict() + for key, val in sell_data_dict.items(): + print(key, val) + for sell in val: + print(sell) + for m in sell: + print(m) + if m['movie_id'] not in movie_sell_data.keys(): + movie_sell_data[m['movie_id']] = { + 'movie_alias_name': m['movie_alias_name'], + 'movie_id': m['movie_id'], + 'viewer': { + 'holiday': 0, + 'workday': 0, + }, + 'income': { + 'holiday': 0.0, + 'workday': 0.0, + }, + 'show': { + 'holiday': 0, + 'workday': 0, + } + } + movie_sell_data[m['movie_id']]['viewer'][key] += int(m['total_viewers']) + movie_sell_data[m['movie_id']]['income'][key] += float(m['total_income']) + movie_sell_data[m['movie_id']]['show'][key] += int(m['total_show']) + print('get_sell_data_by_day_type', movie_sell_data) + movie_sell_data_list = [] + for m in movie_sell_data.values(): + movie_sell_data_list.append({ + 'movie_alias_name': m['movie_alias_name'], + 'movie_id': m['movie_id'], + 'average_viewer_workday': round( + float(0 if m['show']['workday'] == 0 else m['viewer']['workday'] / m['show']['workday']), 2), + 'average_ticket_price_workday': round( + float(0 if m['viewer']['workday'] == 0 else m['income']['workday'] / m['viewer']['workday']), 2), + 'average_income_workday': round( + float(0 if m['show']['workday'] == 0 else m['income']['workday'] / m['show']['workday']), 2), + 'average_viewer_holiday': round( + float(0 if m['show']['holiday'] == 0 else m['viewer']['holiday'] / m['show']['holiday']), 2), + 'average_ticket_price_holiday': round( + float(0 if m['viewer']['holiday'] == 0 else m['income']['holiday'] / m['viewer']['holiday']), 2), + '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) + # 获取指定范围的影片销售总额 def get_total_income(self, start_datetime, end_datetime): print(self.cur.mogrify(GET_TOTAL_INCOME, (start_datetime, end_datetime, start_datetime, end_datetime))) diff --git a/ai/utils/show_prompt.py b/ai/utils/show_prompt.py index 065c870..bb4cea9 100644 --- a/ai/utils/show_prompt.py +++ b/ai/utils/show_prompt.py @@ -144,8 +144,10 @@ class ShowAI: pre_data = PromptTemplate.objects.filter( Q(del_flag=False) & Q(prompt_type='show') & Q(prompt_key='PreData')).first().prompt_val # 获取提示词模板 pre_data = pre_data.replace('{template_show}', template_show) # 处理排片数据 + # pre_data = pre_data.replace('{history_sales}', + # data.get_sell_data_by_movie(history_start, history_end)) # 处理销售数据 pre_data = pre_data.replace('{history_sales}', - data.get_sell_data_by_movie(history_start, history_end)) # 处理销售数据 + data.get_sell_data_by_day_type(history_start, history_end)) # 处理销售数据 get_movie_hot_info_from_bi(self.cinema, self.show_date) # 获取全部影片的热度信息 movie_data_old = get_all_movie_hot_info('today', 'old') movie_data_new = get_all_movie_hot_info('today', 'new') diff --git a/ai/utils/sql.py b/ai/utils/sql.py index 6077f6d..d1bce72 100644 --- a/ai/utils/sql.py +++ b/ai/utils/sql.py @@ -135,6 +135,30 @@ FROM (SELECT CAST(ms.cinema_movie_show_id AS CHAR) c GROUP BY sd.movie_id ORDER BY average_show_ticket_price DESC; """ +GET_SELL_DATA_SELF_CALCULATE = """ +SELECT sd.movie_alias_name movie_alias_name, + sd.movie_id movie_id, + SUM(sd.total_viewers) total_viewers, + SUM(sd.total_income) total_income, + COUNT(sd.cinema_movie_show_id) total_show +FROM (SELECT CAST(ms.cinema_movie_show_id AS CHAR) cinema_movie_show_id, + mi.cinema_movie_alias movie_alias_name, + mi.cinema_movie_id movie_id, + SUM(IF(sl.cinema_ticket_status <> 3, 1, 0)) total_viewers, + 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 + 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 NOT (ms.cinema_movie_show_sold_num = 0 AND ms.cinema_movie_show_status <> 1) + GROUP BY ms.cinema_movie_show_id) sd +GROUP BY sd.movie_id ORDER BY sd.total_income DESC; +""" + + # 获取指定日期的可放映影片 GET_AVAILABLE_MOVIE = """ SELECT cmi.cinema_movie_alias, diff --git a/ai/views.py b/ai/views.py index a344de3..c50f234 100644 --- a/ai/views.py +++ b/ai/views.py @@ -1,8 +1,10 @@ +from anyio import sleep from django.http import JsonResponse from django.db.models import Q from django.views.decorators.csrf import csrf_exempt import json from ai.models import * +import time from ai.utils.show_process import show_main_process, show_manual_process from ai.utils.show_func import * from ai.utils.basic_func import * @@ -177,14 +179,13 @@ def insert_new_movie(request): @csrf_exempt def manual_test(request): - print(request) - cinema_code = request.POST.get('cinema_code') - show_date = request.POST.get('show_date') - prompt = request.POST.get('prompt') + print('manual_test-reuest', json.loads(request.body)) + body = json.loads(request.body) + cinema_code = body.get('cinema_code') + show_date = body.get('show_date') + prompt = body.get('prompt') print('manual_test-request-params', cinema_code, show_date, prompt) - result = show_manual_process(cinema_code, show_date, prompt) - result_dict = { 'status': 'success', 'message': '成功', diff --git a/command.txt b/command.txt index 90525d4..3782788 100644 --- a/command.txt +++ b/command.txt @@ -1,4 +1,5 @@ py .\manage.py runserver 0.0.0.0:8000 +python manage.py runserver --skip-checks 0.0.0.0:8000 celery -A dingxin_toolbox_drf worker -l info -P solo # windows celery -A dingxin_toolbox_drf worker -l info # linux celery -A dingxin_toolbox_drf beat -l info \ No newline at end of file