# -*- coding: utf-8 -*- """ DWS 层公共辅助函数 从多个 DWS 子类中提取的纯函数,不依赖实例状态。 """ from __future__ import annotations from datetime import date, datetime from decimal import Decimal from typing import Any, Optional def mask_mobile(mobile: Optional[str]) -> Optional[str]: """手机号脱敏:138****1234 短于 7 位的号码原样返回,避免截断后信息丢失。 """ if not mobile or len(mobile) < 7: return mobile return mobile[:3] + "****" + mobile[-4:] def calc_days_since(stat_date: date, last_date: Optional[date]) -> Optional[int]: """计算距离目标日期的天数 若 last_date 为 datetime 则自动取 .date()。 """ if not last_date: return None if isinstance(last_date, datetime): last_date = last_date.date() return (stat_date - last_date).days def parse_id_list(value: Any) -> set[int]: """解析逗号分隔的 ID 列表字符串为 int 集合 支持 str / list / tuple / set 输入;非法值静默跳过。 """ if not value: return set() if isinstance(value, str): items = [v.strip() for v in value.split(",") if v.strip()] return {int(v) for v in items if v.isdigit()} if isinstance(value, (list, tuple, set)): result: set[int] = set() for item in value: if item is None: continue try: result.add(int(item)) except (ValueError, TypeError): continue return result return set() def safe_division( numerator: Any, denominator: Any, default: Decimal = Decimal("0"), ) -> Decimal: """安全除法,分母为零或 None 时返回默认值""" try: d = Decimal(str(denominator)) if d == 0: return default return Decimal(str(numerator)) / d except (ValueError, TypeError, ArithmeticError): return default