wechat_notice.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. """服务号绑定及事务内通知 outbox;不复用小程序 OpenID。"""
  2. from datetime import datetime
  3. from sqlalchemy import Column, String, DateTime, Integer, SmallInteger, Text, UniqueConstraint, Index
  4. from app.core.database import Base
  5. class NoticePublicFields:
  6. tenant_no = Column(String(64), nullable=False)
  7. order_num = Column(Integer, nullable=True)
  8. remark = Column(String(512), nullable=True)
  9. create_by = Column(String(64), nullable=True)
  10. create_dept_id = Column(String(64), nullable=False, default="")
  11. create_time = Column(DateTime, nullable=False, default=datetime.now)
  12. update_by = Column(String(64), nullable=True)
  13. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
  14. del_flag = Column(SmallInteger, nullable=False, default=0)
  15. class WechatBinding(NoticePublicFields, Base):
  16. __tablename__ = "sys_wechat_oa_binding"
  17. id = Column(String(64), primary_key=True)
  18. user_id = Column(String(64), nullable=False)
  19. appid = Column(String(64), nullable=False)
  20. openid = Column(String(64), nullable=True)
  21. subscribed = Column(SmallInteger, nullable=False, default=0)
  22. __table_args__ = (
  23. UniqueConstraint("tenant_no", "appid", "user_id", name="uk_oa_binding_user"),
  24. UniqueConstraint("tenant_no", "appid", "openid", name="uk_oa_binding_openid"),
  25. )
  26. class WechatApprovalCycle(NoticePublicFields, Base):
  27. __tablename__ = "sys_wechat_approval_cycle"
  28. id = Column(String(64), primary_key=True)
  29. business_type = Column(String(32), nullable=False)
  30. business_id = Column(String(64), nullable=False)
  31. cycle_id = Column(String(64), nullable=False)
  32. submitted_at = Column(DateTime, nullable=False)
  33. # 当前任务集合及分配版本。转交 A→B→A 仍产生一次新的待办。
  34. assignments = Column(Text, nullable=False, default="{}")
  35. __table_args__ = (UniqueConstraint("tenant_no", "business_type", "business_id", name="uk_oa_cycle_business"),)
  36. class WechatNotice(NoticePublicFields, Base):
  37. __tablename__ = "sys_wechat_notice"
  38. id = Column(String(64), primary_key=True)
  39. appid = Column(String(64), nullable=False)
  40. business_type = Column(String(32), nullable=False)
  41. business_id = Column(String(64), nullable=False)
  42. cycle_id = Column(String(64), nullable=False)
  43. event_key = Column(String(64), nullable=False, unique=True)
  44. kind = Column(String(16), nullable=False)
  45. task_key = Column(String(256), nullable=False, default="")
  46. recipient_id = Column(String(64), nullable=False)
  47. result = Column(String(16), nullable=True)
  48. template_id = Column(String(128), nullable=False)
  49. payload = Column(Text, nullable=False)
  50. page = Column(String(1024), nullable=False, default="")
  51. status = Column(String(16), nullable=False, default="pending")
  52. attempts = Column(Integer, nullable=False, default=0)
  53. next_attempt_at = Column(DateTime, nullable=False, default=datetime.now)
  54. claimed_at = Column(DateTime, nullable=True)
  55. sent_at = Column(DateTime, nullable=True)
  56. message_id = Column(String(128), nullable=True)
  57. last_error = Column(String(256), nullable=True)
  58. __table_args__ = (Index("idx_oa_notice_due", "status", "next_attempt_at"),)