feedback.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. """反馈 CRUD"""
  2. from datetime import datetime
  3. from typing import List, Optional, Tuple
  4. from sqlalchemy import or_
  5. from sqlalchemy.orm import Session
  6. from app.models.business import Feedback
  7. def next_biz_no(db: Session, prefix: str = "FK") -> str:
  8. """生成业务编号:前缀 + YYYYMMDD + 3 位日序号。"""
  9. date_part = datetime.now().strftime("%Y%m%d")
  10. head = f"{prefix}{date_part}"
  11. last = (
  12. db.query(Feedback)
  13. .filter(Feedback.biz_no.like(f"{head}%"))
  14. .order_by(Feedback.biz_no.desc())
  15. .first()
  16. )
  17. seq = 1
  18. if last and last.biz_no and len(last.biz_no) >= 3:
  19. try:
  20. seq = int(last.biz_no[-3:]) + 1
  21. except ValueError:
  22. seq = 1
  23. return f"{head}{seq:03d}"
  24. def create_feedback(
  25. db: Session,
  26. *,
  27. biz_no: str,
  28. fb_type: str,
  29. content: str,
  30. target_name: Optional[str] = None,
  31. target_dept: Optional[str] = None,
  32. target_post: Optional[str] = None,
  33. reporter_name: Optional[str] = None,
  34. reporter_unit: Optional[str] = None,
  35. reporter_post: Optional[str] = None,
  36. reporter_phone: Optional[str] = None,
  37. attachments: Optional[List[str]] = None,
  38. status: str = "待处理",
  39. ) -> Feedback:
  40. row = Feedback(
  41. biz_no=biz_no,
  42. fb_type=fb_type,
  43. content=content,
  44. target_name=target_name,
  45. target_dept=target_dept,
  46. target_post=target_post,
  47. reporter_name=reporter_name,
  48. reporter_unit=reporter_unit,
  49. reporter_post=reporter_post,
  50. reporter_phone=reporter_phone,
  51. attachments=list(attachments or []),
  52. status=status,
  53. del_flag="0",
  54. )
  55. db.add(row)
  56. db.commit()
  57. db.refresh(row)
  58. return row
  59. def get_feedback(db: Session, feedback_id: str) -> Optional[Feedback]:
  60. return (
  61. db.query(Feedback)
  62. .filter(Feedback.id == feedback_id, Feedback.del_flag == "0")
  63. .first()
  64. )
  65. def list_feedbacks(
  66. db: Session,
  67. *,
  68. status: Optional[str] = None,
  69. fb_type: Optional[str] = None,
  70. keyword: Optional[str] = None,
  71. page: int = 1,
  72. page_size: int = 10,
  73. ) -> Tuple[List[Feedback], int]:
  74. q = db.query(Feedback).filter(Feedback.del_flag == "0")
  75. if status:
  76. q = q.filter(Feedback.status == status)
  77. if fb_type:
  78. q = q.filter(Feedback.fb_type == fb_type)
  79. if keyword:
  80. like = f"%{keyword}%"
  81. q = q.filter(
  82. or_(
  83. Feedback.content.like(like),
  84. Feedback.biz_no.like(like),
  85. Feedback.target_name.like(like),
  86. Feedback.reporter_name.like(like),
  87. )
  88. )
  89. q = q.order_by(Feedback.create_time.desc())
  90. total = q.count()
  91. items = q.offset((page - 1) * page_size).limit(page_size).all()
  92. return items, total
  93. def update_feedback_status(
  94. db: Session,
  95. row: Feedback,
  96. *,
  97. status: str,
  98. handle_remark: Optional[str] = None,
  99. update_by: Optional[str] = None,
  100. ) -> Feedback:
  101. row.status = status
  102. if handle_remark is not None:
  103. row.handle_remark = handle_remark
  104. if update_by:
  105. row.update_by = update_by
  106. db.commit()
  107. db.refresh(row)
  108. return row