|
|
|
|
@ -1,7 +1,8 @@
|
|
|
|
|
from app.api.v1.module_common.file.crud import FileCRUD
|
|
|
|
|
from sqlalchemy import select
|
|
|
|
|
|
|
|
|
|
from app.api.v1.module_common.file.crud import FileCRUD
|
|
|
|
|
from app.core.base_schema import AuthSchema
|
|
|
|
|
from app.core.exceptions import CustomException
|
|
|
|
|
from sqlalchemy import select
|
|
|
|
|
|
|
|
|
|
from .crud import EnergyReportTemplateCRUD
|
|
|
|
|
from .model import EnergyReportTemplateModel
|
|
|
|
|
@ -16,7 +17,7 @@ ENERGY_REPORT_TEMPLATE_BUSINESS_TYPE = "energy_report_template"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EnergyReportTemplateService:
|
|
|
|
|
"""鑳芥簮鎶ュ憡妯℃澘鏈嶅姟銆?""
|
|
|
|
|
"""能源报告模板服务。"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, auth: AuthSchema) -> None:
|
|
|
|
|
self.auth = auth
|
|
|
|
|
@ -48,15 +49,15 @@ class EnergyReportTemplateService:
|
|
|
|
|
return page_result
|
|
|
|
|
|
|
|
|
|
async def create(self, data: EnergyReportTemplateCreateSchema) -> EnergyReportTemplateOutSchema:
|
|
|
|
|
await self._validate_unique_name(template_name=data.template_name)
|
|
|
|
|
await self._validate_unique_name(template_name=data.template_name, tenant_id=self._current_tenant_id())
|
|
|
|
|
await self._validate_file(file_id=data.file_id)
|
|
|
|
|
template = await EnergyReportTemplateCRUD(self.auth).create(data=data)
|
|
|
|
|
await self._bind_file(file_id=data.file_id, template_id=template.id)
|
|
|
|
|
return self._to_out_schema(template)
|
|
|
|
|
|
|
|
|
|
async def update(self, id: int, data: EnergyReportTemplateUpdateSchema) -> EnergyReportTemplateOutSchema:
|
|
|
|
|
old_template = await EnergyReportTemplateCRUD(self.auth).get_or_404(id=id, msg="鏇存柊澶辫触锛岃兘婧愭姤鍛婃ā鏉夸笉瀛樺湪")
|
|
|
|
|
await self._validate_unique_name(template_name=data.template_name, exclude_id=id)
|
|
|
|
|
old_template = await EnergyReportTemplateCRUD(self.auth).get_or_404(id=id, msg="更新失败,能源报告模板不存在")
|
|
|
|
|
await self._validate_unique_name(template_name=data.template_name, exclude_id=id, tenant_id=old_template.tenant_id)
|
|
|
|
|
await self._validate_file(file_id=data.file_id, current_template_id=id)
|
|
|
|
|
template = await EnergyReportTemplateCRUD(self.auth).update(id=id, data=data)
|
|
|
|
|
if old_template.file_id != data.file_id:
|
|
|
|
|
@ -66,12 +67,12 @@ class EnergyReportTemplateService:
|
|
|
|
|
|
|
|
|
|
async def delete(self, ids: list[int]) -> None:
|
|
|
|
|
if len(ids) < 1:
|
|
|
|
|
raise CustomException(msg="鍒犻櫎澶辫触锛屽垹闄ゅ璞′笉鑳戒负绌?)
|
|
|
|
|
raise CustomException(msg="删除失败,删除对象不能为空")
|
|
|
|
|
templates = await EnergyReportTemplateCRUD(self.auth).get_list(search={"id": ("in", ids)})
|
|
|
|
|
template_map = {template.id: template for template in templates}
|
|
|
|
|
for template_id in ids:
|
|
|
|
|
if template_id not in template_map:
|
|
|
|
|
raise CustomException(msg="鍒犻櫎澶辫触锛岃兘婧愭姤鍛婃ā鏉夸笉瀛樺湪")
|
|
|
|
|
raise CustomException(msg="删除失败,能源报告模板不存在")
|
|
|
|
|
for template in templates:
|
|
|
|
|
await self._unbind_file(file_id=template.file_id, template_id=template.id)
|
|
|
|
|
await EnergyReportTemplateCRUD(self.auth).delete(ids=ids)
|
|
|
|
|
@ -84,19 +85,38 @@ class EnergyReportTemplateService:
|
|
|
|
|
template_out.object_name = template_out.file.object_name
|
|
|
|
|
return template_out
|
|
|
|
|
|
|
|
|
|
async def _validate_unique_name(self, template_name: str, exclude_id: int | None = None) -> None:
|
|
|
|
|
template = await EnergyReportTemplateCRUD(self.auth).get(template_name=template_name)
|
|
|
|
|
if template and template.id != exclude_id:
|
|
|
|
|
raise CustomException(msg="鑳芥簮鎶ュ憡妯℃澘鍚嶇О宸插瓨鍦?)
|
|
|
|
|
async def _validate_unique_name(
|
|
|
|
|
self,
|
|
|
|
|
template_name: str,
|
|
|
|
|
exclude_id: int | None = None,
|
|
|
|
|
tenant_id: int | None = None,
|
|
|
|
|
) -> None:
|
|
|
|
|
if self.auth.db is None:
|
|
|
|
|
raise CustomException(msg="数据库会话不存在")
|
|
|
|
|
sql = select(EnergyReportTemplateModel.id).where(
|
|
|
|
|
EnergyReportTemplateModel.template_name == template_name,
|
|
|
|
|
)
|
|
|
|
|
if tenant_id is not None:
|
|
|
|
|
sql = sql.where(EnergyReportTemplateModel.tenant_id == tenant_id)
|
|
|
|
|
if exclude_id is not None:
|
|
|
|
|
sql = sql.where(EnergyReportTemplateModel.id != exclude_id)
|
|
|
|
|
result = await self.auth.db.execute(sql.limit(1))
|
|
|
|
|
if result.scalar_one_or_none() is not None:
|
|
|
|
|
raise CustomException(msg="能源报告模板名称已存在")
|
|
|
|
|
|
|
|
|
|
def _current_tenant_id(self) -> int | None:
|
|
|
|
|
if not self.auth.user:
|
|
|
|
|
return self.auth.tenant_id
|
|
|
|
|
return self.auth.tenant_id or self.auth.user.tenant_id
|
|
|
|
|
|
|
|
|
|
async def _validate_file(self, file_id: int, current_template_id: int | None = None) -> None:
|
|
|
|
|
file_record = await FileCRUD(self.auth).get(id=file_id)
|
|
|
|
|
if not file_record:
|
|
|
|
|
raise CustomException(msg="鏂囦欢璁板綍涓嶅瓨鍦?)
|
|
|
|
|
raise CustomException(msg="文件记录不存在")
|
|
|
|
|
if file_record.business_type and file_record.business_type != ENERGY_REPORT_TEMPLATE_BUSINESS_TYPE:
|
|
|
|
|
raise CustomException(msg="鏂囦欢宸茬粦瀹氬埌鍏朵粬涓氬姟绫诲瀷")
|
|
|
|
|
raise CustomException(msg="文件已绑定到其他业务类型")
|
|
|
|
|
if file_record.business_id and file_record.business_id != current_template_id:
|
|
|
|
|
raise CustomException(msg="鏂囦欢宸茬粦瀹氬埌鍏朵粬鑳芥簮鎶ュ憡妯℃澘")
|
|
|
|
|
raise CustomException(msg="文件已绑定到其他能源报告模板")
|
|
|
|
|
|
|
|
|
|
async def _bind_file(self, file_id: int, template_id: int) -> None:
|
|
|
|
|
await FileCRUD(self.auth).set(
|
|
|
|
|
@ -111,4 +131,3 @@ class EnergyReportTemplateService:
|
|
|
|
|
return
|
|
|
|
|
if file_record.business_type == ENERGY_REPORT_TEMPLATE_BUSINESS_TYPE and file_record.business_id == template_id:
|
|
|
|
|
await FileCRUD(self.auth).set(ids=[file_id], business_id=None)
|
|
|
|
|
|
|
|
|
|
|