| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- from typing import Optional
- import tools.utils as utils,threading
- from core.dtos import ProjectQuotaDto
- from core.enum import SendStatusEnum
- from core.models import ProjectQuotaModel
- from stores import ProjectQuotaStore
- import executor
- class ProjectQuotaService:
- def __init__(self):
- self.store = ProjectQuotaStore()
- self._logger = utils.get_logger()
- def get_quotas_paginated(self, budget_id: int, project_id: str, item_code: str, page: int = 1, page_size: int = 10,
- keyword: Optional[str] = None, send_status: Optional[int] = None):
- """获取项目定额列表
- Args:
- budget_id: 概算序号
- project_id: 项目编号
- item_code: 条目编号
- page: 页码
- page_size: 每页数量
- keyword: 关键字
- send_status: 发送状态
- Returns:
- dict: 包含总数和定额列表的字典
- """
- try:
- data = self.store.get_quotas_paginated(
- budget_id=budget_id,
- project_id=project_id,
- item_code=item_code,
- page=page,
- page_size=page_size,
- keyword=keyword,
- send_status=send_status
- )
- return [ProjectQuotaDto.from_model(quota).to_dict() for quota in data.get('data',[])],data.get('total',0)
- except Exception as e:
- # 记录错误日志
- print(f"获取项目定额列表失败: {str(e)}")
- raise
- def get_quotas_by_task_paginated(self, task_id: int, budget_id, project_id, item_code, page: int = 1, page_size: int = 10,keyword: Optional[str]=None,send_status: Optional[int] = None):
- try:
- data = self.store.get_quotas_by_task_paginated(
- task_id=task_id,
- budget_id=budget_id,
- project_id=project_id,
- item_code=item_code,
- page=page,
- page_size=page_size,
- send_status=send_status,
- keyword=keyword
- )
- return [ProjectQuotaDto.from_model(quota).to_dict() for quota in data.get('data',[])],data.get('total',0)
- except Exception as e:
- self._logger.error(f"获取任务项目定额列表失败: {str(e)}")
- raise
- def get_quota_dto(self, quota_id: int):
- try:
- return self.store.get_quota_dto(quota_id)
- except Exception as e:
- self._logger.error(f"获取定额条目DTO失败: {str(e)}")
- raise
- def get_quota(self, quota_id: int) -> Optional[ProjectQuotaModel]:
- """获取单个项目定额
- Args:
- quota_id: 定额ID
- Returns:
- Optional[ProjectQuotaDto]: 项目定额DTO对象
- """
- try:
- return self.store.get_quota(quota_id)
- except Exception as e:
- self._logger.error(f"获取定额条目失败: {str(e)}")
- raise
- def save_quota(self, quota_dto: ProjectQuotaDto) -> Optional[ProjectQuotaDto]:
- """保存定额"""
- try:
- # 业务验证
- if quota_dto.id == 0:
- quota_dto = self.create_quota(quota_dto)
- else:
- quota_dto = self.update_quota(quota_dto)
- # self.update_process_status(quota_dto.id,4)
- if quota_dto.send_status != SendStatusEnum.NEW.value:
- self.update_send_status(quota_dto.id, SendStatusEnum.CHANGE.value)
- return quota_dto
- except Exception as e:
- self._logger.error(f"保存定额条目失败: {str(e)}")
- raise
- def create_quota(self, quota_dto: ProjectQuotaDto) -> ProjectQuotaDto:
- """创建项目定额
- Args:
- quota_dto: 定额DTO对象
- Returns:
- ProjectQuotaDto: 创建后的定额DTO对象
- """
- try:
- # 业务验证
- if not quota_dto.project_id or not quota_dto.budget_id:
- raise ValueError("项目编号和概算序号不能为空")
- return self.store.create_quota(quota_dto)
- except Exception as e:
- self._logger.error(f"创建项目定额失败: {str(e)}")
- raise
- def update_quota(self, quota_dto: ProjectQuotaDto) -> Optional[ProjectQuotaDto]:
- """更新项目定额
- Args:
- quota_dto: 定额DTO对象
- Returns:
- Optional[ProjectQuotaDto]: 更新后的定额DTO对象
- """
- try:
- # 业务验证
- if not quota_dto.id:
- raise ValueError("定额ID不能为空")
- return self.store.update_quota(quota_dto)
- except Exception as e:
- self._logger.error(f"更新项目定额失败: {str(e)}")
- raise
- def delete_quota(self, quota_id: int) -> bool:
- """删除项目定额
- Args:
- quota_id: 定额ID
- Returns:
- bool: 删除是否成功
- """
- try:
- return self.store.delete_quota(quota_id)
- except Exception as e:
- self._logger.error(f"删除项目定额失败: {str(e)}")
- raise
- def update_send_status(self, quota_id: int, status: int, err: str = None) -> bool:
- """更新发送状态
- Args:
- quota_id: 定额ID
- status: 状态值
- err: 错误信息
- Returns:
- bool: 更新是否成功
- """
- try:
- return self.store.update_send_status(quota_id, status, err)
- except Exception as e:
- self._logger.error(f"更新项目定额发送状态失败: {str(e)}")
- raise
- # def start_process(self, quota_id: int) -> Optional[str]:
- # """启动处理"""
- # quota = self.get_quota_dto(quota_id)
- # if quota:
- # self.update_process_status(quota_id, 1)
- # thread = threading.Thread(target=self._process_quota, args=(quota,))
- # thread.start()
- # else:
- # return "定额条目没有查询到"
- #
- # def _process_quota(self, quota: ProjectQuotaDto):
- # try:
- # msg = executor.process_quota(quota)
- # if not msg:
- # self.start_send(quota.id)
- # except Exception as e:
- # self._logger.error(f"处理定额条目失败: {str(e)}")
- # self.update_process_status(quota.id, 3, str(e))
- # raise
- def start_send_by_ids(self, ids: str,is_cover: bool = False):
- try:
- id_list= ids.split(',')
- err =""
- for _id in id_list:
- msg = self.start_send(int(_id),is_cover)
- if msg:
- err += f"{msg}[{_id}],"
- return err
- except Exception as e:
- self._logger.error(f"批量启动定额条目发送失败: {str(e)}")
- raise
- def start_send(self, _id: int, is_cover: bool = False) -> Optional[str]:
- """启动发送"""
- quota = self.get_quota_dto(_id)
- if quota:
- self.update_send_status(_id, 1)
- if not is_cover:
- quota.quota_id = 0
- thread = threading.Thread(target=self._send_quota, args=(quota,))
- thread.start()
- return None
- else:
- return "定额条目没有查询到"
- def _send_quota(self, quota: ProjectQuotaDto):
- try:
- executor.send_quota(quota)
- except Exception as e:
- self._logger.error(f"发送定额条目失败: {str(e)}")
- self.update_send_status(quota.id, 3, str(e))
- raise
|