CloudServiceController.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : CloudServiceController.py
  4. @Time : 2022/12/8 10:23
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import json
  10. import time
  11. from django.views import View
  12. from Ansjer.config import LOGGER
  13. from Model.models import CouponCombo, CouponModel
  14. from Object.Enums.RedisKeyConstant import RedisKeyConstant
  15. from Object.RedisObject import RedisObject
  16. from Object.ResponseObject import ResponseObject
  17. from Object.TokenObject import TokenObject
  18. class CloudServiceController(View):
  19. def get(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.GET, request, operation)
  23. def post(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. operation = kwargs.get('operation')
  26. return self.validation(request.POST, request, operation)
  27. def validation(self, request_dict, request, operation):
  28. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  29. lang = request_dict.get('lang', token.lang)
  30. response = ResponseObject(lang)
  31. if token.code != 0:
  32. return response.json(token.code)
  33. user_id = token.userID
  34. if operation == 'save-photo':
  35. return self.get_combo_list_by_coupon(user_id, response)
  36. else:
  37. return response.json(404)
  38. @classmethod
  39. def get_combo_list_by_coupon(cls, request_dict, response):
  40. """
  41. 根据优惠券获取套餐列表
  42. @param request_dict: couponId 优惠券ID
  43. @param request_dict: couponType 优惠券类型
  44. @param response: 响应结果
  45. """
  46. coupon_id = int(request_dict.get('couponId', 0))
  47. coupon_type = int(request_dict.get('couponType', 0))
  48. if coupon_id == 0:
  49. return response.json(444)
  50. coupon_combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, coupon_id=coupon_id).values('combo_id')
  51. combo_list = []
  52. if not coupon_combo_qs.exists():
  53. return combo_list
  54. for item in coupon_combo_qs:
  55. combo_list.append(item['combo_id'])
  56. return combo_list
  57. @classmethod
  58. def get_user_coupon_list(cls, user_id):
  59. """
  60. 获取用户未使用优惠券配置ID列表
  61. @param user_id: 用户id
  62. @return: coupon_ids 列表,可能为空
  63. 如果没有未使用的优惠券,返回空列表 []
  64. """
  65. try:
  66. now_time = int(time.time())
  67. coupon_conf_ids = CouponModel.objects.filter(
  68. userID=user_id,
  69. use_status=0,
  70. distribute_time__lte=now_time,
  71. valid_time__gt=now_time
  72. ).values_list('coupon_config__id', flat=True) # 使用 values_list 获取 ID 列表
  73. return list(coupon_conf_ids) # 可能为空
  74. except Exception as e:
  75. LOGGER.error('获取用户优惠券异常:userID:{}, error_line:{}, error_msg:{}'
  76. .format(user_id, e.__traceback__.tb_lineno, repr(e)))
  77. return []
  78. @classmethod
  79. def get_combo_list(cls, coupon_type, coupon_id):
  80. """
  81. 根据优惠券类型与优惠券ID,获取关联套餐列表
  82. :param coupon_type: 优惠券类型
  83. :param coupon_id: 优惠券ID
  84. :return: 关联的套餐ID列表
  85. """
  86. try:
  87. redis_obj = RedisObject() # 创建 Redis 对象以访问缓存
  88. # 构建 Redis 缓存键
  89. conf_key = f'{RedisKeyConstant.BASIC_CLOUD_COUPON.value}{coupon_type}:{coupon_id}'
  90. # 尝试从 Redis 获取数据
  91. conf_data = redis_obj.get_data(conf_key)
  92. if conf_data: # 如果缓存中存在数据,则直接返回
  93. return json.loads(conf_data)
  94. # 从数据库中查询关联的套餐ID
  95. combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, coupon_id=coupon_id).values('combo_id')
  96. # 初始化套餐ID列表
  97. combo_list = []
  98. if combo_qs.exists(): # 检查查询集是否存在数据
  99. for item in combo_qs:
  100. combo_list.append(item['combo_id']) # 逐个添加套餐ID
  101. # 将查询结果存入 Redis 缓存
  102. redis_obj.set_data(conf_key, json.dumps(combo_list), expire=RedisKeyConstant.EXPIRE_TIME_24_HOURS)
  103. return combo_list # 返回套餐ID列表
  104. except Exception as e:
  105. # 记录异常信息和相关上下文
  106. LOGGER.error('获取优惠券套餐异常: couponID: {}, error_line: {}, error_msg: {}'
  107. .format(coupon_id, e.__traceback__.tb_lineno, repr(e)))
  108. return [] # 返回空列表以表示失败
  109. @classmethod
  110. def get_coupon_list(cls, coupon_type, combo_id):
  111. """
  112. 根据优惠券类型与套餐ID,获取关联优惠券列表
  113. @param coupon_type: 优惠券类型
  114. @param combo_id: 套餐id
  115. @return: coupon_list
  116. """
  117. coupon_combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, combo_id=combo_id) \
  118. .values('coupon_id')
  119. coupon_list = []
  120. if not coupon_combo_qs.exists():
  121. return coupon_list
  122. for item in coupon_combo_qs:
  123. coupon_list.append(item['coupon_id'])
  124. return coupon_list