diff --git a/dingxin_toolbox_drf/settings.py b/dingxin_toolbox_drf/settings.py index 6e6efaa..659c951 100644 --- a/dingxin_toolbox_drf/settings.py +++ b/dingxin_toolbox_drf/settings.py @@ -146,7 +146,7 @@ INSTALLED_APPS = [ 'dspt_api', 'product', 'config', - # 'group', + 'group', 'ai', 'django_celery_beat', # 定时任务 'django_celery_results', # 定时任务 diff --git a/dingxin_toolbox_drf/urls.py b/dingxin_toolbox_drf/urls.py index 98194f0..bda0ba2 100644 --- a/dingxin_toolbox_drf/urls.py +++ b/dingxin_toolbox_drf/urls.py @@ -34,6 +34,7 @@ urlpatterns = [ path('prd/', include('product.urls')), path('config/', include('config.urls')), path('ai/', include('ai.urls')), + path('group/', include('group.urls')), ] websocket_urlpatterns = [ diff --git a/group/__init__.py b/group/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/group/admin.py b/group/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/group/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/group/apps.py b/group/apps.py new file mode 100644 index 0000000..d9c36a4 --- /dev/null +++ b/group/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class GroupConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'group' diff --git a/group/migrations/0001_initial.py b/group/migrations/0001_initial.py new file mode 100644 index 0000000..93015ae --- /dev/null +++ b/group/migrations/0001_initial.py @@ -0,0 +1,65 @@ +# Generated by Django 4.2.7 on 2026-05-09 09:23 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Functions', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), + ('func_model', models.CharField(max_length=150, verbose_name='模块')), + ('func_name', models.CharField(max_length=150, verbose_name='功能名称')), + ('exec_sql', models.TextField(verbose_name='查询sql')), + ('is_delete', models.BooleanField(default=False, verbose_name='删除标记')), + ], + options={ + 'verbose_name': '集团功能表', + 'verbose_name_plural': '集团功能表', + 'db_table': 'group_func', + 'db_table_comment': '集团功能表', + }, + ), + migrations.CreateModel( + name='Group', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), + ('group_code', models.CharField(max_length=20, unique=True, verbose_name='集团编码')), + ('group_name', models.CharField(max_length=150, unique=True, verbose_name='集团编码')), + ('group_address', models.CharField(max_length=150, unique=True, verbose_name='集团地址')), + ('cinema_count', models.IntegerField(verbose_name='影院数量')), + ('is_delete', models.BooleanField(default=False, verbose_name='删除标记')), + ], + options={ + 'verbose_name': '集团信息表', + 'verbose_name_plural': '集团信息表', + 'db_table': 'group_info', + 'db_table_comment': '集团信息表', + }, + ), + migrations.CreateModel( + name='GroupData', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), + ('data_count', models.IntegerField(verbose_name='数据量')), + ('data_lasttime', models.DateTimeField(verbose_name='数据最后更新时间')), + ('update_time', models.DateTimeField(verbose_name='数据更新时间')), + ('func', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.functions')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.group')), + ], + options={ + 'verbose_name': '集团功能数据统计表', + 'verbose_name_plural': '集团功能数据统计表', + 'db_table': 'group_data_statistics', + 'db_table_comment': '集团功能数据统计表', + }, + ), + ] diff --git a/group/migrations/0002_alter_groupdata_table.py b/group/migrations/0002_alter_groupdata_table.py new file mode 100644 index 0000000..af466dc --- /dev/null +++ b/group/migrations/0002_alter_groupdata_table.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.7 on 2026-05-09 09:27 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0001_initial'), + ] + + operations = [ + migrations.AlterModelTable( + name='groupdata', + table='group_data', + ), + ] diff --git a/group/migrations/0003_groupruntime.py b/group/migrations/0003_groupruntime.py new file mode 100644 index 0000000..cf5c85d --- /dev/null +++ b/group/migrations/0003_groupruntime.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.7 on 2026-05-09 09:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0002_alter_groupdata_table'), + ] + + operations = [ + migrations.CreateModel( + name='GroupRuntime', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('runtime_key', models.CharField(max_length=150, verbose_name='运行时key')), + ('runtime_value', models.CharField(max_length=300, verbose_name='运行时value')), + ], + options={ + 'verbose_name': '集团数据运行时表', + 'verbose_name_plural': '集团数据运行时表', + 'db_table': 'group_runtime', + 'db_table_comment': '集团数据运行时表', + }, + ), + ] diff --git a/group/migrations/0004_rename_functions_groupfuncs.py b/group/migrations/0004_rename_functions_groupfuncs.py new file mode 100644 index 0000000..538ae04 --- /dev/null +++ b/group/migrations/0004_rename_functions_groupfuncs.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.7 on 2026-06-23 02:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0003_groupruntime'), + ] + + operations = [ + migrations.RenameModel( + old_name='Functions', + new_name='GroupFuncs', + ), + ] diff --git a/group/migrations/0005_alter_groupdata_update_time.py b/group/migrations/0005_alter_groupdata_update_time.py new file mode 100644 index 0000000..b22f33e --- /dev/null +++ b/group/migrations/0005_alter_groupdata_update_time.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2026-06-23 06:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0004_rename_functions_groupfuncs'), + ] + + operations = [ + migrations.AlterField( + model_name='groupdata', + name='update_time', + field=models.DateTimeField(auto_now=True, verbose_name='数据更新时间'), + ), + ] diff --git a/group/migrations/0006_alter_groupruntime_runtime_value.py b/group/migrations/0006_alter_groupruntime_runtime_value.py new file mode 100644 index 0000000..2e4d29c --- /dev/null +++ b/group/migrations/0006_alter_groupruntime_runtime_value.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2026-06-23 08:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0005_alter_groupdata_update_time'), + ] + + operations = [ + migrations.AlterField( + model_name='groupruntime', + name='runtime_value', + field=models.TextField(verbose_name='运行时value'), + ), + ] diff --git a/group/migrations/__init__.py b/group/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/group/models.py b/group/models.py new file mode 100644 index 0000000..802dc3a --- /dev/null +++ b/group/models.py @@ -0,0 +1,70 @@ +from django.db import models + + +# Create your models here. + +class Group(models.Model): + id = models.AutoField(primary_key=True, auto_created=True) + group_code = models.CharField(verbose_name='集团编码', max_length=20, null=False, unique=True) + group_name = models.CharField(verbose_name='集团编码', max_length=150, null=False, unique=True) + group_address = models.CharField(verbose_name='集团地址', max_length=150, null=False, unique=True) + cinema_count = models.IntegerField(verbose_name='影院数量') + is_delete = models.BooleanField(verbose_name="删除标记", default=False) + + def __str__(self): + return self.group_code + + class Meta: + verbose_name = '集团信息表' + verbose_name_plural = '集团信息表' + db_table_comment = '集团信息表' + db_table = 'group_info' + + +class GroupFuncs(models.Model): + id = models.AutoField(primary_key=True, auto_created=True) + func_model = models.CharField(verbose_name='模块', max_length=150, null=False) + func_name = models.CharField(verbose_name='功能名称', max_length=150, null=False) + exec_sql = models.TextField(verbose_name='查询sql', null=False) + is_delete = models.BooleanField(verbose_name="删除标记", default=False) + + def __str__(self): + return self.func_name + + class Meta: + verbose_name = '集团功能表' + verbose_name_plural = '集团功能表' + db_table_comment = '集团功能表' + db_table = 'group_func' + + +class GroupData(models.Model): + id = models.AutoField(primary_key=True, auto_created=True) + group = models.ForeignKey("Group", on_delete=models.CASCADE, null=False) + func = models.ForeignKey("GroupFuncs", on_delete=models.CASCADE, null=False) + data_count = models.IntegerField(verbose_name='数据量', null=False) + data_lasttime = models.DateTimeField(verbose_name='数据最后更新时间', null=False) + update_time = models.DateTimeField(verbose_name="数据更新时间", auto_now=True, null=False) + + def __str__(self): + return self.id + + class Meta: + verbose_name = '集团功能数据统计表' + verbose_name_plural = '集团功能数据统计表' + db_table_comment = '集团功能数据统计表' + db_table = 'group_data' + + +class GroupRuntime(models.Model): + runtime_key = models.CharField(verbose_name='运行时key', max_length=150, null=False) + runtime_value = models.TextField(verbose_name='运行时value', null=False) + + def __str__(self): + return self.runtime_key + + class Meta: + verbose_name = '集团数据运行时表' + verbose_name_plural = '集团数据运行时表' + db_table_comment = '集团数据运行时表' + db_table = 'group_runtime' diff --git a/group/serializers.py b/group/serializers.py new file mode 100644 index 0000000..712e719 --- /dev/null +++ b/group/serializers.py @@ -0,0 +1,22 @@ +from rest_framework import serializers +from group.models import * + +class GroupInfoSerializer(serializers.ModelSerializer): + class Meta: + model = Group + fields = '__all__' + +class GroupFuncsSerializer(serializers.ModelSerializer): + class Meta: + model = GroupFuncs + fields = '__all__' + +class GroupDataStatisticsSerializer(serializers.ModelSerializer): + class Meta: + model = GroupData + fields = '__all__' + +class GroupRuntimeSerializer(serializers.ModelSerializer): + class Meta: + model = GroupRuntime + fields = '__all__' \ No newline at end of file diff --git a/group/tasks.py b/group/tasks.py new file mode 100644 index 0000000..0e4316d --- /dev/null +++ b/group/tasks.py @@ -0,0 +1,8 @@ +from celery import shared_task +from group.utils.main_process import main_update_process + +@shared_task(time_limit=10*60, soft_time_limit=10*60) +def group_data_task(): + main_update_process() + print("task success") + return True diff --git a/group/tests.py b/group/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/group/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/group/urls.py b/group/urls.py new file mode 100644 index 0000000..f68b7ac --- /dev/null +++ b/group/urls.py @@ -0,0 +1,24 @@ +""" +URL configuration for dingxin_toolbox_drf project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include +from group.views import * + +urlpatterns = [ + path('get_group_data', get_group_data), + path('get_group_func', GroupFuncsViewSet.as_view({'get': 'list'}), name='get_group_func'), +] diff --git a/group/utils/get_group_info.py b/group/utils/get_group_info.py new file mode 100644 index 0000000..8ca6c13 --- /dev/null +++ b/group/utils/get_group_info.py @@ -0,0 +1,39 @@ +import pymysql +from pymysql.cursors import DictCursor +from group.models import * + +group_database_info = { + 'host': '10.10.1.52', + 'port': 3306, + 'user': 'dgp_read', + 'password': '1d8qB83F9s63kpS', +} + + +class GetGroupInfo: + def __init__(self): + self.db_conn = pymysql.connect(**group_database_info) + self.db_cursor = self.db_conn.cursor(cursor=DictCursor) + self.group_list = self.get_groups() + + # 如果集团数据不存在则返回False + def is_group_exist(self, group_code): + if Group.objects.filter(group_code=group_code).exists(): + return Group.objects.get(group_code=group_code) + else: + for group in self.group_list: + if group.get('group_code') == group_code: + return Group.objects.create(group_code=group_code, + group_name=group.get('group_name'), + group_address=f"https://plus.yinghezhong.com/{group_code}", + cinema_count=group.get('cinema_count')) + return False + + # 查询集团数据库获取集团信息 + def get_groups(self): + group_info_sql = """SELECT bcg.group_code, bcg.group_name, COUNT(bc.group_code) as cinema_count FROM dgp_bd_db.bd_cinema_group as bcg LEFT JOIN dgp_bd_db.bd_cinema as bc ON bcg.group_code = bc.group_code WHERE bcg.status = 1 AND bc.status = 1 AND length(bcg.group_code) = 8 AND bcg.group_code != '87879012' GROUP BY bcg.group_code ORDER BY cinema_count DESC;""" + self.db_cursor.execute(group_info_sql) + group_list = self.db_cursor.fetchall() + self.db_cursor.close() + self.db_conn.close() + return group_list diff --git a/group/utils/main_process.py b/group/utils/main_process.py new file mode 100644 index 0000000..13986a9 --- /dev/null +++ b/group/utils/main_process.py @@ -0,0 +1,33 @@ +from datetime import datetime +import json +from group.models import * +from group.utils.update_group_data import * + + +def main_update_process(): + # 遍历功能列表并连接DGP线上数据库获取统计数据 + func_list = GroupFuncs.objects.filter(is_delete=False).all() + ugd = UpdateGroupData() + failed_list = [] + for func in func_list: + result = ugd.update_group_data(func) + if result is not True: + failed_list.extend(result) + + # 记录最后运行时间以及最后的错误信息 + if runtime := GroupRuntime.objects.get(runtime_key='update_datetime'): + runtime.runtime_value = datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S') + runtime.save() + else: + GroupRuntime.objects.create(runtime_key='update_datetime', + runtime_value=datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S')) + if len(failed_list) > 0: + print("failed_list", failed_list) + if fail := GroupRuntime.objects.get(runtime_key='update_datetime'): + fail.runtime_value = json.dumps(failed_list) + runtime.save() + else: + GroupRuntime.objects.create(runtime_key='failed_data', runtime_value=json.dumps(failed_list)) + + # 生成影院功能对应数据字典并写入redis + set_group_data_to_redis() diff --git a/group/utils/update_group_data.py b/group/utils/update_group_data.py new file mode 100644 index 0000000..c9f8d25 --- /dev/null +++ b/group/utils/update_group_data.py @@ -0,0 +1,101 @@ +import pymysql +import json +from datetime import datetime +from pymysql.cursors import DictCursor +from group.models import * +from group.models import Group +from group.utils.get_group_info import * +from django_redis import get_redis_connection + +group_database_info = { + 'host': '10.10.1.52', + 'port': 3306, + 'user': 'dgp_read', + 'password': '1d8qB83F9s63kpS', +} + + +class UpdateGroupData: + def __init__(self): + self.db_conn = pymysql.connect(**group_database_info) + self.db_cursor = self.db_conn.cursor(cursor=DictCursor) + + # 根据func获取集团数据,如果集团不存在则插入集团数据 + def update_group_data(self, func): + group_info = GetGroupInfo() + self.db_cursor.execute(func.exec_sql) + data = self.db_cursor.fetchall() + failed_list = [] + for d in data: + code = d.get('group_code') + print(func.func_model, func.func_name, d.get('group_code'), d.get('data'), d.get('last_time')) + if g_obj := group_info.is_group_exist(code): + print('找到集团插入数据') + if GroupData.objects.filter(group=g_obj, func=func).first() is not None: + gd = GroupData.objects.get(group=g_obj, func=func) + gd.data_count = d.get('data') + gd.data_lasttime = d.get('last_time') + gd.save() + else: + GroupData.objects.create(group=g_obj, + func=func, + data_count=d.get('data'), + data_lasttime=d.get('last_time')) + + else: + print('没有找到集团') + failed_list.append({'func_name': func.func_name, 'group_code': d.get('group_code')}) + if len(failed_list) > 0: + return failed_list + return True + + +# 组装返回数据并写入json +def set_group_data_to_redis(): + # 准备数据 + groups = Group.objects.order_by('-cinema_count').all() + funcs = GroupFuncs.objects.all() + result = {'groups_data': [], + 'update_datetime': GroupRuntime.objects.filter(runtime_key='update_datetime').first().runtime_value, } + for group in groups: + print(group.group_code) + group_data = { + 'group_info': { + 'group_code': group.group_code, + 'group_name': group.group_name, + 'group_address': group.group_address, + 'cinema_count': group.cinema_count + }, + 'group_data': [] + } + for func in funcs: + print(func.func_name) + data = GroupData.objects.filter(group=group, func=func).first() + if data is not None: + data_count = data.data_count + data_lasttime = datetime.strftime(data.data_lasttime, '%Y-%m-%d %H:%M:%S') + else: + data_count = 0 + data_lasttime = '' + group_data['group_data'].append({ + 'func_id': func.id, + 'func_model': func.func_model, + 'func_name': func.func_name, + 'data_count': data_count, + 'data_lasttime': data_lasttime, + }) + print({ + 'func_model': func.func_model, + 'func_name': func.func_name, + 'data_count': data_count, + 'data_lasttime': data_lasttime, + }) + result['groups_data'].append(group_data) + # 写入Redis + print("写入Redis") + redis_conn = get_redis_connection() + redis_key = f"group_data_{datetime.strftime(datetime.now(), '%Y-%m-%d')}" + if redis_conn.exists(redis_key): + redis_conn.delete(redis_key) + redis_conn.set(redis_key, json.dumps(result), 3600 * 48) + return result diff --git a/group/views.py b/group/views.py new file mode 100644 index 0000000..07ef75c --- /dev/null +++ b/group/views.py @@ -0,0 +1,36 @@ +from django.http import JsonResponse +from django_redis import get_redis_connection +from django.shortcuts import render +from django.views.decorators.csrf import csrf_exempt +from rest_framework import viewsets + +from group.serializers import GroupFuncsSerializer +from group.utils.update_group_data import * +from group.utils.main_process import main_update_process + + +# Create your views here. +@csrf_exempt +def get_group_data(request): + redis_conn = get_redis_connection() + redis_key = f"group_data_{datetime.strftime(datetime.now(), '%Y-%m-%d')}" + if not redis_conn.exists(redis_key): + main_update_process() + if redis_conn.exists(redis_key): + print('获取Redis数据') + redis_value = json.loads(redis_conn.get(redis_key)) + result_dict = { + 'status': 'success', + 'data': redis_value, + } + else: + result_dict = { + 'status': 'fail', + 'data': [], + } + return JsonResponse(result_dict, json_dumps_params={'ensure_ascii': False}) + + +class GroupFuncsViewSet(viewsets.ModelViewSet): + queryset = GroupFuncs.objects.all() + serializer_class = GroupFuncsSerializer diff --git a/group/集团SQL.txt b/group/集团SQL.txt new file mode 100644 index 0000000..b72597d --- /dev/null +++ b/group/集团SQL.txt @@ -0,0 +1,172 @@ +# 票务管理 +# 影片库 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_film_db.f_cinema_film GROUP BY group_code; + +# 价格策略 +# 票价组 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_ticket_db.ticket_group GROUP BY group_code; + +# 排片指导 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_film_db.f_instruction GROUP BY group_code; + +# 票房补登审核 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(auditor_time, add_time)) as last_time FROM dgp_film_db.f_box_office_add GROUP BY group_code; + +# 客群管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_membership_db.customer_group WHERE customer_group_name NOT IN ('活跃用户', '促活用户', '潜在用户') GROUP BY group_code; + +# 会员卡活动 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_membership_db.membership_activity GROUP BY group_code; + +# 会员卡 +# 订单管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_membership_db.card_order GROUP BY group_code; + +# 会员卡 +# 等级管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_membership_db.group_card_level WHERE is_deleted=0 GROUP BY group_code; + +# 卖品管理 +# 售卖分组 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_sell_group WHERE status=1 GROUP BY group_code; + +# 卖品管理 +# 品牌管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_brands WHERE status=1 GROUP BY group_code; + +# 库房管理 +# 仓库 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_warehouse WHERE status=1 GROUP BY group_code; + +# 库房管理 +# 货架 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_shelf WHERE status=1 GROUP BY group_code; + +# 品项管理 +# 原材料 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_goods_bill WHERE status=1 AND goods_attribute=1 AND show_flag = 1 GROUP BY group_code; + +# 品项管理 +# 单品 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_goods_bill WHERE status=1 AND goods_attribute=2 AND show_flag = 1 GROUP BY group_code; + +# 品项管理 +# 合成品 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_goods_bill WHERE status=1 AND goods_attribute=3 AND show_flag = 1 GROUP BY group_code; + +# 品项管理 +# 套餐 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_goods_bill WHERE status=1 AND goods_attribute=4 AND show_flag = 1 GROUP BY group_code; + +# 品项管理 +# 售卖键管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_goods_rule_bill WHERE status=1 AND show_flag=1 GROUP BY group_code; + +# 品项管理 +# 售卖规则 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_sell_rule_bill WHERE status=1 GROUP BY group_code; + +# 供应商管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_supplier_bill WHERE status=1 GROUP BY group_code; + +# 采购管理 +# 代购协议 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_purchase_agreement WHERE status=1 GROUP BY group_code; + +# 调货管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_retail_db.r_goods_transfer WHERE status=1 GROUP BY group_code; + +# 联名卡 +# 卡级别管理 +SELECT group_no as group_code, COUNT(*) as data, MAX(IFNULL(updated_time, created_time)) as last_time FROM dgp_card_db.card_level WHERE status=1 GROUP BY group_no; + +# 联名卡 +# 活动管理 +SELECT group_no as group_code, COUNT(*) as data, MAX(IFNULL(updated_time, created_time)) as last_time FROM dgp_card_db.card_level_activity WHERE status=1 GROUP BY group_no; + +# 预售券 +# 券类设置 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_coupon_db.coupon_strategy_bill WHERE audit_status IN (0,1,2,3) AND delete_flag = 0 GROUP BY group_code; + +# 预售券 +# 销售单管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_coupon_db.coupon_sell_order WHERE delete_flag=0 AND coupon_strategy_id IN (SELECT coupon_strategy_id FROM dgp_coupon_db.coupon_strategy_bill WHERE audit_status IN (0,1,2,3) AND delete_flag = 0) GROUP BY group_code; + +# 预售券 +# 券码订单 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_coupon_db.coupon_barcode_order WHERE delete_flag=0 GROUP BY group_code; + +# 预售券 +# 影城券审核 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_coupon_db.coupon_sell_order_cinema GROUP BY group_code; + +# 预售券 +# 平台券管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_coupon_db.coupon_platform_refund GROUP BY group_code; + +# 用户管理 +# 总部岗位 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.role_group_role WHERE delete_flag = 0 AND role_type=0 AND source_type=1 AND show_flag=1 AND levels_flag=2 GROUP BY group_code; + +# 用户管理 +# 影院岗位 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.role_group_role WHERE delete_flag = 0 AND role_type=0 AND source_type=1 AND show_flag=1 AND levels_flag=8 GROUP BY group_code; + +# 用户管理 +# 总部账号 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.role_user WHERE delete_flag=0 AND user_type=1 AND show_flag=1 AND status=1 GROUP BY group_code; + +# 用户管理 +# 影院账号 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.role_user WHERE delete_flag=0 AND user_type=3 AND show_flag=1 AND status=1 GROUP BY group_code; + +# 影院管理 +# 影院管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_cinema WHERE status <> 3 GROUP BY group_code; + +# 影院管理 +# 跨集团影院管理 +SELECT interflow_group as group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_cross_cinema WHERE delete_flag=0 GROUP BY interflow_group; + +# 影院管理 +# 影院指标管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_kpi_target GROUP BY group_code; + +# 影院管理 +# 客户管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_customer WHERE del_flag=0 GROUP BY group_code; + +# 影院管理 +# 时段设置 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_cinema_time_rule WHERE del_flag=0 GROUP BY group_code; + +# 影院管理 +# 招待管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_cinema_entertain WHERE delete_flag=0 GROUP BY group_code; + +# 影院管理 +# 补贴方管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_cinema_subsidies WHERE status=1 GROUP BY group_code; + +# 影院管理 +# 银行管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.bd_bank GROUP BY group_code; + +# 影院管理 +# 第三方卡管理 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_bd_db.customer_card_info WHERE delete_flag = 1 GROUP BY group_code; + +# 审批流 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(update_time, create_time)) as last_time FROM dgp_workflow_db.wf_flow_definition WHERE status = 1 GROUP BY group_code; + +# 广告管理 +# 设备列表 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_ad_db.equipment GROUP BY group_code; + +# 广告管理 +# 模板列表 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_ad_db.template GROUP BY group_code; + +# 广告管理 +# 素材列表 +SELECT group_code, COUNT(*) as data, MAX(IFNULL(gmt_modified, gmt_create)) as last_time FROM dgp_ad_db.material GROUP BY group_code; diff --git a/group/集团功能整理.xlsx b/group/集团功能整理.xlsx new file mode 100644 index 0000000..27938a4 Binary files /dev/null and b/group/集团功能整理.xlsx differ