transaction2.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # coding=utf-8
  2. import datetime
  3. import logging
  4. from typing import TYPE_CHECKING
  5. from apps.web.exceptions import PostPayOrderError
  6. if TYPE_CHECKING:
  7. from apps.web.user.models import RechargeRecord
  8. from apps.web.user.utils2 import OrderContext
  9. logger = logging.getLogger(__name__)
  10. class PostPay(object):
  11. def __init__(self, order): # type: (RechargeRecord)-> None
  12. self._order = order
  13. def do(self): # type:() -> None
  14. try:
  15. with PostPayOrderContextManager() as manager:
  16. context = manager.init_context(order=self._order) # type: OrderContext
  17. if not context.terminal:
  18. logger.warning('[PostPay] {} check failure. terminal is not exist.'.format(self._order))
  19. return
  20. if not context.terminal.owner:
  21. logger.warning('[PostPay] {} check failure. owner is not exist.'.format(self._order))
  22. return
  23. if self._order.ownerId != context.terminal.ownerId:
  24. logger.warning('[PostPay] {} check failure. ownerId of records != ownerId of group.'.format(self._order))
  25. return
  26. if not context.user:
  27. logger.warning('[PostPay] {} check failure. openid is null.'.format(self._order))
  28. return
  29. diff_ts = (datetime.datetime.now() - self._order.dateTimeAdded).total_seconds()
  30. logger.debug(
  31. '[PostPay] {} in ({}) via={} attachParas={} record={} diff={}'.format(
  32. repr(self._order.user), self._order.gateway, self._order.via, self._order.attachParas, self._order, diff_ts)
  33. )
  34. context.goods.attach_to(self._order, self._order.user)
  35. except PostPayOrderError as pe:
  36. # 此错误一定是attach_to 执行成功之前发送 此时用户尚未获取商品 所以可执行金额退还的操作
  37. logger.error('[PostPay] do, order = {}, error = {}'.format(self._order, pe))
  38. # TODO zjl 执行退款操作 并将订单设置为关闭状态
  39. return
  40. # 执行统一的后续流程
  41. self.deal_with_order()
  42. def deal_with_order(self):
  43. """
  44. TODO 处理订单的后续问题 订单总金额累加 发送金额通知等
  45. """
  46. def post_pay(order):
  47. logger.info('[post_pay] post pay order = {}'.format(order))
  48. PostPay(order).do()