|
|
|
|
@ -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)
|
|
|
|
|
|