Browse Source

update field

lang 4 years ago
parent
commit
863cb9ad47
4 changed files with 247 additions and 156 deletions
  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', CloudVod.deleteVodHls),
     path('cv/del', CloudStorage.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),
     url(r'^equipment/judge', EquipmentManager.judgeInterface),
 
 
     # ap模式,新增设备表
     # ap模式,新增设备表

+ 218 - 147
Controller/CloudStorage.py

@@ -30,13 +30,13 @@ from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from boto3.session import Session
 from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
+from django.db import transaction
 from django.views.generic.base import View
 from django.views.generic.base import View
 from pyfcm import FCMNotification
 from pyfcm import FCMNotification
-
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
 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
     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, \
 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.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -45,6 +45,7 @@ from Service.CommonService import CommonService
 from Object.m3u8generate import PlaylistGenerator
 from Object.m3u8generate import PlaylistGenerator
 from Object.WechatPayObject import WechatPayObject
 from Object.WechatPayObject import WechatPayObject
 from django.db.models import Q
 from django.db.models import Q
+from django.db.models import F
 
 
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
 
 
@@ -539,7 +540,7 @@ class CloudStorageView(View):
             .values('vodPrimaryUserID')
             .values('vodPrimaryUserID')
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(12)
             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():
         if not ubqs.exists():
             return response.json(10030)
             return response.json(10030)
         now_time = int(time.time())
         now_time = int(time.time())
@@ -735,11 +736,9 @@ class CloudStorageView(View):
         return response
         return response
 
 
     def do_pay_by_ali_callback(self, request):
     def do_pay_by_ali_callback(self, request):
-
         response = ResponseObject()
         response = ResponseObject()
         data = request.POST.dict()
         data = request.POST.dict()
-        logger = logging.getLogger('log')
-
+        # logger = logging.getLogger('log')
         try:
         try:
             passback_params = data["passback_params"]
             passback_params = data["passback_params"]
             parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
             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']
                 UID = order_list[0]['UID']
                 channel = order_list[0]['channel']
                 channel = order_list[0]['channel']
                 rank = order_list[0]['rank']
                 rank = order_list[0]['rank']
+
                 smqs = Store_Meal.objects.filter(id=rank). \
                 smqs = Store_Meal.objects.filter(id=rank). \
                     values("day", "bucket_id", "bucket__storeDay", "expire")
                     values("day", "bucket_id", "bucket__storeDay", "expire")
                 bucketId = smqs[0]['bucket_id']
                 bucketId = smqs[0]['bucket_id']
-
                 if not smqs.exists():
                 if not smqs.exists():
                     return response.json(173)
                     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']
                 expire = smqs[0]['expire']
-
                 if order_list[0]['isSelectDiscounts'] == 1:
                 if order_list[0]['isSelectDiscounts'] == 1:
                     expire = smqs[0]['expire'] * 2
                     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)
             return response.json(0, signature)
         except Exception as e:
         except Exception as e:
             if order_qs:
             if order_qs:
                 order_qs.update(status=10)
                 order_qs.update(status=10)
             red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             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)
             return HttpResponseRedirect(red_url)
 
 
     def do_pay_by_paypal_callback(self, request_dict, response):
     def do_pay_by_paypal_callback(self, request_dict, response):
@@ -822,7 +825,6 @@ class CloudStorageView(View):
         PayerID = request_dict.get('PayerID', None)
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
         orderID = request_dict.get('orderID', None)
         lang = request_dict.get('lang', None)
         lang = request_dict.get('lang', None)
-
         try:
         try:
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
 
 
@@ -856,45 +858,58 @@ class CloudStorageView(View):
             if not smqs.exists():
             if not smqs.exists():
                 return response.json(173)
                 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']
             expire = smqs[0]['expire']
+
             if order_list[0]['isSelectDiscounts'] == 1:
             if order_list[0]['isSelectDiscounts'] == 1:
                 expire = smqs[0]['expire'] * 2
                 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:
         except Exception as e:
             print(repr(e))
             print(repr(e))
             if order_qs:
             if order_qs:
                 order_qs.update(status=10)
                 order_qs.update(status=10)
-
             red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             if lang != 'cn':
             if lang != 'cn':
                 red_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
                 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):
     def do_pay_by_wechat_callback(self, request, response):
 
 
         logger = logging.getLogger('log')
         logger = logging.getLogger('log')
-
         try:
         try:
             pay = WechatPayObject()
             pay = WechatPayObject()
             data = pay.weixinpay_call_back(request.body)
             data = pay.weixinpay_call_back(request.body)
-
             attach = data["attach"]
             attach = data["attach"]
             parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
             parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
             lang = parmap["lang"]
             lang = parmap["lang"]
@@ -937,45 +950,53 @@ class CloudStorageView(View):
                 if not smqs.exists():
                 if not smqs.exists():
                     return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '套餐不存在'}))
                     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']
                 expire = smqs[0]['expire']
                 if order_list[0]['isSelectDiscounts'] == 1:
                 if order_list[0]['isSelectDiscounts'] == 1:
                     expire = smqs[0]['expire'] * 2
                     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:
             else:
                 order_qs.update(status=10)
                 order_qs.update(status=10)
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '参数格式校验错误'}))
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '参数格式校验错误'}))
-
         except Exception as e:
         except Exception as e:
             if order_qs:
             if order_qs:
                 order_qs.update(status=10)
                 order_qs.update(status=10)
-
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
 
 
     def do_create_pay_order(self, request_dict, userID, ip, response):
     def do_create_pay_order(self, request_dict, userID, ip, response):
@@ -1179,21 +1200,33 @@ class CloudStorageView(View):
             return response.json(173)
             return response.json(173)
         bucketId = smqs[0]['bucket_id']
         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']
         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,
         Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
                                    desc=smqs[0]['content'], payType=pay_type, payTime=nowTime,
                                    desc=smqs[0]['content'], payType=pay_type, payTime=nowTime,
                                    price=smqs[0]['price'], currency=smqs[0]['currency'], addTime=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:
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(12)
             return response.json(12)
         now_time = int(time.time())
         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)
             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):
     def switch_device_commodity(self, request_dict, userID, response):
@@ -1307,22 +1343,30 @@ class CloudStorageView(View):
             .values('vodPrimaryUserID')
             .values('vodPrimaryUserID')
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
         if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(12)
             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)
                 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(0)
         return response.json(444)
         return response.json(444)
 
 
@@ -1534,11 +1578,38 @@ def deleteVodHls(request):
     return response.json(0)
     return response.json(0)
 
 
 
 
-# 删除过期云存关联套餐
-def deleteExpiredUidBucket(request):
+# 更新过期云存关联套餐
+def updateExpiredUidBucket(request):
     response = ResponseObject()
     response = ResponseObject()
     now_time = int(time.time())
     now_time = int(time.time())
     expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
     expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
     id_list = expired_uid_bucket.values_list("id", flat=True)
     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)
     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 Object.TokenObject import TokenObject
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
 from Object.ResponseObject import ResponseObject
 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):
 class cloudTestView(View):
@@ -132,7 +132,9 @@ class cloudTestView(View):
 
 
             # 查询转入设备正在使用的套餐
             # 查询转入设备正在使用的套餐
             new_using_uid_bucket = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime)
             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)
                 return response.json(10014)
 
 
             with transaction.atomic():
             with transaction.atomic():
@@ -141,6 +143,7 @@ class cloudTestView(View):
                 # vod_uid_bucket表更新uid
                 # vod_uid_bucket表更新uid
                 old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
                 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)
                 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表关联数据
                 # 删除转出设备stscrd表关联数据
                 StsCrdModel.objects.filter(uid=old_uid).delete()
                 StsCrdModel.objects.filter(uid=old_uid).delete()
         except Exception as e:
         except Exception as e:
@@ -151,12 +154,10 @@ class cloudTestView(View):
 
 
     def expireMeal(self, request_dict, response):
     def expireMeal(self, request_dict, response):
         UID_Bucket_id = request_dict.get("UID_Bucket_id", None)
         UID_Bucket_id = request_dict.get("UID_Bucket_id", None)
-
         # 修改endTime让当前设备套餐过期
         # 修改endTime让当前设备套餐过期
         if UID_Bucket_id:
         if UID_Bucket_id:
-            nowTime = int(time.time())
             try:
             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:
             except Exception as e:
                 # print(e)
                 # print(e)
                 return response.json(500, repr(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='存储空间')
                                default=1, verbose_name='存储空间')
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')  # 0:事件型 1:连续型
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')  # 0:事件型 1:连续型
     commodity_code = models.CharField(default='', max_length=32, verbose_name='套餐规格码')
     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):
     def __str__(self):
         return self.id
         return self.id
@@ -640,10 +640,11 @@ class UID_Bucket(models.Model):
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, 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:关闭]')
     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)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updateTime = models.BigIntegerField(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:
     class Meta:
         db_table = 'vod_uid_bucket'
         db_table = 'vod_uid_bucket'
@@ -651,6 +652,23 @@ class UID_Bucket(models.Model):
         verbose_name_plural = verbose_name
         verbose_name_plural = verbose_name
         ordering = ('id',)
         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):
 class UID_Preview(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')