Эх сурвалжийг харах

后台设备云存套餐转移接口

linhaohong 1 жил өмнө
parent
commit
c6b7e33aa2

+ 158 - 85
AdminController/ServeManagementController.py

@@ -1525,92 +1525,165 @@ class serveManagement(View):
             return response.json(0, '重置云存体验失败')
             return response.json(0, '重置云存体验失败')
 
 
     def meal_transfer(self, request, request_dict, response):
     def meal_transfer(self, request, request_dict, response):
-        # 云存套餐转移,同一用户下不同设备间的云存套餐转移
-        old_uid = request_dict.get("old_uid", None)
-        new_uid = request_dict.get("new_uid", None)
+        orderID = request_dict.get("orderID")
+        old_uid = request_dict.get("old_uid")
+        new_uid = request_dict.get("new_uid")
         nowTime = int(time.time())
         nowTime = int(time.time())
 
 
-        # 查询转出设备正在使用的套餐
-        old_using_uid_bucket = UID_Bucket.objects.filter(uid=old_uid, endTime__gte=nowTime).values('id',
-                                                                                                       'bucket_id',
-                                                                                                       'has_unused',
-                                                                                                       'bucket__content').order_by('addTime')
-        if not old_using_uid_bucket.exists():
-            return response.json(10013)
-        bucket_content = old_using_uid_bucket[0]['bucket__content']
-
-        # 免费存储桶不可转移
-        old_vod_bucket_id = old_using_uid_bucket[0]['bucket_id']
-        is_free = VodBucketModel.objects.get(id=old_vod_bucket_id).is_free
-        if is_free == 1:
-            return response.json(10012)
-
-        # 查询转入设备是否存在正在使用的套餐和未使用的套餐
-        new_using_uid_bucket = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime)
-        new_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=new_uid)
-        if new_using_uid_bucket.exists() or new_unused_uid_bucket.exists():
-            return response.json(10014)
-
-        old_ai_service = AiService.objects.filter(uid=old_uid, endTime__gte=nowTime, use_status=1).values('id',
-                                                                                                          'detect_interval',
-                                                                                                          'detect_status',
-                                                                                                          'detect_group')
-        new_ai_service = AiService.objects.filter(uid=new_uid, endTime__gte=nowTime, use_status=1)
-        if new_ai_service.exists():  # 转入设备有开通AI功能,不能转
-            return response.json(10014)
-
-        new_uid_set = UidSetModel.objects.filter(uid=new_uid).values('is_ai')
-        if old_ai_service.exists() and new_uid_set[0]['is_ai'] == 2:  # 转出设备有开通AI,但是转入设备不支持AI,不能转
-            return response.json(10016)
-
-        with transaction.atomic():
-            # 如果转出设备有未使用套餐,更改第一个未使用套餐为正在使用
-            if old_using_uid_bucket[0]['has_unused'] == 1:
-                old_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=old_uid).values('id', 'channel',
-                                                                                           'bucket_id',
-                                                                                           'addTime', 'expire',
-                                                                                           'is_ai',
-                                                                                           'order_id')
-                count = old_unused_uid_bucket.count()
-                unused = old_unused_uid_bucket[0]
-                has_unused = 1 if count > 1 else 0  # 如果存在不止一个未使用套餐,has_unused=1
-                endTime = CommonService.calcMonthLater(unused['expire'])
-                data_dict = {
-                    'uid': old_uid,
-                    'channel': unused['channel'],
-                    'bucket_id': unused['bucket_id'],
-                    'addTime': unused['addTime'],
-                    'endTime': endTime,
-                    'updateTime': nowTime,
-                    'status': 1,
-                    'use_status': 1,
-                    'has_unused': has_unused
-                }
-                UID_Bucket.objects.create(**data_dict)  # 正在使用套餐表添加数据
-                Unused_Uid_Meal.objects.filter(uid=old_uid).first().delete()  # 删除未使用套餐表中的数据
-                if unused['is_ai']:  # 开通AI服务
-                    AiService.objects.create(uid=old_uid, channel=unused['channel'],
-                                             detect_status=old_ai_service[0]['detect_status'],
-                                             addTime=nowTime, updTime=nowTime, endTime=endTime, use_status=1,
-                                             orders_id=unused['order_id'],
-                                             detect_group=old_ai_service[0]['detect_group'],
-                                             detect_interval=old_ai_service[0]['detect_interval'])
-
-        # 更新正在使用套餐的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, has_unused=0)
-        StsCrdModel.objects.filter(uid=old_uid).delete()  # 删除转出设备stscrd表关联数据
-
-        # 转移AI服务
-        if old_ai_service.exists() and new_uid_set[0]['is_ai'] != 2:
-            AiService.objects.filter(id=old_ai_service[0]['id']).update(uid=new_uid, detect_status=0,
-                                                                        detect_group='', detect_interval=60)
-            msg = {'commandType': 'AIDisable'}
-            thing_name = CommonService.query_serial_with_uid(old_uid)  # 存在序列号则为使用序列号作为物品名
-            topic_name = 'ansjer/generic/{}'.format('')
-            req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
-            if not req_success:
-                return response.json(10044)
+        # 判断两个设备是否在同一账号下
+        old_uid_userIDs = set(Device_Info.objects.filter(UID=old_uid).values_list('userID_id', flat=True))
+        new_uid_userIDs = set(Device_Info.objects.filter(UID=new_uid).values_list('userID_id', flat=True))
+
+        # 检查两个集合是否有交集
+        if not old_uid_userIDs.intersection(new_uid_userIDs):
+            if not new_uid_userIDs:
+                return response.json(10010)
+
+        # 查订单表查看订单类型
+        order_type = Order_Model.objects.values_list('order_type', flat=True).get(orderID=orderID)
+        if order_type not in [0, 1]:
+            return response.json(10017)
+
+        # 查老设备 orderID
+        old_using_uid_bucket = UID_Bucket.objects.filter(orderId=orderID, endTime__gte=nowTime)
+        old_unusing_uid_bucket = Unused_Uid_Meal.objects.filter(order_id=orderID)
+
+        if not old_using_uid_bucket.exists() and not old_unusing_uid_bucket.exists():
+            return response.json(10017)
+
+        # 订单套餐未使用
+        if old_unusing_uid_bucket.exists():
+            with transaction.atomic():
+                if old_unusing_uid_bucket.filter(is_ai=0).exists():
+                    old_unusing_uid_bucket.update(uid=new_uid, addTime=nowTime)
+                    new_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=new_uid, addTime=nowTime).values(
+                        'id', 'channel', 'bucket_id', 'addTime', 'expire', 'is_ai', 'order_id'
+                    )
+                else:
+                    new_ai_service = AiService.objects.filter(uid=new_uid, endTime__gte=nowTime, use_status=1)
+                    if new_ai_service.exists():  # 转入设备有开通AI功能,不能转
+                        return response.json(10014)
+                    old_unusing_uid_bucket.update(uid=new_uid, addTime=nowTime)
+                    new_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=new_uid, addTime=nowTime).values(
+                        'id', 'channel', 'bucket_id', 'addTime', 'expire', 'is_ai', 'order_id'
+                    )
+
+                # 转移后如果没有未使用套餐则把 has_unused 改为 0
+                unused_uid_meal_qs = Unused_Uid_Meal.objects.filter(uid=old_uid)
+                if not unused_uid_meal_qs.exists():
+                    UID_Bucket.objects.filter(uid=old_uid).update(has_unused=0)
+
+                # 判断新设备是否有正在使用的套餐
+                new_uid_bucket_qs = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime)
+                if new_uid_bucket_qs.exists():
+                    new_uid_bucket_qs.update(has_unused=1)
+                else:
+                    # 激活转移的套餐
+                    unused = new_unused_uid_bucket[0]
+                    endTime = CommonService.calcMonthLater(unused['expire'])
+                    data_dict = {
+                        'uid': new_uid,
+                        'channel': unused['channel'],
+                        'bucket_id': unused['bucket_id'],
+                        'addTime': unused['addTime'],
+                        'endTime': endTime,
+                        'updateTime': nowTime,
+                        'status': 1,
+                        'use_status': 1,
+                        'has_unused': 0,
+                        'orderId': unused['order_id']
+                    }
+                    UID_Bucket.objects.create(**data_dict)  # 正在使用套餐表添加数据
+                    Unused_Uid_Meal.objects.filter(order_id=orderID).first().delete()
+                    if unused['is_ai']:  # 开通AI服务
+                        AiService.objects.filter(orders_id=orderID).update(
+                            uid=new_uid, channel=unused['channel'],
+                            detect_status=new_ai_service[0]['detect_status'],
+                            addTime=nowTime, updTime=nowTime, endTime=endTime, use_status=1,
+                            orders_id=unused['order_id']
+                        )
+                # 修改订单表
+                Order_Model.objects.filter(orderID=orderID).update(UID=new_uid, updTime=nowTime)
+
+        # 订单套餐已使用
+        else:
+            old_using_uid_bucket = old_using_uid_bucket.values('id', 'bucket_id', 'has_unused', 'bucket__content').order_by('addTime')
+            old_ai_service = AiService.objects.filter(uid=old_uid, endTime__gte=nowTime, use_status=1).values('id',
+                                                                                                              'detect_interval',
+                                                                                                              'detect_status',
+                                                                                                              'detect_group')
+            new_ai_service = AiService.objects.filter(uid=new_uid, endTime__gte=nowTime, use_status=1)
+            if new_ai_service.exists():  # 转入设备有开通AI功能,不能转
+                return response.json(10014)
+
+            new_uid_set = UidSetModel.objects.filter(uid=new_uid).values('is_ai')
+            if old_ai_service.exists() and new_uid_set[0]['is_ai'] == 2:  # 转出设备有开通AI,但是转入设备不支持AI,不能转
+                return response.json(10016)
+
+            # 查询转入设备是否存在正在使用的套餐
+            new_using_uid_bucket = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime).first()
+            is_delete = 0
+            if new_using_uid_bucket:
+                vod_bucket = VodBucketModel.objects.get(id=new_using_uid_bucket.bucket_id)
+                if vod_bucket.is_free:
+                    # 是免费套餐则删除
+                    is_delete = 1
+                else:
+                    # 非免费套餐不可转移
+                    return response.json(10014)
+            with transaction.atomic():
+                if is_delete == 1:
+                    new_using_uid_bucket.delete()
+                # 如果转出设备有未使用套餐,更改第一个未使用套餐为正在使用
+                if old_using_uid_bucket[0]['has_unused'] == 1:
+                    old_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=old_uid).values('id', 'channel',
+                                                                                               'bucket_id',
+                                                                                               'addTime', 'expire',
+                                                                                               'is_ai',
+                                                                                               'order_id')
+                    count = old_unused_uid_bucket.count()
+                    unused = old_unused_uid_bucket[0]
+                    has_unused = 1 if count > 1 else 0  # 如果存在不止一个未使用套餐,has_unused=1
+                    endTime = CommonService.calcMonthLater(unused['expire'])
+                    data_dict = {
+                        'uid': old_uid,
+                        'channel': unused['channel'],
+                        'bucket_id': unused['bucket_id'],
+                        'addTime': unused['addTime'],
+                        'endTime': endTime,
+                        'updateTime': nowTime,
+                        'status': 1,
+                        'use_status': 1,
+                        'has_unused': has_unused,
+                        'orderId': unused['order_id']
+                    }
+                    UID_Bucket.objects.create(**data_dict)  # 正在使用套餐表添加数据
+                    Unused_Uid_Meal.objects.filter(uid=old_uid).first().delete()  # 删除未使用套餐表中的数据
+                    if unused['is_ai']:  # 开通AI服务
+                        AiService.objects.create(uid=old_uid, channel=unused['channel'],
+                                                 detect_status=old_ai_service[0]['detect_status'],
+                                                 addTime=nowTime, updTime=nowTime, endTime=endTime, use_status=1,
+                                                 orders_id=unused['order_id'],
+                                                 detect_group=old_ai_service[0]['detect_group'],
+                                                 detect_interval=old_ai_service[0]['detect_interval'])
+
+                # 更新正在使用套餐的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, has_unused=0)
+                StsCrdModel.objects.filter(uid=old_uid).delete()  # 删除转出设备stscrd表关联数据
+
+                # 转移AI服务
+                if old_ai_service.exists() and new_uid_set[0]['is_ai'] != 2:
+                    AiService.objects.filter(id=old_ai_service[0]['id']).update(uid=new_uid, detect_status=0,
+                                                                                detect_group='', detect_interval=60)
+                    msg = {'commandType': 'AIDisable'}
+                    thing_name = CommonService.query_serial_with_uid(old_uid)  # 存在序列号则为使用序列号作为物品名
+                    topic_name = 'ansjer/generic/{}'.format('')
+                    req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
+                    if not req_success:
+                        return response.json(10044)
+                # 修改订单表
+                Order_Model.objects.filter(orderID=orderID).update(UID=new_uid, updTime=nowTime)
 
 
         ip = CommonService.get_ip_address(request)
         ip = CommonService.get_ip_address(request)
         content = json.loads(json.dumps(request_dict))
         content = json.loads(json.dumps(request_dict))
@@ -1621,7 +1694,7 @@ class serveManagement(View):
             'time': int(time.time()),
             'time': int(time.time()),
             'url': 'cloudTransfer/mealTransfer',
             'url': 'cloudTransfer/mealTransfer',
             'content': json.dumps(content),
             'content': json.dumps(content),
-            'operation': '设备{}的套餐{}转移给设备{}'.format(old_uid, bucket_content, new_uid),
+            'operation': f'订单号:{orderID}套餐从设备{old_uid}转移到设备{new_uid}'
         }
         }
         LogModel.objects.create(**log)
         LogModel.objects.create(**log)
         return response.json(0)
         return response.json(0)