|
@@ -1,7 +1,6 @@
|
|
|
from sqlalchemy import and_, or_
|
|
|
-from sqlalchemy.orm import Session
|
|
|
from datetime import datetime
|
|
|
-from typing import Optional, List, Tuple
|
|
|
+from typing import Optional
|
|
|
|
|
|
import tools.db_helper as db_helper
|
|
|
from core.dtos import ProjectQuotaDto
|
|
@@ -9,8 +8,8 @@ from core.models import ProjectQuotaModel
|
|
|
from core.user_session import UserSession
|
|
|
|
|
|
class ProjectQuotaStore:
|
|
|
- def __init__(self, db_session: Session = None):
|
|
|
- self.db_session = db_helper.create_mysql_session()
|
|
|
+ def __init__(self):
|
|
|
+ self._database = None
|
|
|
self._current_user = None
|
|
|
|
|
|
@property
|
|
@@ -30,8 +29,6 @@ class ProjectQuotaStore:
|
|
|
process_status: Optional[int] = None,
|
|
|
send_status: Optional[int] = None,
|
|
|
):
|
|
|
- # 每次查询创建新的会话
|
|
|
- session = db_helper.create_mysql_session()
|
|
|
"""分页查询定额列表
|
|
|
|
|
|
Args:
|
|
@@ -47,8 +44,8 @@ class ProjectQuotaStore:
|
|
|
Returns:
|
|
|
Tuple[total_count, quotas]
|
|
|
"""
|
|
|
- try:
|
|
|
- query = session.query(ProjectQuotaModel)
|
|
|
+ with db_helper.mysql_query_session(self._database) as db_session:
|
|
|
+ query = db_session.query(ProjectQuotaModel)
|
|
|
|
|
|
# 构建查询条件
|
|
|
conditions = [
|
|
@@ -57,16 +54,16 @@ class ProjectQuotaStore:
|
|
|
ProjectQuotaModel.budget_id == budget_id,
|
|
|
ProjectQuotaModel.item_code.like(f"{item_code}%")
|
|
|
]
|
|
|
+
|
|
|
+ if process_status is not None:
|
|
|
+ conditions.append(ProjectQuotaModel.process_status == process_status)
|
|
|
+ if send_status is not None:
|
|
|
+ conditions.append(ProjectQuotaModel.send_status == send_status)
|
|
|
if keyword:
|
|
|
conditions.append(or_(
|
|
|
ProjectQuotaModel.quota_code.like(f"%{keyword}%"),
|
|
|
ProjectQuotaModel.project_name.like(f"%{keyword}%"),
|
|
|
))
|
|
|
- if process_status is not None:
|
|
|
- conditions.append(ProjectQuotaModel.process_status == process_status)
|
|
|
- if send_status is not None:
|
|
|
- conditions.append(ProjectQuotaModel.send_status == send_status)
|
|
|
-
|
|
|
query = query.filter(and_(*conditions))
|
|
|
|
|
|
# 计算总数
|
|
@@ -81,20 +78,20 @@ class ProjectQuotaStore:
|
|
|
'total': total_count,
|
|
|
'data': quotas
|
|
|
}
|
|
|
- finally:
|
|
|
- session.close()
|
|
|
+
|
|
|
|
|
|
def get_quotas_by_task_id(self,task_id:int, with_quota_code:bool=False):
|
|
|
- query = self.db_session.query(ProjectQuotaModel).filter(
|
|
|
- and_(
|
|
|
- ProjectQuotaModel.task_id == task_id,
|
|
|
- ProjectQuotaModel.is_del == 0
|
|
|
+ with db_helper.mysql_query_session(self._database) as db_session:
|
|
|
+ query = db_session.query(ProjectQuotaModel).filter(
|
|
|
+ and_(
|
|
|
+ ProjectQuotaModel.task_id == task_id,
|
|
|
+ ProjectQuotaModel.is_del == 0
|
|
|
+ )
|
|
|
)
|
|
|
- )
|
|
|
- if with_quota_code:
|
|
|
- query = query.filter(and_(ProjectQuotaModel.quota_code!=None,ProjectQuotaModel.quota_code!='') )
|
|
|
- quotas = query.all()
|
|
|
- return quotas
|
|
|
+ if with_quota_code:
|
|
|
+ query = query.filter(and_(ProjectQuotaModel.quota_code!=None,ProjectQuotaModel.quota_code!='') )
|
|
|
+ quotas = query.all()
|
|
|
+ return quotas
|
|
|
|
|
|
|
|
|
|
|
@@ -107,13 +104,14 @@ class ProjectQuotaStore:
|
|
|
Returns:
|
|
|
Optional[ProjectQuotaDto]
|
|
|
"""
|
|
|
- quota = self.db_session.query(ProjectQuotaModel).filter(
|
|
|
- and_(
|
|
|
- ProjectQuotaModel.id == quota_id,
|
|
|
- ProjectQuotaModel.is_del == 0
|
|
|
- )
|
|
|
- ).first()
|
|
|
- return quota
|
|
|
+ with db_helper.mysql_query_session(self._database) as db_session:
|
|
|
+ quota = db_session.query(ProjectQuotaModel).filter(
|
|
|
+ and_(
|
|
|
+ ProjectQuotaModel.id == quota_id,
|
|
|
+ ProjectQuotaModel.is_del == 0
|
|
|
+ )
|
|
|
+ ).first()
|
|
|
+ return quota
|
|
|
def get_quota_dto(self, quota_id: int) -> Optional[ProjectQuotaDto]:
|
|
|
"""根据ID查询定额
|
|
|
|
|
@@ -136,36 +134,36 @@ class ProjectQuotaStore:
|
|
|
Returns:
|
|
|
ProjectQuotaDto
|
|
|
"""
|
|
|
- quota = ProjectQuotaModel(
|
|
|
- project_id=quota_dto.project_id,
|
|
|
- budget_id=quota_dto.budget_id,
|
|
|
- item_id=quota_dto.item_id,
|
|
|
- item_code=quota_dto.item_code,
|
|
|
- quota_code=quota_dto.quota_code,
|
|
|
- project_name=quota_dto.project_name,
|
|
|
- unit=quota_dto.unit,
|
|
|
- project_quantity=quota_dto.project_quantity,
|
|
|
- project_quantity_input=quota_dto.project_quantity_input,
|
|
|
- quota_adjustment=quota_dto.quota_adjustment,
|
|
|
- unit_price=quota_dto.unit_price,
|
|
|
- total_price=quota_dto.total_price,
|
|
|
- unit_weight=quota_dto.unit_weight,
|
|
|
- total_weight=quota_dto.total_weight,
|
|
|
- labor_cost=quota_dto.labor_cost,
|
|
|
- process_status=quota_dto.process_status,
|
|
|
- process_time=quota_dto.process_time,
|
|
|
- process_error=quota_dto.process_error,
|
|
|
- send_status=quota_dto.send_status,
|
|
|
- send_time=quota_dto.send_time,
|
|
|
- send_error=quota_dto.send_error,
|
|
|
- created_by=self.current_user.username,
|
|
|
- created_at=datetime.now(),
|
|
|
- )
|
|
|
-
|
|
|
- self.db_session.add(quota)
|
|
|
- self.db_session.commit()
|
|
|
-
|
|
|
- return ProjectQuotaDto.from_model(quota)
|
|
|
+ with db_helper.mysql_session(self._database) as db_session:
|
|
|
+ quota = ProjectQuotaModel(
|
|
|
+ project_id=quota_dto.project_id,
|
|
|
+ budget_id=quota_dto.budget_id,
|
|
|
+ item_id=quota_dto.item_id,
|
|
|
+ item_code=quota_dto.item_code,
|
|
|
+ quota_code=quota_dto.quota_code,
|
|
|
+ project_name=quota_dto.project_name,
|
|
|
+ unit=quota_dto.unit,
|
|
|
+ project_quantity=quota_dto.project_quantity,
|
|
|
+ project_quantity_input=quota_dto.project_quantity_input,
|
|
|
+ quota_adjustment=quota_dto.quota_adjustment,
|
|
|
+ unit_price=quota_dto.unit_price,
|
|
|
+ total_price=quota_dto.total_price,
|
|
|
+ unit_weight=quota_dto.unit_weight,
|
|
|
+ total_weight=quota_dto.total_weight,
|
|
|
+ labor_cost=quota_dto.labor_cost,
|
|
|
+ process_status=quota_dto.process_status,
|
|
|
+ process_time=quota_dto.process_time,
|
|
|
+ process_error=quota_dto.process_error,
|
|
|
+ send_status=quota_dto.send_status,
|
|
|
+ send_time=quota_dto.send_time,
|
|
|
+ send_error=quota_dto.send_error,
|
|
|
+ created_by=self.current_user.username,
|
|
|
+ created_at=datetime.now(),
|
|
|
+ )
|
|
|
+
|
|
|
+ db_session.add(quota)
|
|
|
+ db_session.flush()
|
|
|
+ return ProjectQuotaDto.from_model(quota)
|
|
|
|
|
|
def update_quota(self, quota_dto: ProjectQuotaDto) -> Optional[ProjectQuotaDto]:
|
|
|
"""更新定额
|
|
@@ -180,23 +178,23 @@ class ProjectQuotaStore:
|
|
|
|
|
|
if not quota:
|
|
|
return None
|
|
|
- quota.quota_code = quota_dto.quota_code
|
|
|
- quota.project_name = quota_dto.project_name
|
|
|
- quota.unit = quota_dto.unit
|
|
|
- quota.project_quantity = quota_dto.project_quantity
|
|
|
- quota.project_quantity_input = quota_dto.project_quantity_input
|
|
|
- quota.quota_adjustment = quota_dto.quota_adjustment
|
|
|
- quota.unit_price = quota_dto.unit_price
|
|
|
- quota.total_price = quota_dto.total_price
|
|
|
- quota.unit_weight = quota_dto.unit_weight
|
|
|
- quota.total_weight = quota_dto.total_weight
|
|
|
- quota.labor_cost = quota_dto.labor_cost
|
|
|
- quota.updated_by = self.current_user.username
|
|
|
- quota.updated_at = datetime.now()
|
|
|
-
|
|
|
- self.db_session.commit()
|
|
|
-
|
|
|
- return ProjectQuotaDto.from_model(quota)
|
|
|
+ with db_helper.mysql_session(self._database) as db_session:
|
|
|
+ quota.quota_code = quota_dto.quota_code
|
|
|
+ quota.project_name = quota_dto.project_name
|
|
|
+ quota.unit = quota_dto.unit
|
|
|
+ quota.project_quantity = quota_dto.project_quantity
|
|
|
+ quota.project_quantity_input = quota_dto.project_quantity_input
|
|
|
+ quota.quota_adjustment = quota_dto.quota_adjustment
|
|
|
+ quota.unit_price = quota_dto.unit_price
|
|
|
+ quota.total_price = quota_dto.total_price
|
|
|
+ quota.unit_weight = quota_dto.unit_weight
|
|
|
+ quota.total_weight = quota_dto.total_weight
|
|
|
+ quota.labor_cost = quota_dto.labor_cost
|
|
|
+ quota.updated_by = self.current_user.username
|
|
|
+ quota.updated_at = datetime.now()
|
|
|
+
|
|
|
+ quota = db_session.merge(quota)
|
|
|
+ return ProjectQuotaDto.from_model(quota)
|
|
|
|
|
|
def delete_quota(self, quota_id: int) -> bool:
|
|
|
"""删除定额
|
|
@@ -207,21 +205,17 @@ class ProjectQuotaStore:
|
|
|
Returns:
|
|
|
bool
|
|
|
"""
|
|
|
- quota = self.db_session.query(ProjectQuotaModel).filter(
|
|
|
- and_(
|
|
|
- ProjectQuotaModel.id == quota_id,
|
|
|
- ProjectQuotaModel.is_del == 0
|
|
|
- )
|
|
|
- ).first()
|
|
|
|
|
|
+ quota = self.get_quota(quota_id)
|
|
|
if not quota:
|
|
|
return False
|
|
|
|
|
|
- quota.is_del = 1
|
|
|
- quota.deleted_by = self.current_user.username
|
|
|
- quota.deleted_at = datetime.now()
|
|
|
- self.db_session.commit()
|
|
|
- return True
|
|
|
+ with db_helper.mysql_session(self._database) as db_session:
|
|
|
+ quota.is_del = 1
|
|
|
+ quota.deleted_by = self.current_user.username
|
|
|
+ quota.deleted_at = datetime.now()
|
|
|
+ quota = db_session.merge(quota)
|
|
|
+ return True
|
|
|
|
|
|
def update_process_status(self,quota_id:int, status:int, err:str = None):
|
|
|
"""
|
|
@@ -236,10 +230,12 @@ class ProjectQuotaStore:
|
|
|
quota = self.get_quota(quota_id)
|
|
|
if not quota:
|
|
|
return False
|
|
|
- quota.process_status = status
|
|
|
- quota.process_error = err
|
|
|
- quota.process_time = datetime.now()
|
|
|
- self.db_session.commit()
|
|
|
+ with db_helper.mysql_session(self._database) as db_session:
|
|
|
+ quota.process_status = status
|
|
|
+ quota.process_error = err
|
|
|
+ quota.process_time = datetime.now()
|
|
|
+ quota = db_session.merge(quota)
|
|
|
+ return True
|
|
|
|
|
|
def update_send_status(self,quota_id:int, status:int, err:str = None) -> bool:
|
|
|
"""
|
|
@@ -254,8 +250,10 @@ class ProjectQuotaStore:
|
|
|
quota = self.get_quota(quota_id)
|
|
|
if not quota:
|
|
|
return False
|
|
|
- quota.send_status = status
|
|
|
- quota.send_error = err
|
|
|
- quota.send_time = datetime.now()
|
|
|
- self.db_session.commit()
|
|
|
+ with db_helper.mysql_session(self._database) as db_session:
|
|
|
+ quota.send_status = status
|
|
|
+ quota.send_error = err
|
|
|
+ quota.send_time = datetime.now()
|
|
|
+ quota = db_session.merge(quota)
|
|
|
+ return True
|
|
|
|