From 8d594060ed113ce8e35efa06fb4482282ad6a82d Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Mon, 13 Jul 2026 18:32:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/module_energy/report_review/model.py | 6 +-- .../v1/module_energy/report_review/schema.py | 2 +- .../v1/module_energy/report_review/service.py | 48 ++++++++++++------- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/app/api/v1/module_energy/report_review/model.py b/app/api/v1/module_energy/report_review/model.py index 2e0f59f..22993ed 100644 --- a/app/api/v1/module_energy/report_review/model.py +++ b/app/api/v1/module_energy/report_review/model.py @@ -22,10 +22,10 @@ class EnergyReportReviewModel(ModelMixin, TenantMixin, UserMixin): task_name: Mapped[str] = mapped_column(String(128), nullable=False, comment="任务名称", index=True) report_type: Mapped[int] = mapped_column(Integer, default=1, nullable=False, comment="报告类型 1:能源报告 2:光伏报告", index=True) - template_id: Mapped[int] = mapped_column( + template_id: Mapped[int | None] = mapped_column( Integer, - ForeignKey("energy_report_template.id", ondelete="RESTRICT", onupdate="CASCADE"), - nullable=False, + ForeignKey("energy_report_template.id", ondelete="SET NULL", onupdate="CASCADE"), + nullable=True, index=True, comment="能源报告模板ID", ) diff --git a/app/api/v1/module_energy/report_review/schema.py b/app/api/v1/module_energy/report_review/schema.py index 618978f..693b4ac 100644 --- a/app/api/v1/module_energy/report_review/schema.py +++ b/app/api/v1/module_energy/report_review/schema.py @@ -16,7 +16,7 @@ class EnergyReportReviewCreateSchema(BaseModel): task_name: str = Field(..., min_length=1, max_length=128, description="任务名称") report_type: int = Field(default=1, ge=1, le=2, description="报告类型 1:能源报告 2:光伏报告") - template_id: int = Field(..., ge=1, description="能源报告模板ID") + template_id: int | None = Field(default=None, ge=1, description="能源报告模板ID") file_id: int = Field(..., ge=1, description="上传文档文件ID") attachment_file_id: int | None = Field(default=None, ge=1, description="附件文件ID") status: int = Field(default=0, ge=0, le=3, description="状态 0:待审查 1:审查中 2:已审查 3:审查失败") diff --git a/app/api/v1/module_energy/report_review/service.py b/app/api/v1/module_energy/report_review/service.py index f8a60c0..9a7e250 100644 --- a/app/api/v1/module_energy/report_review/service.py +++ b/app/api/v1/module_energy/report_review/service.py @@ -46,7 +46,7 @@ class EnergyReportReviewService: order_by: list[dict[str, str]] | None = None, ) -> dict: search_dict = self._build_search_dict(search) - stats = await self._stats(search_dict=search_dict) + stats = await self._stats(search_dict=self._build_stats_search(search_dict)) offset = (page_no - 1) * page_size page_result = await EnergyReportReviewCRUD(self.auth).page( offset=offset, @@ -66,7 +66,7 @@ class EnergyReportReviewService: } async def create(self, data: EnergyReportReviewCreateSchema) -> EnergyReportReviewOutSchema: - await self._validate_template(template_id=data.template_id, report_type=data.report_type) + template = await self._validate_template(template_id=data.template_id) await self._validate_file(file_id=data.file_id) attachment_file = await self._validate_attachment_file( attachment_file_id=data.attachment_file_id, @@ -74,6 +74,8 @@ class EnergyReportReviewService: ) await self._validate_reviewer(reviewer_id=data.reviewer_id) create_data = data.model_dump() + if template: + create_data["report_type"] = template.report_type create_data["attachment_url"] = attachment_file.file_url if attachment_file else None review = await EnergyReportReviewCRUD(self.auth).create(data=create_data) await self._bind_file(file_id=data.file_id, review_id=review.id) @@ -89,7 +91,7 @@ class EnergyReportReviewService: async def update(self, id: int, data: EnergyReportReviewUpdateSchema) -> EnergyReportReviewOutSchema: old_review = await EnergyReportReviewCRUD(self.auth).get_or_404(id=id, msg="更新失败,能源报告审核任务不存在") - await self._validate_template(template_id=data.template_id, report_type=data.report_type) + template = await self._validate_template(template_id=data.template_id) await self._validate_file(file_id=data.file_id, current_review_id=id) if old_review.attachment_file_id and old_review.attachment_file_id == data.file_id: raise CustomException(msg="更新失败,上传文档不能使用原附件文件") @@ -102,6 +104,8 @@ class EnergyReportReviewService: ) await self._validate_reviewer(reviewer_id=data.reviewer_id) update_data = data.model_dump(exclude_unset=True) + if template: + update_data["report_type"] = template.report_type update_data["attachment_url"] = attachment_file.file_url if attachment_file else None review = await EnergyReportReviewCRUD(self.auth).update(id=id, data=update_data) if old_review.file_id != data.file_id: @@ -138,23 +142,34 @@ class EnergyReportReviewService: def _build_stats_search(self, search_dict: dict | None = None) -> dict: if not search_dict: return {} - stats_keys = {"created_time", "updated_time", "tenant_id", "created_id", "updated_id"} + stats_keys = {"report_type", "created_time", "updated_time", "tenant_id", "created_id", "updated_id"} return {key: value for key, value in search_dict.items() if key in stats_keys and value is not None} - def _build_search_dict(self, search: EnergyReportReviewQueryParam | None = None) -> dict | None: + def _build_search_dict(self, search: EnergyReportReviewQueryParam | None = None) -> dict: if not search: - return None - search_dict = vars(search).copy() + return {} + + raw_search = vars(search) + search_dict = {} like_fields = {"task_name"} eq_fields = {"report_type", "status", "template_id", "reviewer_id", "tenant_id", "created_id", "updated_id"} + range_fields = {"created_time", "updated_time"} + for field in like_fields: - value = search_dict.get(field) - if value is not None and value != "" and not isinstance(value, tuple): - search_dict[field] = (QueueEnum.like.value, value) + value = raw_search.get(field) + if value is not None and value != "": + search_dict[field] = value if isinstance(value, tuple) else (QueueEnum.like.value, value) + for field in eq_fields: - value = search_dict.get(field) - if value is not None and value != "" and not isinstance(value, tuple): - search_dict[field] = (QueueEnum.eq.value, int(value)) + value = raw_search.get(field) + if value is not None and value != "": + search_dict[field] = value if isinstance(value, tuple) else (QueueEnum.eq.value, int(value)) + + for field in range_fields: + value = raw_search.get(field) + if value is not None and value != "": + search_dict[field] = value + return search_dict def _to_out_schema(self, review) -> EnergyReportReviewOutSchema: @@ -194,12 +209,13 @@ class EnergyReportReviewService: item["reviewer_name"] = reviewer_info.get("name") return item - async def _validate_template(self, template_id: int, report_type: int) -> None: + async def _validate_template(self, template_id: int | None): + if template_id is None: + return None template = await EnergyReportTemplateCRUD(self.auth).get(id=template_id) if not template: raise CustomException(msg="能源报告模板不存在") - if template.report_type != report_type: - raise CustomException(msg="报告类型与模板类型不一致") + return template async def _validate_file(self, file_id: int, current_review_id: int | None = None) -> None: file_record = await FileCRUD(self.auth).get(id=file_id)