linhaohong 8 сар өмнө
parent
commit
7ea1200b93

+ 37 - 6
Controller/CloudStorage.py

@@ -32,12 +32,13 @@ from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, UID_
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMsgModel, Unused_Uid_Meal, PromotionRuleModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMsgModel, Unused_Uid_Meal, PromotionRuleModel, \
     VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary, AiService, UidSetModel, UidPushModel, \
     VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary, AiService, UidSetModel, UidPushModel, \
     VodHlsTagType, ICloudStoreMeal, IcloudUseDetails, IcloudService, StsFrequency, DeviceApplePackage, \
     VodHlsTagType, ICloudStoreMeal, IcloudUseDetails, IcloudService, StsFrequency, DeviceApplePackage, \
-    InAppPurchasePackage
+    InAppPurchasePackage, CouponCombo, CouponConfigModel
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.AliPayObject import AliPayObject
 from Object.AliPayObject import AliPayObject
 from Object.AliSmsObject import AliSmsObject
 from Object.AliSmsObject import AliSmsObject
 from Object.ETkObject import ETkObject
 from Object.ETkObject import ETkObject
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -240,12 +241,14 @@ class CloudStorageView(View):
                 if CONFIG_INFO != CONFIG_CN:  # 国内生产环境不筛选像素 加载所有上架套餐
                 if CONFIG_INFO != CONFIG_CN:  # 国内生产环境不筛选像素 加载所有上架套餐
                     store_qs = store_qs.filter(Q(pixel_level=pixel_level))
                     store_qs = store_qs.filter(Q(pixel_level=pixel_level))
 
 
+                # 判断是否支持内购周期付款
                 if is_ios and version.parse(ios_version) >= version.parse("15.0"):
                 if is_ios and version.parse(ios_version) >= version.parse("15.0"):
                     store_qs = store_qs.filter(pay_type=5, app_type=app_type)
                     store_qs = store_qs.filter(pay_type=5, app_type=app_type)
                 elif is_ios and version.parse(ios_version) < version.parse("15.0"):
                 elif is_ios and version.parse(ios_version) < version.parse("15.0"):
                     store_qs = store_qs.filter(pay_type=5, commodity_type=0, app_type=app_type)
                     store_qs = store_qs.filter(pay_type=5, commodity_type=0, app_type=app_type)
                 else:
                 else:
                     store_qs = store_qs.exclude(pay_type=5)
                     store_qs = store_qs.exclude(pay_type=5)
+
                 if uid not in ["VXJ267WU5NZ1S89H111A", "18SM4J9DYWB2AEG1111A",
                 if uid not in ["VXJ267WU5NZ1S89H111A", "18SM4J9DYWB2AEG1111A",
                                "517J385BNUGP3CPP111A"] and CONFIG_INFO == CONFIG_TEST:
                                "517J385BNUGP3CPP111A"] and CONFIG_INFO == CONFIG_TEST:
                     store_qs = store_qs.exclude(id=88)
                     store_qs = store_qs.exclude(id=88)
@@ -261,8 +264,7 @@ class CloudStorageView(View):
                 store_qs = store_qs.filter(pay_type='10')  # 体验套餐不区分像素等级
                 store_qs = store_qs.filter(pay_type='10')  # 体验套餐不区分像素等级
 
 
             store_qs = store_qs.annotate(title=F('lang__title'), content=F('lang__content'),
             store_qs = store_qs.annotate(title=F('lang__title'), content=F('lang__content'),
-                                         new_title=F('lang__new_title'),
-                                         discount_content=F('lang__discount_content'))
+                                         new_title=F('lang__new_title'), discount_content=F('lang__discount_content'))
             store_qs = store_qs.order_by('sort').values("id", "title", "content", "price", "day", "currency",
             store_qs = store_qs.order_by('sort').values("id", "title", "content", "price", "day", "currency",
                                                         "bucket__storeDay", "new_title",
                                                         "bucket__storeDay", "new_title",
                                                         "bucket__bucket", "bucket__area", "commodity_code",
                                                         "bucket__bucket", "bucket__area", "commodity_code",
@@ -291,6 +293,17 @@ class CloudStorageView(View):
                                 item['content'] = item['new_title'].get('1', '')
                                 item['content'] = item['new_title'].get('1', '')
                             elif is_ai == 1:
                             elif is_ai == 1:
                                 item['content'] = item['new_title'].get('2', '')
                                 item['content'] = item['new_title'].get('2', '')
+                    if is_ios:
+                        if item['isCoupon']:
+                            item['isCoupon'] = False
+                        else:
+                            # 在列表删除这个套餐
+                            coupon_combo_ids = CouponCombo.objects.filter(combo_id=item['id']).values_list("coupon_id",
+                                                                                                           flat=True)
+                            coupon_config_qs = CouponConfigModel.objects.filter(id__in=coupon_combo_ids)
+                            if coupon_config_qs.exists():
+                                items_list.remove(item)
+
                 res_c = {'area': area, 'items': items_list}
                 res_c = {'area': area, 'items': items_list}
                 res.append(res_c)
                 res.append(res_c)
             # 是否促销
             # 是否促销
@@ -1513,7 +1526,7 @@ class CloudStorageView(View):
 
 
         now_time = int(time.time())
         now_time = int(time.time())
         store_qs = Store_Meal.objects.filter(id=rank, pay_type=pay_type, lang__lang=lang, is_show=0). \
         store_qs = Store_Meal.objects.filter(id=rank, pay_type=pay_type, lang__lang=lang, is_show=0). \
-            values('currency', 'price', 'lang__content', 'day', 'commodity_type', 'lang__title', 'expire',
+            values('id', 'currency', 'price', 'lang__content', 'day', 'commodity_type', 'lang__title', 'expire',
                    'commodity_code', 'discount_price', 'bucket__mold', 'cycle_config_id', 'is_ai')
                    'commodity_code', 'discount_price', 'bucket__mold', 'cycle_config_id', 'is_ai')
         if not store_qs.exists():
         if not store_qs.exists():
             return response.json(173)
             return response.json(173)
@@ -1745,14 +1758,32 @@ class CloudStorageView(View):
                     product_id = InAppPurchasePackage.objects.filter(id=package_id).values("product_id")[0][
                     product_id = InAppPurchasePackage.objects.filter(id=package_id).values("product_id")[0][
                         "product_id"]
                         "product_id"]
             else:
             else:
-                product_id = InAppPurchasePackage.objects.filter(rank_id=rank).values("product_id")[0]["product_id"]
+                in_app_purchase_qs = InAppPurchasePackage.objects.filter(rank_id=rank).values("product_id", "is_coupon")
+                product_id = in_app_purchase_qs[0]["product_id"]
+                is_coupon = in_app_purchase_qs[0]["is_coupon"]
+                # 判断是否为优惠订单锁优惠券
+                if is_coupon:
+                    coupon_combo_qs = CouponCombo.objects.filter(combo_id=store_qs[0]['id']).values("coupon_id")
+                    coupon_ids = CouponModel.objects.filter(userID=user_id, use_status=0,
+                                                            coupon_config__id=coupon_combo_qs[0]["coupon_id"],
+                                                            valid_time__gte=now_time).values_list("id", flat=True)
+                    redis_obj = RedisObject()
+                    for c_id in coupon_ids:
+                        key_coupon = f"{RedisKeyConstant.COUPON_ID_LOCK.value}{c_id}"
+                        coupon_lock = redis_obj.get_data(key_coupon)
+                        if not coupon_lock:
+                            redis_obj.set_data(key_coupon, 1, 600)
+                            coupon_id = c_id
+                            break
+                    else:
+                        return response.json(5)
 
 
             Order_Model.objects.create(
             Order_Model.objects.create(
                 orderID=order_id, UID=uid, channel=channel, userID_id=user_id, desc=content, payType=pay_type,
                 orderID=order_id, UID=uid, channel=channel, userID_id=user_id, desc=content, payType=pay_type,
                 payTime=now_time, price=price, currency=currency, addTime=now_time, updTime=now_time,
                 payTime=now_time, price=price, currency=currency, addTime=now_time, updTime=now_time,
                 isSelectDiscounts=is_select_discount, order_type=order_type, commodity_code=commodity_code,
                 isSelectDiscounts=is_select_discount, order_type=order_type, commodity_code=commodity_code,
                 commodity_type=commodity_type, rank_id=rank, ai_rank_id=1, store_meal_name=store_meal_name,
                 commodity_type=commodity_type, rank_id=rank, ai_rank_id=1, store_meal_name=store_meal_name,
-                app_type=app_type,
+                app_type=app_type, coupon_id=coupon_id
             )
             )
             return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
             return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
                                                   'result': {"orderID": order_id, "productId": product_id},
                                                   'result': {"orderID": order_id, "productId": product_id},

+ 13 - 3
Controller/InAppPurchaseController.py

@@ -27,10 +27,11 @@ from django.http import HttpResponse
 from Ansjer.config import LOGGER, CONFIG_INFO, CONFIG_TEST, PAY_TYPE_IN_APP_PURCHASE, BASE_DIR, CONFIG_US
 from Ansjer.config import LOGGER, CONFIG_INFO, CONFIG_TEST, PAY_TYPE_IN_APP_PURCHASE, BASE_DIR, CONFIG_US
 from Controller.CheckUserData import DataValid
 from Controller.CheckUserData import DataValid
 from Model.models import Order_Model, Store_Meal, Device_Info, UID_Bucket, Unused_Uid_Meal, AiService, Device_User, \
 from Model.models import Order_Model, Store_Meal, Device_Info, UID_Bucket, Unused_Uid_Meal, AiService, Device_User, \
-    SysMsgModel, DeviceApplePackage, InAppPurchasePackage, InAppRefund, OrderPayLog
+    SysMsgModel, DeviceApplePackage, InAppPurchasePackage, InAppRefund, OrderPayLog, CouponModel
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.AliSmsObject import AliSmsObject
 from Object.AliSmsObject import AliSmsObject
 from Object.AppleInAppPurchaseSubscriptionObject import InAppPurchase
 from Object.AppleInAppPurchaseSubscriptionObject import InAppPurchase
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 
 
@@ -114,10 +115,12 @@ class InAppPurchaseView(View):
                 return response.json(444, "app_type不存在")
                 return response.json(444, "app_type不存在")
 
 
             # 验证订单是否存在
             # 验证订单是否存在
-            order_qs = Order_Model.objects.filter(orderID=order_id, UID=uid, app_type=app_type).values("rank_id")
+            order_qs = Order_Model.objects.filter(orderID=order_id, UID=uid, app_type=app_type).values("rank_id",
+                                                                                                       "transaction_id",
+                                                                                                       "coupon_id")
             if not order_qs.exists():
             if not order_qs.exists():
                 return response.json(173)
                 return response.json(173)
-            if order_qs["transaction_id"]:
+            if order_qs[0]["transaction_id"]:
                 return response.json(0)
                 return response.json(0)
             if UID_Bucket.objects.filter(orderId=order_id).exists():
             if UID_Bucket.objects.filter(orderId=order_id).exists():
                 return response.json(0)
                 return response.json(0)
@@ -232,6 +235,13 @@ class InAppPurchaseView(View):
             now_time = int(time.time())
             now_time = int(time.time())
             uid_bucket_id = cls.enable_cloud(channel, now_time, order_id, store_qs, uid)
             uid_bucket_id = cls.enable_cloud(channel, now_time, order_id, store_qs, uid)
 
 
+            if order_qs[0]["coupon_id"]:
+                c_id = order_qs[0]["coupon_id"]
+                key_coupon = RedisKeyConstant.COUPON_ID_LOCK.value + c_id
+                redis_obj.del_data(key_coupon)
+                CouponModel.objects.filter(id=c_id).update(use_status=2, update_time=now_time)
+
+
             # 修改订阅状态
             # 修改订阅状态
             if payload.rawType == "Auto-Renewable Subscription":
             if payload.rawType == "Auto-Renewable Subscription":
                 original_transaction_id = payload.originalTransactionId
                 original_transaction_id = payload.originalTransactionId