From d85971dccd2ccdfee5b04322aad133256cfaf2c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E6=B5=A9?= <971817787@qq.com> Date: Fri, 5 Dec 2025 23:23:42 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=88=9B=E5=BB=BA=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=90=8C=E6=97=B6=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=B9=B6=E5=BC=80=E5=A7=8B=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controllers/task_controller.py | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/backend/app/controllers/task_controller.py b/src/backend/app/controllers/task_controller.py index 4457370..cf1407d 100644 --- a/src/backend/app/controllers/task_controller.py +++ b/src/backend/app/controllers/task_controller.py @@ -1,4 +1,3 @@ - """ 任务管理控制器 适配新数据库结构,提供加噪、微调、热力图、数值评估等任务相关接口 @@ -169,9 +168,17 @@ def create_perturbation_task(current_user_id): db.session.add(perturbation) db.session.commit() + # 自动上传图片(仅上传微调任务) + files = request.files.getlist('files') if hasattr(request, 'files') else [] + target_dir = TaskService.get_original_images_path(current_user_id, task.flow_id) + success, result = ImageService.save_original_images(task, files, target_dir) if files else (True, []) + + # 创建任务成功后自动启动任务 + job_id = TaskService.start_perturbation_task(task.tasks_id) return jsonify({ - 'message': '加噪任务已创建', - 'task': TaskService.serialize_task(task) + 'message': '加噪任务已创建并已启动', + 'task': TaskService.serialize_task(task), + 'job_id': job_id }), 201 except Exception as exc: db.session.rollback() @@ -300,7 +307,13 @@ def create_heatmap_task(current_user_id): db.session.add(heatmap) db.session.commit() - return jsonify({'message': '热力图任务已创建', 'task': TaskService.serialize_task(task)}), 201 + # 创建任务成功后自动启动任务 + job_id = TaskService.start_heatmap_task(task.tasks_id) + return jsonify({ + 'message': '热力图任务已创建并已启动', + 'task': TaskService.serialize_task(task), + 'job_id': job_id + }), 201 except Exception as exc: db.session.rollback() return TaskService.json_error(f'创建热力图任务失败: {exc}', 500) @@ -402,7 +415,13 @@ def create_finetune_from_perturbation(current_user_id): db.session.add(finetune) db.session.commit() - return jsonify({'message': '微调任务已创建', 'task': TaskService.serialize_task(task)}), 201 + # 创建任务成功后自动启动任务 + job_id = TaskService.start_finetune_task(task.tasks_id) + return jsonify({ + 'message': '微调任务已创建并已启动', + 'task': TaskService.serialize_task(task), + 'job_id': job_id + }), 201 except Exception as exc: db.session.rollback() return TaskService.json_error(f'创建微调任务失败: {exc}', 500) @@ -473,9 +492,18 @@ def create_finetune_from_upload(current_user_id): db.session.add(finetune) db.session.commit() + # 自动上传图片(仅上传微调任务) + files = request.files.getlist('files') if hasattr(request, 'files') else [] + target_dir = TaskService.get_original_images_path(current_user_id, task.flow_id) + success, result = ImageService.save_original_images(task, files, target_dir) if files else (True, []) + + # 自动启动任务 + job_id = TaskService.start_finetune_task(task.tasks_id) return jsonify({ - 'message': '上传微调任务已创建', - 'task': TaskService.serialize_task(task) + 'message': '上传微调任务已创建并已启动', + 'task': TaskService.serialize_task(task), + 'images': [ImageService.serialize_image(img) for img in result], + 'job_id': job_id }), 201 except Exception as exc: db.session.rollback() @@ -590,7 +618,13 @@ def create_evaluate_task(current_user_id): db.session.add(evaluate) db.session.commit() - return jsonify({'message': '评估任务已创建', 'task': TaskService.serialize_task(task)}), 201 + # 创建任务成功后自动启动任务 + job_id = TaskService.start_evaluate_task(task.tasks_id) + return jsonify({ + 'message': '评估任务已创建并已启动', + 'task': TaskService.serialize_task(task), + 'job_id': job_id + }), 201 except Exception as exc: db.session.rollback() return TaskService.json_error(f'创建评估任务失败: {exc}', 500) -- 2.34.1 From 4f63b973dee0f8c5b0cce12d92b78b61e43675bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E6=B5=A9?= <971817787@qq.com> Date: Sat, 6 Dec 2025 00:08:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=97=B6=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controllers/task_controller.py | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/backend/app/controllers/task_controller.py b/src/backend/app/controllers/task_controller.py index cf1407d..4dcc0f9 100644 --- a/src/backend/app/controllers/task_controller.py +++ b/src/backend/app/controllers/task_controller.py @@ -13,6 +13,7 @@ from app.database import ( Image ) from app.services.task_service import TaskService +from app.services.image_service import ImageService task_bp = Blueprint('task', __name__) @@ -114,10 +115,17 @@ def list_perturbation_configs(current_user_id): @task_bp.route('/perturbation', methods=['POST']) @int_jwt_required def create_perturbation_task(current_user_id): - data = request.get_json() or {} - data_type_id = data.get('data_type_id') - perturbation_configs_id = data.get('perturbation_configs_id') - intensity = data.get('perturbation_intensity') + # 兼容 form-data 和 json,推荐 form-data + if request.content_type and request.content_type.startswith('multipart/form-data'): + data = request.form + else: + data = request.get_json() or {} + + # 参数解析,form-data 推荐全部用字符串 + data_type_id = data.get('data_type_id', type=int) if hasattr(data, 'get') else int(data.get('data_type_id', 0)) + perturbation_configs_id = data.get('perturbation_configs_id', type=int) if hasattr(data, 'get') else int(data.get('perturbation_configs_id', 0)) + intensity = data.get('perturbation_intensity', type=float) if hasattr(data, 'get') else float(data.get('perturbation_intensity', 0)) + description = data.get('description') if not all([data_type_id, perturbation_configs_id, intensity]): return TaskService.json_error('缺少必要的任务参数') @@ -168,7 +176,7 @@ def create_perturbation_task(current_user_id): db.session.add(perturbation) db.session.commit() - # 自动上传图片(仅上传微调任务) + # 自动上传图片 files = request.files.getlist('files') if hasattr(request, 'files') else [] target_dir = TaskService.get_original_images_path(current_user_id, task.flow_id) success, result = ImageService.save_original_images(task, files, target_dir) if files else (True, []) @@ -438,10 +446,20 @@ def create_finetune_from_upload(current_user_id): if role_code not in ('vip', 'admin'): return TaskService.json_error('仅限VIP或管理员使用上传微调功能', 403) - data = request.get_json() or {} - finetune_configs_id = data.get('finetune_configs_id') + # 兼容 form-data 和 json,推荐 form-data + if request.content_type and request.content_type.startswith('multipart/form-data'): + data = request.form + else: + data = request.get_json() or {} + + finetune_configs_id = data.get('finetune_configs_id', type=int) if hasattr(data, 'get') else int(data.get('finetune_configs_id', 0)) + data_type_id = data.get('data_type_id', type=int) if hasattr(data, 'get') else int(data.get('data_type_id', 0)) + description = data.get('description') + if not finetune_configs_id: return TaskService.json_error('缺少必要参数: finetune_configs_id') + if not data_type_id: + return TaskService.json_error('缺少必要参数: data_type_id') finetune_config = FinetuneConfig.query.get(finetune_configs_id) if not finetune_config: -- 2.34.1