You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							249 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							249 lines
						
					
					
						
							10 KiB
						
					
					
				
								from fastapi import Request
							 | 
						|
								from sqlalchemy.ext.asyncio import AsyncSession
							 | 
						|
								from exceptions.exception import ServiceException
							 | 
						|
								from module_admin.dao.datastd_dao import DataStdDao
							 | 
						|
								from module_admin.entity.vo.common_vo import CrudResponseModel
							 | 
						|
								from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DeleteDataStdModel
							 | 
						|
								from utils.common_util import CamelCaseUtil
							 | 
						|
								import uuid
							 | 
						|
								from config.constant import CommonConstant
							 | 
						|
								
							 | 
						|
								class DataStdService:
							 | 
						|
								    """
							 | 
						|
								    数据源标准服务层
							 | 
						|
								    """
							 | 
						|
								
							 | 
						|
								    @classmethod
							 | 
						|
								    async def get_std_code_list_services(
							 | 
						|
								        cls, query_db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False
							 | 
						|
								    ):
							 | 
						|
								        """
							 | 
						|
								        获取列配置列表信息service
							 | 
						|
								
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param query_object: 查询参数对象
							 | 
						|
								        :param is_page: 是否开启分页
							 | 
						|
								        :return: 列配置列表信息对象
							 | 
						|
								        """
							 | 
						|
								        col_list_result = await DataStdDao.get_std_code_list(query_db, query_object, is_page)
							 | 
						|
								        return col_list_result
							 | 
						|
								
							 | 
						|
								    @classmethod
							 | 
						|
								    async def get_std_code_map_list_services(
							 | 
						|
								        cls, query_db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False
							 | 
						|
								    ):
							 | 
						|
								        """
							 | 
						|
								        获取列配置列表信息service
							 | 
						|
								
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param query_object: 查询参数对象
							 | 
						|
								        :param is_page: 是否开启分页
							 | 
						|
								        :return: 列配置列表信息对象
							 | 
						|
								        """
							 | 
						|
								        col_list_result = await DataStdDao.get_std_code_map_list(query_db, query_object, is_page)
							 | 
						|
								        return col_list_result
							 | 
						|
								    @classmethod
							 | 
						|
								    async def get_std_code_by_id_services(cls, query_db: AsyncSession, id: str):
							 | 
						|
								        """
							 | 
						|
								        获取列配置详细信息service
							 | 
						|
								
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param id: 列配置ID
							 | 
						|
								        :return: 列配置详细信息对象
							 | 
						|
								        """
							 | 
						|
								        col = await DataStdDao.get_std_code_by_id(query_db, id)
							 | 
						|
								        if col:
							 | 
						|
								            result = DataStdCodeModel(**CamelCaseUtil.transform_result(col))
							 | 
						|
								        else:
							 | 
						|
								            result = DataStdCodeModel(**dict())
							 | 
						|
								        return result
							 | 
						|
								
							 | 
						|
								  
							 | 
						|
								    @classmethod
							 | 
						|
								    async def add_std_code_services(cls, request: Request, query_db: AsyncSession, page_object: DataStdCodeModel):
							 | 
						|
								        """
							 | 
						|
								        新增列配置服务
							 | 
						|
								
							 | 
						|
								        :param request: Request对象
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param page_object: 新增的列配置对象
							 | 
						|
								        :return: 新增列配置校验结果
							 | 
						|
								        """
							 | 
						|
								        try:
							 | 
						|
								            # 创建新的 page_object 实例,避免修改原始对象
							 | 
						|
								            new_page_object = DataStdCodeModel(**page_object.model_dump(by_alias=True))
							 | 
						|
								            new_page_object.code_status="0"
							 | 
						|
								            # 调用 DAO 方法插入数据
							 | 
						|
								            await DataStdDao.add_std_code(query_db, new_page_object)
							 | 
						|
								            return CrudResponseModel(is_success=True, message='新增标准代码成功')
							 | 
						|
								        except Exception as e:
							 | 
						|
								            await query_db.rollback()
							 | 
						|
								            raise e
							 | 
						|
								 
							 | 
						|
								
							 | 
						|
								    @classmethod
							 | 
						|
								    async def code_detail_services(cls, query_db: AsyncSession, col: str):
							 | 
						|
								        """
							 | 
						|
								        获取参数配置详细信息service
							 | 
						|
								
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param config_id: 参数配置id
							 | 
						|
								        :return: 参数配置id对应的信息
							 | 
						|
								        """
							 | 
						|
								        config = await DataStdDao.get_std_code_by_id(query_db, col)
							 | 
						|
								        if config:
							 | 
						|
								            result = DataStdCodeModel(**CamelCaseUtil.transform_result(config))
							 | 
						|
								        else:
							 | 
						|
								            result = DataStdCodeModel(**dict())
							 | 
						|
								
							 | 
						|
								        return result
							 | 
						|
								    @classmethod
							 | 
						|
								    async def edit_std_code_services(cls, request: Request, query_db: AsyncSession, page_object: DataStdCodeModel):
							 | 
						|
								        """
							 | 
						|
								        编辑列配置服务
							 | 
						|
								
							 | 
						|
								        :param request: Request对象
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param page_object: 编辑的列配置对象
							 | 
						|
								        :return: 编辑列配置校验结果
							 | 
						|
								        """
							 | 
						|
								        edit_col = page_object.model_dump(exclude_unset=True)
							 | 
						|
								        col_info = await cls.get_std_code_by_id_services(query_db, page_object.id)
							 | 
						|
								
							 | 
						|
								        if col_info:
							 | 
						|
								            try:
							 | 
						|
								                await DataStdDao.update_std_code(query_db, edit_col)
							 | 
						|
								                return CrudResponseModel(is_success=True, message='编辑标准代码成功')
							 | 
						|
								            except Exception as e:
							 | 
						|
								                await query_db.rollback()
							 | 
						|
								                raise e
							 | 
						|
								        else:
							 | 
						|
								            raise ServiceException(message=f'标准代码{page_object.id}不存在')
							 | 
						|
								
							 | 
						|
								 
							 | 
						|
								    @classmethod
							 | 
						|
								    async def delete_std_code_services(cls, request: Request, query_db: AsyncSession, page_object: DeleteDataStdModel):
							 | 
						|
								        """
							 | 
						|
								        删除列配置服务
							 | 
						|
								        :param request: Request对象
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param page_object: 删除列配置对象
							 | 
						|
								        :return: 删除列配置校验结果
							 | 
						|
								        """
							 | 
						|
								        if page_object.ids:
							 | 
						|
								            col_id_list = page_object.ids.split(',')
							 | 
						|
								            try:
							 | 
						|
								                for col_id in col_id_list:
							 | 
						|
								                    col_info = await cls.get_std_code_by_id_services(query_db, col_id)
							 | 
						|
								                    if col_info:
							 | 
						|
								                        # 校验不能删除的系统内置列
							 | 
						|
								                        await DataStdDao.delete_std_code(query_db, col_id)
							 | 
						|
								                await query_db.commit()
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								                return CrudResponseModel(is_success=True, message='删除列配置成功')
							 | 
						|
								            except Exception as e:
							 | 
						|
								                await query_db.rollback()
							 | 
						|
								                raise e
							 | 
						|
								        else:
							 | 
						|
								            raise ServiceException(message='传入列配置ID为空')
							 | 
						|
								        
							 | 
						|
								    @classmethod
							 | 
						|
								    async def add_std_code_with_items_services(cls, request, query_db: AsyncSession, code: DataStdCodeModel, code_item_list: list[DataStdCodeModel]):
							 | 
						|
								     """
							 | 
						|
								     新增标准代码和对应的代码项
							 | 
						|
								     """
							 | 
						|
								     try:
							 | 
						|
								         # 先校验标准代码是否唯一
							 | 
						|
								         if not await cls.check_code_unique_services(query_db, code):
							 | 
						|
								             raise ServiceException(message=f'新增代码{code.code_name}失败,{code.code_num}代码已存在')
							 | 
						|
								         else:
							 | 
						|
								             # 保存标准代码
							 | 
						|
								             code.id=str(uuid.uuid4())
							 | 
						|
								             await cls.add_std_code_services(request, query_db, code)
							 | 
						|
								
							 | 
						|
								         # 为每个代码项设置parent_id,并进行校验
							 | 
						|
								         for code_item in code_item_list:
							 | 
						|
								             # 校验同一个父级下,code是否已存在
							 | 
						|
								             code_item.parent_id = code.id
							 | 
						|
								             if not await cls.check_code_unique_services(query_db, code_item):
							 | 
						|
								                 raise ServiceException(message=f"父级代码{code.code_num}下的代码项{code_item.code_num}已存在")
							 | 
						|
								
							 | 
						|
								             # 将parent_id设为code的ID
							 | 
						|
								             code_item.id=str(uuid.uuid4())
							 | 
						|
								             code_item.create_by=code.create_by
							 | 
						|
								             code_item.create_time=code.create_time
							 | 
						|
								             code_item.update_by=code.update_by
							 | 
						|
								             code_item.update_time=code.update_time
							 | 
						|
								             await cls.add_std_code_services(request, query_db, code_item)
							 | 
						|
								
							 | 
						|
								         # 提交事务
							 | 
						|
								         await query_db.commit()
							 | 
						|
								         return CrudResponseModel(is_success=True, message='标准代码和代码项新增成功')
							 | 
						|
								
							 | 
						|
								     except Exception as e:
							 | 
						|
								         await query_db.rollback()
							 | 
						|
								         raise ServiceException(message=f"新增标准代码失败: {str(e)}")
							 | 
						|
								    @classmethod
							 | 
						|
								    async def edit_std_code_with_items_services(cls, request, query_db: AsyncSession, code: DataStdCodeModel, code_item_list: list[DataStdCodeModel]):
							 | 
						|
								        """
							 | 
						|
								        修改标准代码和对应的代码项。如果code_item.id为0,则执行新增操作,否则执行更新操作。
							 | 
						|
								        """
							 | 
						|
								        try:
							 | 
						|
								              # 校验标准代码是否存在并且唯一
							 | 
						|
								              if not await cls.check_code_unique_services(query_db, code):
							 | 
						|
								                  raise ServiceException(message=f'修改代码{code.code_name}失败,{code.code_num}代码不存在或已存在')
							 | 
						|
								  
							 | 
						|
								              # 更新标准代码
							 | 
						|
								              await cls.edit_std_code_services(request, query_db, code)
							 | 
						|
								  
							 | 
						|
								              # 为每个代码项设置parent_id,并进行校验
							 | 
						|
								              for code_item in code_item_list:
							 | 
						|
								                  code_item.parent_id = code.id
							 | 
						|
								                  if code_item.id :  
							 | 
						|
								                      # 校验同一个父级下,code_num是否已存在
							 | 
						|
								                      if not await cls.check_code_unique_services(query_db, code_item):
							 | 
						|
								                          raise ServiceException(message=f"父级代码{code.code_num}下的代码项{code_item.code_num}已存在")
							 | 
						|
								  
							 | 
						|
								                      # 更新代码项的相关信息
							 | 
						|
								                      code_item.update_time = code.update_time
							 | 
						|
								                      code_item.update_by = code.update_by
							 | 
						|
								                      await cls.edit_std_code_services(request, query_db, code_item)  # 执行更新操作                
							 | 
						|
								  
							 | 
						|
								                  else:  # 如果code_item的id不为0,表示是修改操作
							 | 
						|
								                  # 校验同一个父级下,code_num是否已存在
							 | 
						|
								                      if not await cls.check_code_unique_services(query_db, code_item):
							 | 
						|
								                          raise ServiceException(message=f"父级代码{code.code_num}下的代码项{code_item.code_num}已存在")
							 | 
						|
								                      # 生成新的UUID,并新增代码项
							 | 
						|
								                      code_item.id = str(uuid.uuid4()) # 新生成的UUID
							 | 
						|
								                      code_item.create_time = code.update_time
							 | 
						|
								                      code_item.create_by = code.create_by
							 | 
						|
								                      code_item.update_time = code.update_time
							 | 
						|
								                      code_item.update_by = code.update_by
							 | 
						|
								                      await cls.add_std_code_services(request, query_db, code_item)  # 执行新增操作
							 | 
						|
								              # 提交事务
							 | 
						|
								              await query_db.commit()
							 | 
						|
								              return CrudResponseModel(is_success=True, message='标准代码和代码项修改成功')
							 | 
						|
								        except Exception as e:
							 | 
						|
								              await query_db.rollback()
							 | 
						|
								              raise ServiceException(message=f"修改标准代码失败: {str(e)}")        
							 | 
						|
								    @classmethod
							 | 
						|
								    async def check_code_unique_services(cls, query_db: AsyncSession, page_object: DataStdCodeModel):
							 | 
						|
								        """
							 | 
						|
								        校验字典类型称是否唯一service
							 | 
						|
								
							 | 
						|
								        :param query_db: orm对象
							 | 
						|
								        :param page_object: 字典类型对象
							 | 
						|
								        :return: 校验结果
							 | 
						|
								        """
							 | 
						|
								        id = -1 if page_object.id is None else page_object.id
							 | 
						|
								        codemodel=DataStdCodeModel()
							 | 
						|
								        codemodel.code_num=page_object.code_num
							 | 
						|
								        codemodel.class_id=page_object.class_id
							 | 
						|
								        codemodel.parent_id=page_object.parent_id
							 | 
						|
								        codemodel.code_type=page_object.code_type
							 | 
						|
								        dict_type = await DataStdDao.get_data_code_by_info(query_db, codemodel
							 | 
						|
								        )
							 | 
						|
								        if dict_type and dict_type.id != id:
							 | 
						|
								            return CommonConstant.NOT_UNIQUE
							 | 
						|
								        return CommonConstant.UNIQUE        
							 |