lang 4 lat temu
rodzic
commit
863cb9ad47
4 zmienionych plików z 247 dodań i 156 usunięć
  1. 2 1
      Ansjer/urls.py
  2. 218 147
      Controller/CloudStorage.py
  3. 6 5
      Controller/CloudTest.py
  4. 21 3
      Model/models.py

+ 2 - 1
Ansjer/urls.py

@@ -181,7 +181,8 @@ urlpatterns = [
     # 删除云存视频
     # path('cv/del', CloudVod.deleteVodHls),
     path('cv/del', CloudStorage.deleteVodHls),
-    path('cv/deleteExpiredUidBucket', CloudStorage.deleteExpiredUidBucket),
+    path('cv/updateExpiredUidBucket', CloudStorage.updateExpiredUidBucket),
+    path('cv/updateUnusedUidBucket', CloudStorage.updateUnusedUidBucket),
     url(r'^equipment/judge', EquipmentManager.judgeInterface),
 
     # ap模式,新增设备表

+ 218 - 147
Controller/CloudStorage.py

@@ -30,13 +30,13 @@ from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
+from django.db import transaction
 from django.views.generic.base import View
 from pyfcm import FCMNotification
-
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
     SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, JPUSH_CONFIG, FCM_CONFIG
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
-    ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel
+    ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, Unused_Uid_Meal
 from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -45,6 +45,7 @@ from Service.CommonService import CommonService
 from Object.m3u8generate import PlaylistGenerator
 from Object.WechatPayObject import WechatPayObject
 from django.db.models import Q
+from django.db.models import F
 
 from Service.ModelService import ModelService
 
@@ -539,7 +540,7 @@ class CloudStorageView(View):
             .values('vodPrimaryUserID')
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(12)
-        ubqs = UID_Bucket.objects.filter(channel=channel, uid=uid).order_by('addTime')
+        ubqs = UID_Bucket.objects.filter(channel=channel, uid=uid)
         if not ubqs.exists():
             return response.json(10030)
         now_time = int(time.time())
@@ -735,11 +736,9 @@ class CloudStorageView(View):
         return response
 
     def do_pay_by_ali_callback(self, request):
-
         response = ResponseObject()
         data = request.POST.dict()
-        logger = logging.getLogger('log')
-
+        # logger = logging.getLogger('log')
         try:
             passback_params = data["passback_params"]
             parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
@@ -765,56 +764,60 @@ class CloudStorageView(View):
                 UID = order_list[0]['UID']
                 channel = order_list[0]['channel']
                 rank = order_list[0]['rank']
+
                 smqs = Store_Meal.objects.filter(id=rank). \
                     values("day", "bucket_id", "bucket__storeDay", "expire")
                 bucketId = smqs[0]['bucket_id']
-
                 if not smqs.exists():
                     return response.json(173)
-                ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
-                           values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
+                ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
+                                                                 "endTime", "use_status")
                 expire = smqs[0]['expire']
-
                 if order_list[0]['isSelectDiscounts'] == 1:
                     expire = smqs[0]['expire'] * 2
-                if ubqs.exists():
-                    ubq = ubqs[0]
-                    endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
-
-                    ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
-                        (uid=UID, channel=channel, bucket_id=bucketId,
-                         endTime=endTime, updateTime=nowTime)
-                    logger.info('5')
-                    uid_bucket_id = ubq['id']
-                else:
-                    endTime = CommonService.calcMonthLater(expire)
-                    ub_cqs = UID_Bucket.objects.create \
-                        (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
-                         updateTime=nowTime)
-                    uid_bucket_id = ub_cqs.id
-
-                dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
-                if dvq.exists():
-                    dvq_set_update_dict = {
-                        'vodPrimaryUserID': userid,
-                        'vodPrimaryMaster': username
-                    }
-                    dvq.update(**dvq_set_update_dict)
-
-                order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
-                sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
-                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
-                red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
-                if lang != 'cn':
-                    red_url = "{SERVER_DOMAIN}web/paid2/en_success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
-                return HttpResponseRedirect(red_url)
+                with transaction.atomic():
+                    if ubqs.exists():
+                        ubq = ubqs[0]
+                        if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId:  #套餐使用中并且相同套餐叠加过期时间
+                            endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
+                            UID_Bucket.objects.filter(id=ubq['id']).update \
+                                (uid=UID, channel=channel, bucket_id=bucketId,
+                                 endTime=endTime, updateTime=nowTime)
+                        else:     #已过期或者不相同的套餐加入未使用的关联套餐表
+                            has_unused = Unused_Uid_Meal.objects.filter(uid=UID, bucket_id=bucketId).values("id")
+                            nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
+                            if has_unused.exists():
+                                Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
+                            else:
+                                Unused_Uid_Meal.objects.create(uid=UID,channel=channel,addTime=nowTime,num=nums,
+                                                               expire=smqs[0]['expire'],bucket_id=bucketId)
+                            UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
+                        uid_bucket_id = ubq['id']
+                    else:
+                        endTime = CommonService.calcMonthLater(expire)
+                        ub_cqs = UID_Bucket.objects.create \
+                            (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
+                             updateTime=nowTime,use_status=1)
+                        uid_bucket_id = ub_cqs.id
+
+                    dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
+                    if dvq.exists():
+                        dvq_set_update_dict = {
+                            'vodPrimaryUserID': userid,
+                            'vodPrimaryMaster': username
+                        }
+                        dvq.update(**dvq_set_update_dict)
+
+                    order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+                    sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
+                    self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
+                    red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
+                    return HttpResponseRedirect(red_url)
             return response.json(0, signature)
         except Exception as e:
             if order_qs:
                 order_qs.update(status=10)
             red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
-            if lang != 'cn':
-                red_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             return HttpResponseRedirect(red_url)
 
     def do_pay_by_paypal_callback(self, request_dict, response):
@@ -822,7 +825,6 @@ class CloudStorageView(View):
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
         lang = request_dict.get('lang', None)
-
         try:
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
 
@@ -856,45 +858,58 @@ class CloudStorageView(View):
             if not smqs.exists():
                 return response.json(173)
             # ##
-            ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
-                       values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
+            ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
+                                                             "endTime", "use_status")
             expire = smqs[0]['expire']
+
             if order_list[0]['isSelectDiscounts'] == 1:
                 expire = smqs[0]['expire'] * 2
-            if ubqs.exists():
-                ubq = ubqs[0]
-                endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
-                ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
-                    (uid=UID, channel=channel, bucket_id=bucketId,
-                     endTime=endTime, updateTime=nowTime)
-                uid_bucket_id = ubq['id']
-            else:
-                endTime = CommonService.calcMonthLater(expire)
-                ub_cqs = UID_Bucket.objects.create \
-                    (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
-                uid_bucket_id = ub_cqs.id
+            with transaction.atomic():
+                if ubqs.exists():
+                    ubq = ubqs[0]
+                    if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId:  #套餐使用中并且相同套餐叠加过期时间
+                        endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
+                        UID_Bucket.objects.filter(id=ubq['id']).update \
+                            (uid=UID, channel=channel, bucket_id=bucketId,
+                             endTime=endTime, updateTime=nowTime)
+                    else:     #已过期或者不相同的套餐加入未使用的关联套餐表
+                        has_unused = Unused_Uid_Meal.objects.filter(uid=UID, bucket_id=bucketId).values("id")
+                        nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
+                        if has_unused.exists():
+                            Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
+                        else:
+                            Unused_Uid_Meal.objects.create(uid=UID,channel=channel,addTime=nowTime,num=nums,
+                                                           expire=smqs[0]['expire'],bucket_id=bucketId)
+                        UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
+                    uid_bucket_id = ubq['id']
+                else:
+                    endTime = CommonService.calcMonthLater(expire)
+                    ub_cqs = UID_Bucket.objects.create \
+                        (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
+                         updateTime=nowTime,use_status=1)
+                    uid_bucket_id = ub_cqs.id
 
-            dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
-            if dvq.exists():
-                dvq_set_update_dict = {
-                    'vodPrimaryUserID': userid,
-                    'vodPrimaryMaster': username
-                }
-                dvq.update(**dvq_set_update_dict)
-            order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
-            sys_msg_text_list = ['成功购买云存','Successful purchase of cloud storage']
-            self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
-
-            # return response.json(0)
-            red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
-            if lang != 'cn':
-                red_url = "{SERVER_DOMAIN}web/paid2/en_success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
-            return HttpResponseRedirect(red_url)
+                dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
+                if dvq.exists():
+                    dvq_set_update_dict = {
+                        'vodPrimaryUserID': userid,
+                        'vodPrimaryMaster': username
+                    }
+                    dvq.update(**dvq_set_update_dict)
+                order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+                sys_msg_text_list = ['成功购买云存','Successful purchase of cloud storage']
+                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
+
+                # return response.json(0)
+                red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
+                if lang != 'cn':
+                    red_url = "{SERVER_DOMAIN}web/paid2/en_success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
+
+                return HttpResponseRedirect(red_url)
         except Exception as e:
             print(repr(e))
             if order_qs:
                 order_qs.update(status=10)
-
             red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             if lang != 'cn':
                 red_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
@@ -903,11 +918,9 @@ class CloudStorageView(View):
     def do_pay_by_wechat_callback(self, request, response):
 
         logger = logging.getLogger('log')
-
         try:
             pay = WechatPayObject()
             data = pay.weixinpay_call_back(request.body)
-
             attach = data["attach"]
             parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
             lang = parmap["lang"]
@@ -937,45 +950,53 @@ class CloudStorageView(View):
                 if not smqs.exists():
                     return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '套餐不存在'}))
                 # ##
-                ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
-                           values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
+                ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay",
+                                                                 "bucket__region", "endTime", "use_status")
                 expire = smqs[0]['expire']
                 if order_list[0]['isSelectDiscounts'] == 1:
                     expire = smqs[0]['expire'] * 2
-                if ubqs.exists():
-                    ubq = ubqs[0]
-                    endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
-                    ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
-                        (uid=UID, channel=channel, bucket_id=bucketId,
-                         endTime=endTime, updateTime=nowTime)
-                    uid_bucket_id = ubq['id']
-                else:
-                    endTime = CommonService.calcMonthLater(expire)
-                    ub_cqs = UID_Bucket.objects.create \
-                        (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
-                         updateTime=nowTime)
-                    uid_bucket_id = ub_cqs.id
-
-                dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
-                if dvq.exists():
-                    dvq_set_update_dict = {
-                        'vodPrimaryUserID': userid,
-                        'vodPrimaryMaster': username
-                    }
-                    dvq.update(**dvq_set_update_dict)
-                order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
-                sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
-                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
-                return HttpResponse(pay.xml_to_dict({'return_code': 'SUCCESS', 'return_msg': 'OK'}))
-
+                with transaction.atomic():
+                    if ubqs.exists():
+                        ubq = ubqs[0]
+                        if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId:  #套餐使用中并且相同套餐叠加过期时间
+                            endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
+                            UID_Bucket.objects.filter(id=ubq['id']).update \
+                                (uid=UID, channel=channel, bucket_id=bucketId,
+                                 endTime=endTime, updateTime=nowTime)
+                        else:     #已过期或者不相同的套餐加入未使用的关联套餐表
+                            has_unused = Unused_Uid_Meal.objects.filter(uid=UID, bucket_id=bucketId).values("id")
+                            nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
+                            if has_unused.exists():
+                                Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
+                            else:
+                                Unused_Uid_Meal.objects.create(uid=UID,channel=channel,addTime=nowTime,num=nums,
+                                                               expire=smqs[0]['expire'],bucket_id=bucketId)
+                            UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
+                        uid_bucket_id = ubq['id']
+                    else:
+                        endTime = CommonService.calcMonthLater(expire)
+                        ub_cqs = UID_Bucket.objects.create \
+                            (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
+                             updateTime=nowTime,use_status=1)
+                        uid_bucket_id = ub_cqs.id
+
+                    dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
+                    if dvq.exists():
+                        dvq_set_update_dict = {
+                            'vodPrimaryUserID': userid,
+                            'vodPrimaryMaster': username
+                        }
+                        dvq.update(**dvq_set_update_dict)
+                    order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+                    sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
+                    self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
+                    return HttpResponse(pay.xml_to_dict({'return_code': 'SUCCESS', 'return_msg': 'OK'}))
             else:
                 order_qs.update(status=10)
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '参数格式校验错误'}))
-
         except Exception as e:
             if order_qs:
                 order_qs.update(status=10)
-
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
 
     def do_create_pay_order(self, request_dict, userID, ip, response):
@@ -1179,21 +1200,33 @@ class CloudStorageView(View):
             return response.json(173)
         bucketId = smqs[0]['bucket_id']
         # ##
-        ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=uid, channel=channel, endTime__gte=nowTime). \
-                   values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
+        ubqs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
+                                                         "endTime", "use_status")
         expire = smqs[0]['expire']
-        if ubqs.exists():
-            ubq = ubqs[0]
-            endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
-            ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
-                (uid=uid, channel=channel, bucket_id=bucketId,
-                 endTime=endTime, updateTime=nowTime)
-            uid_bucket_id = ubq['id']
-        else:
-            endTime = CommonService.calcMonthLater(expire)
-            ub_cqs = UID_Bucket.objects.create \
-                (uid=uid, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
-            uid_bucket_id = ub_cqs.id
+        with transaction.atomic():
+            if ubqs.exists():
+                ubq = ubqs[0]
+                if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId:  #套餐使用中并且相同套餐叠加过期时间
+                    endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
+                    UID_Bucket.objects.filter(id=ubq['id']).update \
+                        (uid=uid, channel=channel, bucket_id=bucketId,
+                         endTime=endTime, updateTime=nowTime)
+                else:     #已过期或者不相同的套餐加入未使用的关联套餐表
+                    has_unused = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucketId).values("id")
+                    nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
+                    if has_unused.exists():
+                        Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
+                    else:
+                        Unused_Uid_Meal.objects.create(uid=uid,channel=channel,addTime=nowTime,num=nums,
+                                                       expire=smqs[0]['expire'],bucket_id=bucketId)
+                    UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
+                uid_bucket_id = ubq['id']
+            else:
+                endTime = CommonService.calcMonthLater(expire)
+                ub_cqs = UID_Bucket.objects.create \
+                    (uid=uid, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
+                     updateTime=nowTime,use_status=1)
+                uid_bucket_id = ub_cqs.id
         Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
                                    desc=smqs[0]['content'], payType=pay_type, payTime=nowTime,
                                    price=smqs[0]['price'], currency=smqs[0]['currency'], addTime=nowTime,
@@ -1289,16 +1322,19 @@ class CloudStorageView(View):
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(12)
         now_time = int(time.time())
-        uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time).values("id", "uid", "endTime",
-                                                                                      "bucket__content").order_by(
-            'addTime')
-        if not uid_bucket.exists():
+        uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time).values("id", "uid","bucket__content",
+                                                                            "use_status","endTime","has_unused")
+        if not uid_bucket:
             return response.json(10030)
-        for index, value in enumerate(uid_bucket):
-            value['is_use'] = 0
-            if index == 0:
-                value['is_use'] = 1
-        return response.json(0, list(uid_bucket))
+        commodity_dict = {}
+        if uid_bucket[0]['has_unused'] == 1:
+            unused = Unused_Uid_Meal.objects.filter(uid=uid).annotate(unused_id=F('id'))\
+                                            .values("unused_id","uid","bucket__content","num")
+            commodity_dict['using'] = list(uid_bucket)
+            commodity_dict['unused'] = list(unused)
+        else:
+            commodity_dict['using'] = [uid_bucket]
+        return response.json(0, commodity_dict)
 
     # 提前使用设备关联套餐
     def switch_device_commodity(self, request_dict, userID, response):
@@ -1307,22 +1343,30 @@ class CloudStorageView(View):
             .values('vodPrimaryUserID')
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(12)
-        switch_commodity_id = request_dict.get('switch_commodity_id', None)
-        if switch_commodity_id:
+        unused_id = request_dict.get('switch_commodity_id', None)
+        if unused_id:
             # 切换设备套餐关联
-            using_uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=int(time.time())).values("id", "uid",
-                                                                                                        "endTime","bucket__content","addTime").order_by('addTime')
-            if not using_uid_bucket.exists():
+            using_uid_bucket = UID_Bucket.objects.filter(uid=uid,has_unused=1).values("id", "uid", "endTime",
+                                                                 "bucket__content","addTime")
+            unuseds = Unused_Uid_Meal.objects.filter(id=unused_id).values("id","uid","channel","addTime","expire",
+                                                                         "num","bucket_id","userID_id")
+            if not unuseds.exists() or not using_uid_bucket.exists():
                 return response.json(10030)
-            useing_uid_bucket_id = using_uid_bucket[0]['id']
-            useing_uid_bucket_addTime = using_uid_bucket[0]['addTime']
-            if int(useing_uid_bucket_id) == int(switch_commodity_id):
-                return response.json(10032)
-
-            UID_Bucket.objects.filter(id=switch_commodity_id).update(addTime=useing_uid_bucket_addTime)#更新转移的云存套餐为使用中
-            UID_Bucket.objects.filter(id=useing_uid_bucket_id).delete()  # 删除原来使用中的云存套餐
-            VodHlsModel.objects.filter(uid=uid).delete()  # 删除播放列表
-            StsCrdModel.objects.filter(uid=uid).delete()  # 删除sts记录
+            unused = unuseds[0]
+            nowTime = int(time.time())
+            try:
+                with transaction.atomic():
+                    count_unused = Unused_Uid_Meal.objects.filter(uid=uid).count()
+                    has_unused = 1 if count_unused>1 else 0
+                    endTime = CommonService.calcMonthLater(unused['expire'] * unused['num'])
+                    UID_Bucket.objects.filter(uid=uid).update(channel=unused['channel'],endTime=endTime,bucket_id=unused['bucket_id']
+                                                              ,updateTime=nowTime,use_status=1,userID_id=unused['userID_id'],
+                                                              has_unused=has_unused)
+                    Unused_Uid_Meal.objects.filter(id=unused_id).delete()
+                    StsCrdModel.objects.filter(uid=uid).delete()  # 删除sts记录
+                    VodHlsModel.objects.filter(uid=uid).delete()  # 删除播放列表,后期数据量多时应该考虑延后删除
+            except Exception:
+                return response.json(474)
             return response.json(0)
         return response.json(444)
 
@@ -1534,11 +1578,38 @@ def deleteVodHls(request):
     return response.json(0)
 
 
-# 删除过期云存关联套餐
-def deleteExpiredUidBucket(request):
+# 更新过期云存关联套餐
+def updateExpiredUidBucket(request):
     response = ResponseObject()
     now_time = int(time.time())
     expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
     id_list = expired_uid_bucket.values_list("id", flat=True)
-    UID_Bucket.objects.filter(id__in=list(id_list)).delete()  # 删除过期云存关联套餐, 后续是否考虑用软删除
+    UID_Bucket.objects.filter(id__in=list(id_list)).update(use_status=2)  # 更新过期云存关联套餐状态
+    return response.json(0)
+
+# 如果云存关联套餐过期,更新未使用的关联套餐
+def updateUnusedUidBucket(request):
+    response = ResponseObject()
+    now_time = int(time.time())
+    expired_uid_buckets = UID_Bucket.objects.filter(endTime__lte=now_time,has_unused=1).values("id","uid")[0:1000]
+    for expired_uid_bucket in expired_uid_buckets:
+        unuseds = Unused_Uid_Meal.objects.filter(uid=expired_uid_bucket['uid']).values("id","uid","channel","addTime","expire",
+                                                                  "num","bucket_id","userID_id").order_by('addTime')[0:1]
+        if not unuseds.exists():
+            continue
+        unused = unuseds[0]
+        try:
+            with transaction.atomic():
+                count_unused = Unused_Uid_Meal.objects.filter(uid=expired_uid_bucket['uid']).count()
+                has_unused = 1 if count_unused>1 else 0
+                endTime = CommonService.calcMonthLater(unused['expire'] * unused['num'])
+                UID_Bucket.objects.filter(uid=expired_uid_bucket['uid']).update(channel=unused['channel'],endTime=endTime,bucket_id=unused['bucket_id']
+                                                          ,updateTime=now_time,use_status=1,userID_id=unused['userID_id'],
+                                                          has_unused=has_unused)
+                Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
+                StsCrdModel.objects.filter(uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
+                VodHlsModel.objects.filter(uid=expired_uid_bucket['uid']).delete()  # 删除播放列表,后期数据量多时应该考虑延后删除
+        except Exception:
+            continue
+    # UID_Bucket.objects.filter(id__in=list(id_list)).update(use_status=2)  # 更新过期云存关联套餐状态
     return response.json(0)

+ 6 - 5
Controller/CloudTest.py

@@ -12,7 +12,7 @@ from django.views.generic.base import View
 from Object.TokenObject import TokenObject
 from Service.ModelService import ModelService
 from Object.ResponseObject import ResponseObject
-from Model.models import Device_User, Device_Info, Order_Model, UID_Bucket, StsCrdModel, VodHlsModel
+from Model.models import Device_User, Device_Info, Order_Model, UID_Bucket, StsCrdModel, VodHlsModel, Unused_Uid_Meal
 
 
 class cloudTestView(View):
@@ -132,7 +132,9 @@ class cloudTestView(View):
 
             # 查询转入设备正在使用的套餐
             new_using_uid_bucket = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime)
-            if new_using_uid_bucket.exists():
+            new_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=new_uid)
+            new_unused_id_list = new_unused_uid_bucket.values_list("id", flat=True)
+            if new_using_uid_bucket.exists() or new_unused_uid_bucket.exists():
                 return response.json(10014)
 
             with transaction.atomic():
@@ -141,6 +143,7 @@ class cloudTestView(View):
                 # vod_uid_bucket表更新uid
                 old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
                 UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(uid=new_uid)
+                Unused_Uid_Meal.objects.filter(id__in=list(new_unused_id_list)).update(uid=new_uid)  # 更新过期云存关联套餐状态
                 # 删除转出设备stscrd表关联数据
                 StsCrdModel.objects.filter(uid=old_uid).delete()
         except Exception as e:
@@ -151,12 +154,10 @@ class cloudTestView(View):
 
     def expireMeal(self, request_dict, response):
         UID_Bucket_id = request_dict.get("UID_Bucket_id", None)
-
         # 修改endTime让当前设备套餐过期
         if UID_Bucket_id:
-            nowTime = int(time.time())
             try:
-                UID_Bucket.objects.filter(id=UID_Bucket_id).update(endTime=nowTime-1)
+                UID_Bucket.objects.filter(id=UID_Bucket_id).update(use_status=2)
             except Exception as e:
                 # print(e)
                 return response.json(500, repr(e))

+ 21 - 3
Model/models.py

@@ -435,7 +435,7 @@ class Store_Meal(models.Model):
                                default=1, verbose_name='存储空间')
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')  # 0:事件型 1:连续型
     commodity_code = models.CharField(default='', max_length=32, verbose_name='套餐规格码')
-    lang = models.CharField(default='', max_length=20, verbose_name='语言/国家')
+    # lang = models.CharField(default='', max_length=20, verbose_name='语言/国家')
 
     def __str__(self):
         return self.id
@@ -640,10 +640,11 @@ class UID_Bucket(models.Model):
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
     status = models.SmallIntegerField(default=0, verbose_name='状态[0:开启,1:关闭]')
-    endTime = models.BigIntegerField(verbose_name='套餐结束时间', default=0)
+    endTime = models.BigIntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updateTime = models.BigIntegerField(verbose_name='更新时间', default=0)
-    # is_use = models.IntegerField(verbose_name='是否使用中[0:未使用,1:使用中,2已过期]', default=0)
+    use_status = models.IntegerField(verbose_name='使用状态[1:使用中,2已过期]', default=0)
+    has_unused = models.SmallIntegerField(default=0, verbose_name='是否拥有其它未使用的套餐[0:否,1:是]')
 
     class Meta:
         db_table = 'vod_uid_bucket'
@@ -651,6 +652,23 @@ class UID_Bucket(models.Model):
         verbose_name_plural = verbose_name
         ordering = ('id',)
 
+class Unused_Uid_Meal(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    uid = models.CharField(max_length=20, verbose_name='设备UID')
+    channel = models.SmallIntegerField(default=0, verbose_name='通道')
+    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
+    addTime = models.IntegerField(verbose_name='添加时间', default=0)
+    expire = models.IntegerField(verbose_name='存储桶存储时长[月份]', default=0)
+    num = models.IntegerField(verbose_name='个数', default=0)
+    # effect_time = models.BigIntegerField(verbose_name='生效时间', db_index=True, default=0)
+    # uid_bucket = models.ForeignKey(UID_Bucket, blank=True, to_field='id', on_delete=models.CASCADE, default=0,
+    #                            verbose_name='uid_bucket关联')
+    class Meta:
+        db_table = 'unused_uid_Meal'
+        verbose_name = '未使用的设备关联套餐表'
+        verbose_name_plural = verbose_name
+        ordering = ('id',)
+
 
 class UID_Preview(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')