log_service.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from sqlalchemy.orm import Session
  2. from sqlalchemy import desc, or_
  3. from typing import Optional, List, Dict, Any
  4. from datetime import datetime
  5. from app.models.operation_log import OperationLog
  6. from app.schemas.operation_log import ActionType
  7. class LogService:
  8. @staticmethod
  9. def create_log(
  10. db: Session,
  11. operator_id: int,
  12. action_type: ActionType,
  13. app_id: Optional[int] = None,
  14. target_user_id: Optional[int] = None,
  15. target_mobile: Optional[str] = None,
  16. ip_address: Optional[str] = None,
  17. details: Optional[Dict[str, Any]] = None
  18. ) -> OperationLog:
  19. log = OperationLog(
  20. app_id=app_id,
  21. operator_id=operator_id,
  22. action_type=action_type,
  23. target_user_id=target_user_id,
  24. target_mobile=target_mobile,
  25. ip_address=ip_address,
  26. details=details
  27. )
  28. db.add(log)
  29. db.commit()
  30. db.refresh(log)
  31. return log
  32. @staticmethod
  33. def get_logs(
  34. db: Session,
  35. skip: int = 0,
  36. limit: int = 20,
  37. app_id: Optional[int] = None,
  38. action_type: Optional[ActionType] = None,
  39. operator_id: Optional[int] = None,
  40. keyword: Optional[str] = None,
  41. start_date: Optional[datetime] = None,
  42. end_date: Optional[datetime] = None
  43. ):
  44. query = db.query(OperationLog)
  45. if app_id is not None:
  46. query = query.filter(OperationLog.app_id == app_id)
  47. if action_type:
  48. query = query.filter(OperationLog.action_type == action_type)
  49. if operator_id:
  50. query = query.filter(OperationLog.operator_id == operator_id)
  51. if keyword:
  52. # Search in target_mobile or operator mobile (need join for operator mobile)
  53. # For simplicity, let's search target_mobile first
  54. # If we want to search operator name/mobile, we'd join.
  55. # Let's assume keyword searches target_mobile for now.
  56. query = query.filter(OperationLog.target_mobile.ilike(f"%{keyword}%"))
  57. if start_date:
  58. query = query.filter(OperationLog.created_at >= start_date)
  59. if end_date:
  60. query = query.filter(OperationLog.created_at <= end_date)
  61. total = query.count()
  62. logs = query.order_by(desc(OperationLog.created_at)).offset(skip).limit(limit).all()
  63. return total, logs