config_service.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. """热线 / 二维码配置读写"""
  2. import re
  3. from typing import Any, Dict, List, Optional
  4. from sqlalchemy.orm import Session
  5. from app.core.response import AppHTTPError
  6. from app.crud import config as config_crud
  7. from app.crud import oper_log as oper_log_crud
  8. _MULTI_SPLIT_RE = re.compile(r"[,,、;\n\r]+")
  9. def parse_multi(raw: Optional[str]) -> List[str]:
  10. """将存储串拆成去重后的列表(兼容逗号/顿号/分号/换行)。"""
  11. if not raw or not str(raw).strip():
  12. return []
  13. seen = set()
  14. out: List[str] = []
  15. for part in _MULTI_SPLIT_RE.split(str(raw)):
  16. item = part.strip()
  17. if not item or item in seen:
  18. continue
  19. seen.add(item)
  20. out.append(item)
  21. return out
  22. def join_multi(items: Optional[List[str]]) -> str:
  23. """规范化列表为逗号分隔存储串。"""
  24. if not items:
  25. return ""
  26. return ",".join(parse_multi(",".join(str(p) for p in items if p is not None)))
  27. # 兼容旧名称
  28. parse_phones = parse_multi
  29. join_phones = join_multi
  30. def get_hotline_payload(db: Session) -> Dict[str, Any]:
  31. row = config_crud.get_hotline(db)
  32. if not row:
  33. raise AppHTTPError(404, "热线配置不存在")
  34. phones = parse_multi(row.phone)
  35. emails = parse_multi(row.email)
  36. addresses = parse_multi(row.address)
  37. return {
  38. "id": row.id,
  39. "phone": phones[0] if phones else "",
  40. "phones": phones,
  41. "email": emails[0] if emails else "",
  42. "emails": emails,
  43. "address": addresses[0] if addresses else "",
  44. "addresses": addresses,
  45. "workTime": row.work_time or "",
  46. }
  47. def get_qrcode_payload(db: Session) -> Dict[str, Any]:
  48. row = config_crud.get_qrcode(db)
  49. if not row:
  50. raise AppHTTPError(404, "二维码配置不存在")
  51. return {
  52. "id": row.id,
  53. "landUrl": row.land_url or "",
  54. "title": row.title or "",
  55. "imageUrl": row.image_url or "",
  56. }
  57. def update_hotline(
  58. db: Session,
  59. user,
  60. *,
  61. phone: Optional[str] = None,
  62. phones: Optional[List[str]] = None,
  63. email: Optional[str] = None,
  64. emails: Optional[List[str]] = None,
  65. address: Optional[str] = None,
  66. addresses: Optional[List[str]] = None,
  67. work_time: Optional[str] = None,
  68. ) -> Dict[str, Any]:
  69. row = config_crud.get_hotline(db)
  70. if not row:
  71. raise AppHTTPError(404, "热线配置不存在")
  72. stored_phone = phone
  73. if phones is not None:
  74. stored_phone = join_multi(phones)
  75. elif phone is not None:
  76. stored_phone = join_multi(parse_multi(phone))
  77. stored_email = email
  78. if emails is not None:
  79. stored_email = join_multi(emails)
  80. elif email is not None:
  81. stored_email = join_multi(parse_multi(email))
  82. stored_address = address
  83. if addresses is not None:
  84. stored_address = join_multi(addresses)
  85. elif address is not None:
  86. stored_address = join_multi(parse_multi(address))
  87. config_crud.update_hotline(
  88. db,
  89. row,
  90. phone=stored_phone,
  91. email=stored_email,
  92. address=stored_address,
  93. work_time=work_time,
  94. update_by=user.username,
  95. )
  96. oper_log_crud.create_oper_log(
  97. db,
  98. module="hotline",
  99. action="update",
  100. user_id=user.id,
  101. username=user.username,
  102. detail="更新热线配置",
  103. )
  104. return get_hotline_payload(db)
  105. def update_qrcode(
  106. db: Session,
  107. user,
  108. *,
  109. land_url: Optional[str] = None,
  110. title: Optional[str] = None,
  111. image_url: Optional[str] = None,
  112. ) -> Dict[str, Any]:
  113. row = config_crud.get_qrcode(db)
  114. if not row:
  115. raise AppHTTPError(404, "二维码配置不存在")
  116. config_crud.update_qrcode(
  117. db,
  118. row,
  119. land_url=land_url,
  120. title=title,
  121. image_url=image_url,
  122. update_by=user.username,
  123. )
  124. oper_log_crud.create_oper_log(
  125. db,
  126. module="qrcode",
  127. action="update",
  128. user_id=user.id,
  129. username=user.username,
  130. detail="更新二维码配置",
  131. )
  132. return get_qrcode_payload(db)