from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field, model_validator class StandardConditionInfoSchema(BaseModel): """使用规则因子""" rule_factor: str = Field(description="条件类型") rule_value: str = Field(description="条件值") rule_operator: Optional[str] = Field( default=None, description="操作符: LT(<)/LE(<=)/EQ(=)/NE(!=)/GE(>=)/GT(>)" ) rule_name: Optional[str] = Field(default=None, description="条件名称") class AssetShareSourceInfoSchema(BaseModel): """资产共享源信息""" share_mode: str = Field(description="共享模式") source_id_list: list[str] = Field(description="源ID列表") class ExpenseRuleCreateSchema(BaseModel): """创建费控使用规则请求 (alipay.ebpp.invoice.institution.expenserule.create)""" institution_id: str = Field(description="制度ID (必填)") standard_name: str = Field(max_length=20, description="费控规则名称 (必填)") standard_desc: Optional[str] = Field(default=None, description="规则描述") expense_type_sub_category: str = Field( description="费用类型子类 (必填): TAKE_AWAY(外卖)/REACH_SHOP(到店)/METRO(地铁)" ) standard_condition_info_list: list[StandardConditionInfoSchema] = Field( description="使用规则因子列表 (必填)" ) enterprise_id: Optional[str] = Field(default=None, description="企业码ID") account_id: Optional[str] = Field(default=None, description="企业共同账户ID (已废弃)") agreement_no: Optional[str] = Field(default=None, description="授权签约协议号 (已废弃)") outer_source_id: Optional[str] = Field(default=None, description="外部唯一标识(幂等)") open_rule_id: Optional[str] = Field(default=None, description="开票规则ID") payment_policy: Optional[str] = Field( default=None, description="支付策略: PERSONAL(全部个人账户)/COMBINATION(组合支付)" ) consume_mode: Optional[str] = Field( default=None, description="消费模式: COUPON_ONLY/COUPON_AND_CAP/DEFAULT" ) expense_cert_type: Optional[str] = Field(default=None, description="费用凭证类型") personal_qrcode_mode: Optional[int] = Field(default=None, description="个人二维码模式") asset_share_source_info: Optional[AssetShareSourceInfoSchema] = Field(default=None, description="资产共享源信息") class ExpenseRuleDeleteSchema(BaseModel): """删除费控使用规则请求""" institution_id: str = Field(description="制度ID") standard_id_list: list[str] = Field(description="使用规则ID列表") enterprise_id: str = Field(description="企业ID") class ExpenseRuleModifySchema(BaseModel): """编辑费控使用规则请求""" institution_id: str = Field(description="制度ID") standard_id: str = Field(description="使用规则ID") action: str = Field(description="操作类型") standard_name: Optional[str] = Field(default=None, description="规则名称") standard_desc: Optional[str] = Field(default=None, description="规则描述") expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类") standard_condition_info_list: Optional[list[StandardConditionInfoSchema]] = Field( default=None, description="使用规则因子列表" ) enterprise_id: Optional[str] = Field(default=None, description="企业ID") outer_source_id: Optional[str] = Field(default=None, description="外部唯一标识") open_rule_id: Optional[str] = Field(default=None, description="开票规则ID") payment_policy: Optional[str] = Field(default=None, description="支付策略") consume_mode: Optional[str] = Field(default=None, description="消费模式") expense_cert_type: Optional[str] = Field(default=None, description="凭证类型") class RuleCreateSchema(BaseModel): """创建使用规则请求""" institution_id: str = Field(description="制度ID") standard_name: str = Field(max_length=20, description="规则名称") standard_desc: Optional[str] = Field(default=None, description="规则描述") expense_type_sub_category: str = Field(description="费用类型子类") enterprise_id: Optional[str] = Field(default=None, description="企业ID") class RuleOperationOutSchema(BaseModel): """使用规则操作响应""" out_biz_no: str = Field(description="外部业务编号") rule_id: Optional[str] = Field(default=None, description="规则ID") result: Optional[str] = Field(default=None, description="操作结果") class RuleListOutSchema(BaseModel): """使用规则列表响应""" model_config = ConfigDict(from_attributes=True) id: int = Field(description="主键ID") out_biz_no: str = Field(description="外部业务编号") institution_id: str = Field(description="制度ID") rule_id: Optional[str] = Field(default=None, description="规则ID") standard_name: Optional[str] = Field(default=None, description="规则名称") expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类") status: Optional[str] = Field(default=None, description="状态") enterprise_id: Optional[str] = Field(default=None, description="企业ID") single_limit: Optional[float] = Field(default=None, description="单笔限额") max_day_amount: Optional[float] = Field(default=None, description="日限额") max_month_amount: Optional[float] = Field(default=None, description="月限额") max_quarter_amount: Optional[float] = Field(default=None, description="季限额") max_year_amount: Optional[float] = Field(default=None, description="年限额") condition_info: Optional[list] = Field(default=None, description="规则条件列表") created_time: Optional[datetime] = Field(default=None, description="创建时间") updated_time: Optional[datetime] = Field(default=None, description="更新时间") @model_validator(mode="after") def extract_period_limits(self): """从 condition_info 中提取日/月/季/年限额""" if not self.condition_info: return self for cond in self.condition_info: factor = cond.get("rule_factor") try: value = float(cond.get("rule_value", 0)) except (ValueError, TypeError): continue if factor == "QUOTA_DAY": self.max_day_amount = value elif factor == "QUOTA_MONTH": self.max_month_amount = value elif factor == "QUOTA_QUARTER": self.max_quarter_amount = value elif factor == "QUOTA_YEAR": self.max_year_amount = value return self class RuleOutSchema(BaseModel): """使用规则详情响应""" model_config = ConfigDict(from_attributes=True) out_biz_no: str = Field(description="外部业务编号") institution_id: str = Field(description="制度ID") rule_id: Optional[str] = Field(default=None, description="规则ID") standard_name: Optional[str] = Field(default=None, description="规则名称") standard_desc: Optional[str] = Field(default=None, description="规则描述") expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类") enterprise_id: Optional[str] = Field(default=None, description="企业ID") status: Optional[str] = Field(default=None, description="状态") class RuleUpdateSchema(BaseModel): """更新使用规则请求""" institution_id: Optional[str] = Field(default=None, description="制度ID") standard_name: Optional[str] = Field(default=None, description="规则名称") standard_desc: Optional[str] = Field(default=None, description="规则描述") expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类") status: Optional[str] = Field(default=None, description="状态") enterprise_id: Optional[str] = Field(default=None, description="企业ID")