From 2ecfc8dd062b40c05f7859ce407997f6c3b135fb Mon Sep 17 00:00:00 2001 From: colaftc Date: Tue, 6 Jan 2026 11:59:37 +0800 Subject: [PATCH] feat: added fields like plate_order api into printing jobs api --- api_v1/views/printing/serializers.py | 14 +++++++++++-- docker-compose.dev.yml | 14 +++++++++---- docker-compose.prod.yml | 31 ++++++++++++++++++++++------ docker-compose.yml | 14 +++++++++---- flower/settings.py | 30 ++++++++++++++++++++------- 5 files changed, 79 insertions(+), 24 deletions(-) diff --git a/api_v1/views/printing/serializers.py b/api_v1/views/printing/serializers.py index bf6f80a..df1c471 100644 --- a/api_v1/views/printing/serializers.py +++ b/api_v1/views/printing/serializers.py @@ -258,8 +258,12 @@ class PrintingJobListSerializer(serializers.ModelSerializer): product_name = serializers.CharField(source='product.name', read_only=True) product_image_url = serializers.SerializerMethodField() status = serializers.CharField(read_only=True) + status_id = serializers.IntegerField(read_only=True) work_state_display = serializers.SerializerMethodField() is_completed = serializers.BooleanField(read_only=True) + has_started = serializers.BooleanField(read_only=True) + progress_percentage = serializers.FloatField(read_only=True) + last_completed_state = serializers.CharField(read_only=True) business_object_id = serializers.SerializerMethodField() batch_advance_records = serializers.SerializerMethodField() @@ -270,11 +274,17 @@ class PrintingJobListSerializer(serializers.ModelSerializer): 'product_image_url', 'quantity', 'unit', 'size', 'pieces', 'description', 'work_state', 'work_state_display', - 'status', 'is_completed', 'business_object_id', + 'status', 'status_id', 'is_completed', 'has_started', + 'progress_percentage', 'last_completed_state', + 'business_object_id', 'batch_advance_records', 'created_at', 'updated_at' ] - read_only_fields = ['id', 'created_at', 'updated_at', 'status', 'is_completed', 'business_object_id'] + read_only_fields = [ + 'id', 'created_at', 'updated_at', + 'status', 'status_id', 'is_completed', 'has_started', + 'progress_percentage', 'last_completed_state', 'business_object_id' + ] def get_business_object_id(self, obj): """安全地获取 business_object_id""" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 15f0228..8b040cb 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -85,6 +85,10 @@ services: DB_PASSWORD: postgres CACHE_HOST: redis CACHE_PORT: "6379" + # Celery Broker(RabbitMQ)连接:容器内用服务名访问;宿主机运行时默认 localhost:5672 + CELERY_BROKER_HOST: rabbitmq + # Celery Result Backend(Redis)连接:容器内用服务名访问;宿主机运行时默认 localhost:6379 + CELERY_RESULT_HOST: redis depends_on: - pgbouncer - redis @@ -112,14 +116,15 @@ services: - redis - rabbitmq environment: - CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// - CELERY_RESULT_BACKEND: redis://redis:6379/0 PYTHONPATH: /app DB_HOST: pgbouncer DB_PORT: "6432" DB_NAME: flower DB_USER: postgres DB_PASSWORD: postgres + # Celery 连接配置:容器内用服务名访问 + CELERY_BROKER_HOST: rabbitmq + CELERY_RESULT_HOST: redis restart: unless-stopped celery_beat: @@ -151,8 +156,9 @@ services: DB_NAME: flower DB_USER: postgres DB_PASSWORD: postgres - CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// - CELERY_RESULT_BACKEND: redis://redis:6379/0 + # Celery 连接配置:容器内用服务名访问 + CELERY_BROKER_HOST: rabbitmq + CELERY_RESULT_HOST: redis restart: unless-stopped volumes: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 9f5a8b7..a99537a 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -68,10 +68,17 @@ services: DB_NAME: "${DB_NAME:-flower}" DB_USER: "${DB_USER:-postgres}" DB_PASSWORD: "${DB_PASSWORD:-postgres}" - CELERY_BROKER_URL: "${CELERY_BROKER_URL:-amqp://guest:guest@rabbitmq:5672//}" - CELERY_RESULT_BACKEND: "${CELERY_RESULT_BACKEND:-redis://redis:6379/0}" CACHE_HOST: ${CACHE_HOST:-redis} CACHE_PORT: "${CACHE_PORT:-6379}" + # Celery Broker(RabbitMQ)连接:容器内用服务名访问 + CELERY_BROKER_HOST: ${CELERY_BROKER_HOST:-rabbitmq} + CELERY_BROKER_PORT: "${CELERY_BROKER_PORT:-5672}" + CELERY_BROKER_USER: "${CELERY_BROKER_USER:-guest}" + CELERY_BROKER_PASSWORD: "${CELERY_BROKER_PASSWORD:-guest}" + # Celery Result Backend(Redis)连接:容器内用服务名访问 + CELERY_RESULT_HOST: ${CELERY_RESULT_HOST:-redis} + CELERY_RESULT_PORT: "${CELERY_RESULT_PORT:-6379}" + CELERY_RESULT_DB: "${CELERY_RESULT_DB:-1}" depends_on: - pgbouncer - redis @@ -97,8 +104,14 @@ services: DB_NAME: "${DB_NAME:-flower}" DB_USER: "${DB_USER:-postgres}" DB_PASSWORD: "${DB_PASSWORD:-postgres}" - CELERY_BROKER_URL: "${CELERY_BROKER_URL:-amqp://guest:guest@rabbitmq:5672//}" - CELERY_RESULT_BACKEND: "${CELERY_RESULT_BACKEND:-redis://redis:6379/0}" + # Celery 连接配置:容器内用服务名访问 + CELERY_BROKER_HOST: ${CELERY_BROKER_HOST:-rabbitmq} + CELERY_BROKER_PORT: "${CELERY_BROKER_PORT:-5672}" + CELERY_BROKER_USER: "${CELERY_BROKER_USER:-guest}" + CELERY_BROKER_PASSWORD: "${CELERY_BROKER_PASSWORD:-guest}" + CELERY_RESULT_HOST: ${CELERY_RESULT_HOST:-redis} + CELERY_RESULT_PORT: "${CELERY_RESULT_PORT:-6379}" + CELERY_RESULT_DB: "${CELERY_RESULT_DB:-1}" # 数据库备份输出目录(api_v1.tasks.backup_database 默认输出到 BASE_DIR/data-bak) volumes: # 默认落在 compose 同级目录的 ./data-bak,方便宿主机直接查看/拷贝 @@ -130,8 +143,14 @@ services: DB_NAME: "${DB_NAME:-flower}" DB_USER: "${DB_USER:-postgres}" DB_PASSWORD: "${DB_PASSWORD:-postgres}" - CELERY_BROKER_URL: "${CELERY_BROKER_URL:-amqp://guest:guest@rabbitmq:5672//}" - CELERY_RESULT_BACKEND: "${CELERY_RESULT_BACKEND:-redis://redis:6379/0}" + # Celery 连接配置:容器内用服务名访问 + CELERY_BROKER_HOST: ${CELERY_BROKER_HOST:-rabbitmq} + CELERY_BROKER_PORT: "${CELERY_BROKER_PORT:-5672}" + CELERY_BROKER_USER: "${CELERY_BROKER_USER:-guest}" + CELERY_BROKER_PASSWORD: "${CELERY_BROKER_PASSWORD:-guest}" + CELERY_RESULT_HOST: ${CELERY_RESULT_HOST:-redis} + CELERY_RESULT_PORT: "${CELERY_RESULT_PORT:-6379}" + CELERY_RESULT_DB: "${CELERY_RESULT_DB:-1}" # Celery Beat 的持久化调度文件,避免重启后重复/错过调度 volumes: - celery_beat_data:/var/lib/celery diff --git a/docker-compose.yml b/docker-compose.yml index e7559d7..a69cb57 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -88,6 +88,10 @@ services: # 缓存(Redis)连接:容器内用服务名访问;宿主机运行时默认 localhost:6379 CACHE_HOST: redis CACHE_PORT: "6379" + # Celery Broker(RabbitMQ)连接:容器内用服务名访问;宿主机运行时默认 localhost:5672 + CELERY_BROKER_HOST: rabbitmq + # Celery Result Backend(Redis)连接:容器内用服务名访问;宿主机运行时默认 localhost:6379 + CELERY_RESULT_HOST: redis depends_on: - pgbouncer - redis @@ -116,14 +120,15 @@ services: - redis - rabbitmq environment: - CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// - CELERY_RESULT_BACKEND: redis://redis:6379/0 PYTHONPATH: /app DB_HOST: pgbouncer DB_PORT: "6432" DB_NAME: flower DB_USER: postgres DB_PASSWORD: postgres + # Celery 连接配置:容器内用服务名访问 + CELERY_BROKER_HOST: rabbitmq + CELERY_RESULT_HOST: redis restart: unless-stopped celery_beat: @@ -153,8 +158,9 @@ services: DB_NAME: flower DB_USER: postgres DB_PASSWORD: postgres - CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// - CELERY_RESULT_BACKEND: redis://redis:6379/0 + # Celery 连接配置:容器内用服务名访问 + CELERY_BROKER_HOST: rabbitmq + CELERY_RESULT_HOST: redis restart: unless-stopped volumes: diff --git a/flower/settings.py b/flower/settings.py index 5e07486..0107b0b 100644 --- a/flower/settings.py +++ b/flower/settings.py @@ -402,14 +402,28 @@ PRINTING_DEFAULT_PROCESS_ID = 1 # 默认印染流程ID PLATE_ORDER_DEFAULT_PROCESS_ID = 2 # 默认开版流程ID # Celery 配置 -CELERY_BROKER_URL = env( - 'CELERY_BROKER_URL', - default='amqp://guest:guest@rabbitmq:5672//', -) -CELERY_RESULT_BACKEND = env( - 'CELERY_RESULT_BACKEND', - default='redis://redis:6379/0', -) +# RabbitMQ Broker 配置:优先使用 CELERY_BROKER_URL,否则从各组件构建 +# 默认 localhost(适合宿主机运行),Docker Compose 可通过环境变量指定 CELERY_BROKER_HOST=rabbitmq +celery_broker_url = env('CELERY_BROKER_URL', default=None) +if celery_broker_url is None: + celery_broker_host = env('CELERY_BROKER_HOST', default='localhost') + celery_broker_port = env.int('CELERY_BROKER_PORT', default=5672) + celery_broker_user = env('CELERY_BROKER_USER', default='guest') + celery_broker_password = env('CELERY_BROKER_PASSWORD', default='guest') + celery_broker_vhost = env('CELERY_BROKER_VHOST', default='/') + celery_broker_url = f'amqp://{celery_broker_user}:{celery_broker_password}@{celery_broker_host}:{celery_broker_port}/{celery_broker_vhost}' +CELERY_BROKER_URL = celery_broker_url + +# Celery Result Backend 配置:优先使用 CELERY_RESULT_BACKEND,否则从各组件构建 +# 默认使用与 Cache 相同的 Redis 实例,Docker Compose 可通过环境变量指定 CELERY_RESULT_HOST=redis +celery_result_url = env('CELERY_RESULT_BACKEND', default=None) +if celery_result_url is None: + celery_result_host = env('CELERY_RESULT_HOST', default='localhost') + celery_result_port = env.int('CELERY_RESULT_PORT', default=6379) + celery_result_db = env.int('CELERY_RESULT_DB', default=1) # 使用 db=1,与 Cache 的 db=0 区分 + celery_result_url = f'redis://{celery_result_host}:{celery_result_port}/{celery_result_db}' +CELERY_RESULT_BACKEND = celery_result_url + CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json'