Pārlūkot izejas kodu

AI合并到云存

peng 1 gadu atpakaļ
vecāks
revīzija
4f6e9f3bd8

+ 162 - 165
Controller/CloudStorage.py

@@ -184,21 +184,21 @@ class CloudStorageView(View):
         mold = request_dict.get('mold', None)
         uid = request_dict.get('uid', None)
         lang = request_dict.get('lang', 'en')
+        is_ai = request_dict.get('is_ai', 0)
         if not all([uid]):
             return response.json(444)
+        is_ai = int(is_ai)
         now_time = int(time.time())
         # DVR/NVR设备暂不返回云存套餐列表
         device_info_qs = Device_Info.objects.filter(Q(UID=uid), Q(Type__lte=4) | Q(Type=10001))
         if device_info_qs.exists():
             return response.json(0)
         # 查询设备像素
-        uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ucode')
+        uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ucode', 'is_ai')
         if not uid_set_qs.exists():
             return response.json(173)
         ucode = uid_set_qs[0]['ucode']
-        pixel_level = 0
-        if ucode and int(ucode[-5]) >= 8:
-            pixel_level = 1
+        pixel_level = 1 if ucode and int(ucode[-5]) >= 8 else 0
         store_qs = Store_Meal.objects.filter(Q(lang__lang=lang), Q(is_show=0), ~Q(pay_type='11'))  # 过滤激活码、隐藏套餐
         experience_context_qs = ExperienceContextModel.objects.filter(uid=uid, experience_type=0)
 
@@ -207,7 +207,14 @@ class CloudStorageView(View):
 
         # 没体验过的设备只返回体验套餐,体验过的不返回体验套餐
         if experience_context_qs.exists():
-            store_qs = store_qs.filter(~Q(pay_type='10'), Q(pixel_level=pixel_level))  # 筛选像素等级
+            if not is_ai:  # 返回云存套餐
+                store_qs = store_qs.filter(~Q(pay_type='10'), Q(pixel_level=pixel_level), Q(is_ai=0))  # 筛选像素等级
+            else:          # 返回云存+AI套餐
+                is_ai = uid_set_qs[0]['is_ai']
+                is_ai = 1 if is_ai != 2 and CONFIG_INFO != CONFIG_CN else 0  # 国内不支持AI服务
+                if not is_ai:
+                    return response.json(0)
+                store_qs = store_qs.filter(~Q(pay_type='10'), Q(pixel_level=pixel_level), Q(is_ai=1))  # 筛选像素等级
         else:
             store_qs = store_qs.filter(pay_type='10')  # 体验套餐不区分像素等级
 
@@ -748,6 +755,7 @@ class CloudStorageView(View):
         if not all([uid, vod_status, channel]):
             return response.json(444, 'uid,vod_status,channel')
         vod_status = int(vod_status)
+        ai_status = int(ai_status)
         device_info_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid, isShare=False, isExist=1).values(
             'vodPrimaryUserID', 'Type')
         if not device_info_qs.exists() or device_info_qs[0]['vodPrimaryUserID'] != user_id:
@@ -768,12 +776,9 @@ class CloudStorageView(View):
             return response.json(10031)
         try:
             with transaction.atomic():
-                if vod_status == 0:
+                if vod_status == 0:  # 关闭云存开关
                     uid_bucket_qs.update(status=vod_status)
-                    ai_status = '0'
-                    if uid_set_qs[0].is_ai == 2:
-                        return response.json(0)
-                uid_bucket_qs.update(status=vod_status, channel=channel)
+                    return response.json(0)
                 uid_obj = UidTokenObject()
                 uid_obj.generate(data={'uid': uid, 'channel': channel})
 
@@ -783,90 +788,76 @@ class CloudStorageView(View):
                     urls = 'https://api.zositeche.com/'
                 uid_tk_url = '{}cloudstorage/getsignsts?uidToken={}'.format(urls, uid_obj.token)
                 store_hls_url = '{}cloudstorage/storeplaylist?uidToken={}'.format(urls, uid_obj.token)
-                if uid_set_qs[0].is_ai != 2 and CONFIG_INFO != CONFIG_CN:
+
+                thing_name = CommonService.query_serial_with_uid(uid)  # 存在序列号则为使用序列号作为物品名
+                topic_name = 'ansjer/generic/{}'.format(thing_name)
+                ai_service_qs = AiService.objects.filter(uid=uid, use_status=1)
+                if ai_status == 0:  # 关闭
+                    # mqtt通知设备关闭AI识别功能
+                    msg = {'commandType': 'AIDisable'}
+                    req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
+                    if not req_success:
+                        return response.json(10044)
+                    ai_service_qs.update(detect_status=ai_status, endTime=end_time)
+                    return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url})
+                elif ai_status == 1:  # 开启
                     if not all([appBundleId, app_type, token_val, uid, m_code, ai_status]):
                         return response.json(444, 'appBundleId, app_type, token_val, uid,m_code, ai_status')
-
                     # 如果传空上来,就默认为0
                     tz = '0' if tz == '' else tz.replace('GMT', '')
-                    ai_status = int(ai_status)
-                    ai_service_qs = AiService.objects.filter(uid=uid, use_status=1)
-                    if not ai_service_qs.exists():
-                        return response.json(10053)
-
                     uid_set_id = uid_set_qs[0].id
-                    interval = uid_set_qs[0].new_detect_interval if not interval else interval
                     qs_data = {
                         'updTime': now_time,
+                        'detect_interval': uid_set_qs[0].new_detect_interval if not interval else interval,
+                        'detect_group': detect_group if detect_group else ''
+                    }
+                    # 更新或创建uid_push数据
+                    uid_push_qs = UidPushModel.objects.filter(userID_id=user_id, m_code=m_code, uid_set__uid=uid)
+                    uid_push_data = {
+                        'appBundleId': appBundleId,
+                        'app_type': app_type,
+                        'push_type': push_type,
+                        'token_val': token_val,
+                        'updTime': now_time,
+                        'lang': lang,
+                        'tz': tz
                     }
-                    if interval:
-                        qs_data['detect_interval'] = int(interval)
-                        qs_data['detect_group'] = detect_group if detect_group else ''
-                    uid_set_qs.update(**qs_data)
 
+                    if uid_push_qs.exists():
+                        uid_push_qs.update(**uid_push_data)
+                    else:
+                        uid_push_data['uid_set_id'] = uid_set_id
+                        uid_push_data['userID_id'] = user_id
+                        uid_push_data['m_code'] = m_code
+                        uid_push_data['addTime'] = now_time
+                        UidPushModel.objects.create(**uid_push_data)
+                    etkObj = ETkObject(etk='')
+                    etk = etkObj.encrypt(uid)
+                    # mqtt通知设备开启AI识别功能
+                    push_url = DETECT_PUSH_DOMAINS
+                    # 欧洲域名固定返回欧洲域名
+                    if domain_name in ['api.zositeche.com', 'api.loocam3.com', 'common.neutral3.com']:
+                        push_url = 'https://push.zositeche.com/'
+                    aiIdentificationUrl = '{}AiService/identification'.format(push_url)
+                    msg = {
+                        'commandType': 'AIEnable',
+                        'payload': {
+                            'etk': etk,
+                            'endTime': end_time,
+                            'aiIdentificationUrl': aiIdentificationUrl,
+                        }
+                    }
+                    req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
+                    if not req_success:
+                        return response.json(10044)
+                    uid_set_qs.update(**qs_data)
                     qs_data['detect_status'] = ai_status  # ai开关状态
                     qs_data['endTime'] = end_time
                     ai_service_qs.update(**qs_data)
-                    thing_name = CommonService.query_serial_with_uid(uid)  # 存在序列号则为使用序列号作为物品名
-                    topic_name = 'ansjer/generic/{}'.format(thing_name)
-
-                    if ai_status == 0:  # 关闭
-                        # mqtt通知设备关闭AI识别功能
-                        msg = {'commandType': 'AIDisable'}
-                        req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
-                        if not req_success:
-                            return response.json(10044)
-                        if vod_status == 0:
-                            return response.json(0)
-                        return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url})
-                    elif ai_status == 1:  # 开启
-                        # 更新或创建uid_push数据
-                        uid_push_qs = UidPushModel.objects.filter(userID_id=user_id, m_code=m_code, uid_set__uid=uid)
-                        uid_push_data = {
-                            'appBundleId': appBundleId,
-                            'app_type': app_type,
-                            'push_type': push_type,
-                            'token_val': token_val,
-                            'updTime': now_time,
-                            'lang': lang,
-                            'tz': tz
-                        }
-
-                        if uid_push_qs.exists():
-                            uid_push_qs.update(**uid_push_data)
-                        else:
-                            uid_push_data['uid_set_id'] = uid_set_id
-                            uid_push_data['userID_id'] = user_id
-                            uid_push_data['m_code'] = m_code
-                            uid_push_data['addTime'] = now_time
-                            UidPushModel.objects.create(**uid_push_data)
-                        if appBundleId == 0 or appBundleId == '0':
-                            LOGGER.info('cloudstorage/changevodaistatus接口推送数据{}'.format(request_dict))
-                        etkObj = ETkObject(etk='')
-                        etk = etkObj.encrypt(uid)
-
-                        # mqtt通知设备开启AI识别功能
-                        push_url = DETECT_PUSH_DOMAINS
-                        # 欧洲域名固定返回欧洲域名
-                        if domain_name in ['api.zositeche.com', 'api.loocam3.com', 'common.neutral3.com']:
-                            push_url = 'https://push.zositeche.com/'
-                        aiIdentificationUrl = '{}AiService/identification'.format(push_url)
-                        msg = {
-                            'commandType': 'AIEnable',
-                            'payload': {
-                                'etk': etk,
-                                'endTime': end_time,
-                                'aiIdentificationUrl': aiIdentificationUrl,
-                            }
-                        }
-                        req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
-                        if not req_success:
-                            return response.json(10044)
-                        return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url,
-                                                 'aiIdentificationUrl': aiIdentificationUrl, 'endTime': end_time,
-                                                 'etk': etk})
-
-                return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url})
+                    return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url,
+                                             'aiIdentificationUrl': aiIdentificationUrl, 'endTime': end_time,
+                                             'etk': etk})
+                uid_bucket_qs.update(status=vod_status, channel=channel)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
@@ -936,14 +927,14 @@ class CloudStorageView(View):
                 channel = order_list[0]['channel']
                 rank = order_list[0]['rank']
 
-                store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
+                store_qs = Store_Meal.objects.filter(id=rank).values('day', 'bucket_id', 'expire',
                                                                      'icloud_store_meal_id')
                 if not store_qs.exists():
                     return response.json(173)
                 bucket_id = store_qs[0]['bucket_id']
-                uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
-                                                                          "bucket__region", "endTime", "use_status")
                 expire = store_qs[0]['expire']
+                uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id",
+                                                                          "bucket__region", "endTime", "use_status")
                 # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
                 # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
                 # if not icloud_meal_qs.exists():
@@ -958,28 +949,20 @@ class CloudStorageView(View):
                 if promotion.exists():
                     promotion_rule_id = promotion[0]['id']
                     expire = expire * 2
+                end_time = CommonService.calcMonthLater(expire)
                 with transaction.atomic():
                     if uid_bucket_qs.exists():
                         uid_bucket = uid_bucket_qs.first()
-                        if uid_bucket['use_status'] == 1 and uid_bucket['bucket_id'] == bucket_id:  # 套餐使用中并且相同套餐叠加过期时间
-                            end_time = CommonService.calcMonthLater(expire, uid_bucket['endTime'])
-                            UID_Bucket.objects.filter(id=uid_bucket['id']).update(uid=uid, channel=channel,
-                                                                                  bucket_id=bucket_id, endTime=end_time,
-                                                                                  updateTime=now_time)
-                        else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                            unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
-                            nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
-                            if promotion.exists():
-                                nums = nums + 1
-                            if unused_uid_qs.exists():
-                                unused_uid_qs.update(num=F('num') + nums)
-                            else:
-                                Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, num=nums,
-                                                               expire=store_qs[0]['expire'], bucket_id=bucket_id)
-                            UID_Bucket.objects.filter(id=uid_bucket['id']).update(has_unused=1)
                         uid_bucket_id = uid_bucket['id']
+                        if uid_bucket['use_status'] == 1 and uid_bucket['endTime'] > now_time:  # 套餐使用中并且相同套餐叠加过期时间
+                            Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, is_ai=0,
+                                                           expire=expire, bucket_id=bucket_id, order_id=order_id)
+                            UID_Bucket.objects.filter(id=uid_bucket_id).update(has_unused=1)
+                        else:
+                            UID_Bucket.objects.filter(id=uid_bucket_id).update(channel=channel, bucket_id=bucket_id,
+                                                                               endTime=end_time, updateTime=now_time,
+                                                                               use_status=1)
                     else:
-                        end_time = CommonService.calcMonthLater(expire)
                         uid_bucket = UID_Bucket.objects.create(uid=uid, channel=channel, bucket_id=bucket_id,
                                                                endTime=end_time, addTime=now_time, updateTime=now_time,
                                                                use_status=1)
@@ -1110,14 +1093,15 @@ class CloudStorageView(View):
             uid = order_list[0]['UID']
             channel = order_list[0]['channel']
             rank = order_list[0]['rank']
-            store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
+            store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "expire", "is_ai",
                                                                  'icloud_store_meal_id')
             if not store_qs.exists():
                 return response.json(173)
             bucket_id = store_qs[0]['bucket_id']
-            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
-                                                                      "bucket__region", "endTime", "use_status")
+            is_ai = store_qs[0]['is_ai']
             expire = store_qs[0]['expire']
+            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id",
+                                                                      "bucket__region", "endTime", "use_status")
             # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
             # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
             # if not icloud_meal_qs.exists():
@@ -1132,28 +1116,22 @@ class CloudStorageView(View):
             if promotion_rule_qs.exists():
                 promotion_rule_id = promotion_rule_qs[0]['id']
                 expire = expire * 2
+            end_time = CommonService.calcMonthLater(expire)
+            use_flag = True
             with transaction.atomic():
                 if uid_bucket_qs.exists():
                     uid_bucket = uid_bucket_qs.first()
-                    if uid_bucket['use_status'] == 1 and uid_bucket['bucket_id'] == bucket_id:  # 套餐使用中并且相同套餐叠加过期时间
-                        end_time = CommonService.calcMonthLater(expire, uid_bucket['endTime'])
-                        UID_Bucket.objects.filter(id=uid_bucket['id']).update(uid=uid, channel=channel,
-                                                                              endTime=end_time,
-                                                                              bucket_id=bucket_id, updateTime=now_time)
-                    else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                        unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
-                        nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
-                        if promotion_rule_qs.exists():
-                            nums = nums + 1
-                        if unused_uid_qs.exists():
-                            unused_uid_qs.update(num=F('num') + nums)
-                        else:
-                            Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, num=nums,
-                                                           expire=store_qs[0]['expire'], bucket_id=bucket_id)
-                        UID_Bucket.objects.filter(id=uid_bucket['id']).update(has_unused=1)
                     uid_bucket_id = uid_bucket['id']
+                    if uid_bucket['use_status'] == 1 and uid_bucket['endTime'] > now_time:  # 套餐使用中并且相同套餐叠加过期时间
+                        Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, order_id=order_id,
+                                                       expire=expire, is_ai=is_ai, bucket_id=bucket_id)
+                        UID_Bucket.objects.filter(id=uid_bucket_id).update(has_unused=1)
+                        use_flag = False
+                    else:
+                        UID_Bucket.objects.filter(id=uid_bucket_id).update(channel=channel, bucket_id=bucket_id,
+                                                                           endTime=end_time, updateTime=now_time,
+                                                                           use_status=1)
                 else:
-                    end_time = CommonService.calcMonthLater(expire)
                     uid_bucket = UID_Bucket.objects.create(uid=uid, channel=channel, bucket_id=bucket_id,
                                                            endTime=end_time, addTime=now_time, updateTime=now_time,
                                                            use_status=1)
@@ -1174,6 +1152,14 @@ class CloudStorageView(View):
                 order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                                 promotion_rule_id=promotion_rule_id)
                 date_time = time.strftime("%Y-%m-%d", time.localtime())
+                # 开通AI服务
+                if is_ai and use_flag:
+                    ai_service = AiService.objects.filter(uid=uid, channel=channel)
+                    if ai_service.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
+                        ai_service.update(updTime=now_time, use_status=1, orders_id=order_id, endTime=end_time)
+                    else:
+                        AiService.objects.create(uid=uid, channel=channel, detect_status=1, addTime=now_time,
+                                                 updTime=now_time, endTime=end_time, use_status=1, orders_id=order_id)
                 # 开通云盘服务
                 # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
                 # if not icloud_use_qs.exists():
@@ -1222,7 +1208,7 @@ class CloudStorageView(View):
 
     def do_pay_by_wechat_callback(self, request, response):  # 微信支付回调
         """
-        查询套餐列表
+        微信支付回调
         @param request: 请求体
         @request_dict result_code: 业务结果
         @request_dict out_trade_no: 商户订单号
@@ -1265,14 +1251,14 @@ class CloudStorageView(View):
                 uid = order_list[0]['UID']
                 channel = order_list[0]['channel']
                 rank = order_list[0]['rank']
-                store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
+                store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "expire",
                                                                      'icloud_store_meal_id')
                 if not store_qs.exists():
                     return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '套餐不存在'}))
                 bucket_id = store_qs[0]['bucket_id']
-                uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
-                                                                          "bucket__region", "endTime", "use_status")
                 expire = store_qs[0]['expire']
+                uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id",
+                                                                          "bucket__region", "endTime", "use_status")
                 # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
                 # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
                 # if not icloud_meal_qs.exists():
@@ -1287,28 +1273,20 @@ class CloudStorageView(View):
                 if promotion_rule_qs.exists():
                     promotion_rule_id = promotion_rule_qs[0]['id']
                     expire = expire * 2
+                end_time = CommonService.calcMonthLater(expire)
                 with transaction.atomic():
                     if uid_bucket_qs.exists():
                         uid_bucket = uid_bucket_qs.first()
-                        if uid_bucket['use_status'] == 1 and uid_bucket['bucket_id'] == bucket_id:  # 套餐使用中并且相同套餐叠加过期时间
-                            end_time = CommonService.calcMonthLater(expire, uid_bucket['endTime'])
-                            UID_Bucket.objects.filter(id=uid_bucket['id']).update(uid=uid, channel=channel,
-                                                                                  bucket_id=bucket_id,
-                                                                                  endTime=end_time, updateTime=now_time)
-                        else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                            unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
-                            nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
-                            if promotion_rule_qs.exists():
-                                nums = nums + 1
-                            if unused_uid_qs.exists():
-                                unused_uid_qs.update(num=F('num') + nums)
-                            else:
-                                Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, num=nums,
-                                                               expire=store_qs[0]['expire'], bucket_id=bucket_id)
-                            UID_Bucket.objects.filter(id=uid_bucket['id']).update(has_unused=1)
                         uid_bucket_id = uid_bucket['id']
+                        if uid_bucket['use_status'] == 1 and uid_bucket['endTime'] > now_time:  # 套餐使用中并且相同套餐叠加过期时间
+                            Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, is_ai=0,
+                                                           expire=expire, bucket_id=bucket_id, order_id=order_id)
+                            UID_Bucket.objects.filter(id=uid_bucket['id']).update(has_unused=1)
+                        else:
+                            UID_Bucket.objects.filter(id=uid_bucket_id).update(channel=channel, bucket_id=bucket_id,
+                                                                               endTime=end_time, updateTime=now_time,
+                                                                               use_status=1)
                     else:
-                        end_time = CommonService.calcMonthLater(expire)
                         uid_bucket = UID_Bucket.objects.create(uid=uid, channel=channel, bucket_id=bucket_id,
                                                                endTime=end_time, addTime=now_time,
                                                                updateTime=now_time, use_status=1)
@@ -1645,16 +1623,22 @@ class CloudStorageView(View):
         order_id = CommonService.createOrderID()
         now_time = int(time.time())
         store_qs = Store_Meal.objects.filter(id=rank, lang__lang=lang, is_show=0).values("day", "bucket_id",
-                                                                                         "bucket__storeDay", "expire",
+                                                                                         "expire",
                                                                                          'lang__content', 'price',
                                                                                          'currency', 'commodity_type',
                                                                                          'icloud_store_meal_id')
         if not store_qs.exists():
             return response.json(173)
         bucket_id = store_qs[0]['bucket_id']
-        uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
-                                                                  "bucket__region", "endTime", "use_status")
+        uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__region",
+                                                                  "endTime", "use_status")
         expire = store_qs[0]['expire']
+        uid_set_qs = UidSetModel.objects.filter(uid=uid, channel=channel).values('is_ai')
+        if not uid_set_qs.exists():
+            return response.json(173)
+        is_ai = 1 if uid_set_qs[0]['is_ai'] != 2 else 0
+        use_flag = True
+        end_time = CommonService.calcMonthLater(expire)
         # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
         # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
         # if not icloud_meal_qs.exists():
@@ -1664,27 +1648,22 @@ class CloudStorageView(View):
             with transaction.atomic():
                 if uid_bucket_qs.exists():
                     uid_bucket = uid_bucket_qs.first()
-                    if uid_bucket['use_status'] == 1 and uid_bucket['bucket_id'] == bucket_id:  # 套餐使用中并且相同套餐叠加过期时间
-                        end_time = CommonService.calcMonthLater(expire, uid_bucket['endTime'])
-                        UID_Bucket.objects.filter(id=uid_bucket['id']).update(uid=uid, channel=channel,
-                                                                              bucket_id=bucket_id,
-                                                                              endTime=end_time, updateTime=now_time)
-                    else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                        unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
-                        nums = 1
-                        if unused_uid_qs.exists():
-                            unused_uid_qs.update(num=F('num') + nums)
-                        else:
-                            Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, num=nums,
-                                                           expire=store_qs[0]['expire'], bucket_id=bucket_id)
-                        UID_Bucket.objects.filter(id=uid_bucket['id']).update(has_unused=1)
                     uid_bucket_id = uid_bucket['id']
+                    if uid_bucket['use_status'] == 1 and uid_bucket['endTime'] > now_time:
+                        Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, is_ai=is_ai,
+                                                       order_id=order_id, expire=expire, bucket_id=bucket_id)
+                        UID_Bucket.objects.filter(id=uid_bucket_id).update(has_unused=1)
+                        use_flag = False
+                    else:
+                        UID_Bucket.objects.filter(id=uid_bucket_id).update(channel=channel, bucket_id=bucket_id,
+                                                                           endTime=end_time, updateTime=now_time,
+                                                                           use_status=1)
                 else:
-                    end_time = CommonService.calcMonthLater(expire)
                     uid_bucket = UID_Bucket.objects.create(uid=uid, channel=channel, bucket_id=bucket_id,
                                                            endTime=end_time, addTime=now_time, updateTime=now_time,
                                                            use_status=1)
                     uid_bucket_id = uid_bucket.id
+
                 #  开通云盘体验
                 # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id')
                 # if not icloud_use_qs.exists():
@@ -1714,6 +1693,14 @@ class CloudStorageView(View):
                                            pay_url="体验版", store_meal_name=store_meal_name,
                                            commodity_code=commodity_code, commodity_type=store_qs[0]['commodity_type'],
                                            rank_id=rank, status=1, uid_bucket_id=uid_bucket_id, ai_rank_id=1)
+                #  开通AI服务,国内不支持AI
+                if is_ai and use_flag and CONFIG_INFO != CONFIG_CN:
+                    ai_service = AiService.objects.filter(uid=uid, channel=channel)
+                    if ai_service.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
+                        ai_service.update(updTime=now_time, use_status=1, orders_id=order_id, endTime=end_time)
+                    else:
+                        AiService.objects.create(uid=uid, channel=channel, detect_status=1, addTime=now_time,
+                                                 updTime=now_time, endTime=end_time, use_status=1, orders_id=order_id)
 
                 device_user_qs = Device_User.objects.filter(userID=user_id).values('username')
                 device_info_qs = Device_Info.objects.filter(UID=uid, vodPrimaryUserID='', vodPrimaryMaster='')
@@ -1882,12 +1869,11 @@ class CloudStorageView(View):
             unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid).annotate(unused_id=F('id')).values("unused_id",
                                                                                                        "uid",
                                                                                                        "bucket__content",
-                                                                                                       "num",
                                                                                                        "bucket__id",
                                                                                                        "expire")
             month = 'month' if lang != 'cn' else '个月'
             for unused_uid in unused_uid_qs:
-                storage_time = unused_uid['num'] * unused_uid['expire']
+                storage_time = unused_uid['expire']
                 if lang != 'cn' and storage_time > 1:  # 英文大于一个月使用复数
                     month += 's'
                 storage = str(storage_time) + month
@@ -1935,7 +1921,8 @@ class CloudStorageView(View):
         using_uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, has_unused=1).values("id", "uid", "endTime",
                                                                                       "bucket__content", "addTime")
         unused_uid_bucket_qs = Unused_Uid_Meal.objects.filter(id=unused_id).values("id", "uid", "channel", "addTime",
-                                                                                   "expire", "num", "bucket_id")
+                                                                                   "expire", "is_ai", "bucket_id",
+                                                                                   "order_id")
         if not unused_uid_bucket_qs.exists() or not using_uid_bucket_qs.exists():
             return response.json(10030)
         unused_uid_bucket = unused_uid_bucket_qs.first()
@@ -1944,11 +1931,21 @@ class CloudStorageView(View):
             with transaction.atomic():
                 count_unused = Unused_Uid_Meal.objects.filter(uid=uid).count()
                 has_unused = 1 if count_unused > 1 else 0
-                end_time = CommonService.calcMonthLater(unused_uid_bucket['expire'] * unused_uid_bucket['num'])
+                end_time = CommonService.calcMonthLater(unused_uid_bucket['expire'])
                 UID_Bucket.objects.filter(uid=uid).update(channel=unused_uid_bucket['channel'], endTime=end_time,
                                                           bucket_id=unused_uid_bucket['bucket_id']
                                                           , updateTime=now_time, use_status=1,
                                                           has_unused=has_unused)
+                # 开通AI服务
+                if unused_uid_bucket['is_ai']:
+                    ai_service = AiService.objects.filter(uid=uid, channel=unused_uid_bucket['channel'])
+                    if ai_service.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
+                        ai_service.update(updTime=now_time, use_status=1, orders_id=unused_uid_bucket['order_id'],
+                                          endTime=end_time)
+                    else:
+                        AiService.objects.create(uid=uid, channel=unused_uid_bucket['channel'], detect_status=1,
+                                                 addTime=now_time, updTime=now_time, endTime=end_time, use_status=1,
+                                                 orders_id=unused_uid_bucket['order_id'])
                 Unused_Uid_Meal.objects.filter(id=unused_id).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()  # 删除sts记录
                 # VodHlsModel.objects.filter(uid=uid).delete()  # 删除播放列表,后期数据量多时应该考虑延后删除

+ 45 - 24
Controller/CloudTransfer.py

@@ -13,7 +13,7 @@ from django.db.models import Q
 from django.views.generic.base import View
 
 from Model.models import Device_User, Device_Info, Order_Model, UID_Bucket, StsCrdModel, VodHlsModel, Unused_Uid_Meal, \
-    VodBucketModel, UnicomDeviceInfo, LogModel, UidPushModel
+    VodBucketModel, UnicomDeviceInfo, LogModel, UidPushModel, AiService, UidSetModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -196,30 +196,48 @@ class cloudTestView(View):
             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)
-
-            # 如果转出设备有未使用套餐,更改第一个未使用套餐为正在使用
-            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', 'num')
-                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'] * unused['num'])
-                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()  # 删除未使用套餐表中的数据
-
+            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)
+            old_uid_set = UidSetModel.objects.filter(uid=new_uid).values('is_ai')
+            if old_ai_service.exists() and old_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'])
                 # 更新转入设备的主用户信息
                 Device_Info.objects.filter(UID=new_uid).update(vodPrimaryUserID=vodPrimaryUserID,
                                                                vodPrimaryMaster=vodPrimaryMaster)
@@ -227,6 +245,9 @@ class cloudTestView(View):
                 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 old_uid_set[0]['is_ai'] != 2:
+                    AiService.objects.filter(id=old_ai_service[0]['id']).update(uid=new_uid)
 
                 # 记录套餐转移日志
                 ip = CommonService.get_ip_address(request)

+ 13 - 3
Controller/Cron/CronTaskController.py

@@ -401,8 +401,9 @@ class CronUpdateDataView(View):
                 "channel",
                 "addTime",
                 "expire",
-                "num",
-                "bucket_id").order_by('addTime')
+                "is_ai",
+                "bucket_id",
+                "order_id").order_by('addTime')
             if not unuseds.exists():
                 continue
             unused = unuseds[0]
@@ -410,7 +411,7 @@ class CronUpdateDataView(View):
                 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
-                    end_time = CommonService.calcMonthLater(unused['expire'] * unused['num'])
+                    end_time = CommonService.calcMonthLater(unused['expire'])
                     UID_Bucket.objects.filter(
                         uid=expired_uid_bucket['uid']).update(
                         channel=unused['channel'],
@@ -419,6 +420,15 @@ class CronUpdateDataView(View):
                         updateTime=now_time,
                         use_status=1,
                         has_unused=has_unused)
+                    if unused['is_ai']:
+                        ai_service = AiService.objects.filter(uid=expired_uid_bucket['uid'], channel=unused['channel'])
+                        if ai_service.exists():
+                            ai_service.update(updTime=now_time, use_status=1, orders_id=unused['order_id'],
+                                              endTime=end_time)
+                        else:
+                            AiService.objects.create(uid=expired_uid_bucket['uid'], channel=unused['channel'],
+                                                     detect_status=1, addTime=now_time, orders_id=unused['order_id'],
+                                                     updTime=now_time, endTime=end_time, use_status=1)
                     Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
                     StsCrdModel.objects.filter(uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
             except Exception as e:

+ 46 - 41
Controller/PaymentCycle.py

@@ -207,8 +207,7 @@ class PaypalCycleNotify(View):
             username = order_list[0]['userID__username']
             channel = order_list[0]['channel']
             rank = order_list[0]['rank']
-            smqs = Store_Meal.objects.filter(id=rank). \
-                values("day", "bucket_id", "bucket__storeDay", "expire")
+            smqs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire", "is_ai")
             bucketId = smqs[0]['bucket_id']
             if not smqs.exists():
                 logger.info('----订阅套餐失效----')
@@ -220,7 +219,7 @@ class PaypalCycleNotify(View):
             ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
                                                              "endTime", "use_status")
             expire = smqs[0]['expire']
-
+            is_ai = smqs[0]['is_ai']
             if order_list[0]['isSelectDiscounts'] == 1:
                 expire = smqs[0]['expire'] * 2
             # 是否有促销
@@ -229,28 +228,22 @@ class PaypalCycleNotify(View):
             if promotion.exists():
                 promotion_rule_id = promotion[0]['id']
                 expire = expire * 2
+            endTime = CommonService.calcMonthLater(expire)
+            use_flag = True
             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 promotion.exists():
-                            nums = nums + 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']
+                    if ubq['use_status'] == 1 and ubq['endTime'] > nowTime:  # 套餐使用中并且未过期,加入未使用的关联套餐表
+                        Unused_Uid_Meal.objects.create(uid=UID, channel=channel, addTime=nowTime, is_ai=is_ai,
+                                                       order_id=orderID, expire=expire, bucket_id=bucketId)
+                        UID_Bucket.objects.filter(id=uid_bucket_id).update(has_unused=1)
+                        use_flag = False
+                    else:  # 云存服务已过期则重新开通云存服务
+                        UID_Bucket.objects.filter(id=uid_bucket_id).update(uid=UID, channel=channel, bucket_id=bucketId,
+                                                                           endTime=endTime, updateTime=nowTime)
+
                 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)
@@ -262,6 +255,14 @@ class PaypalCycleNotify(View):
                         'vodPrimaryMaster': username
                     }
                     dvq.update(**dvq_set_update_dict)
+                # 开通AI服务
+                if is_ai and use_flag:
+                    ai_service = AiService.objects.filter(uid=UID, channel=channel)
+                    if ai_service.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
+                        ai_service.update(updTime=nowTime, use_status=1, orders_id=orderID, endTime=endTime)
+                    else:
+                        AiService.objects.create(uid=UID, channel=channel, detect_status=1, addTime=nowTime,
+                                                 updTime=nowTime, endTime=endTime, use_status=1, orders_id=orderID)
 
                 # uid_main_exist = UIDMainUser.objects.filter(UID=UID)
                 # if not uid_main_exist.exists():
@@ -437,41 +438,38 @@ class PaypalCycleNotify(View):
             username = order_qs[0]['userID__username']
             channel = order_qs[0]['channel']
             rank = order_qs[0]['rank']
-            store_meal_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire")
+            store_meal_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
+                                                                      "is_ai")
             if not store_meal_qs.exists():
                 PAY_LOGGER.info('{} PayPal周期扣款失败---套餐数据不存在'.format(UID))
                 return HttpResponse('fail', status=500)
 
             bucketId = store_meal_qs[0]['bucket_id']
             expire = store_meal_qs[0]['expire']
+            is_ai = store_meal_qs[0]['is_ai']
+            endTime = CommonService.calcMonthLater(expire)
+            use_flag = True
+            orderID = CommonService.createOrderID()
             ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
                                                              "endTime", "use_status")
 
             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 = 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=expire, bucket_id=bucketId)
-                        UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
                     uid_bucket_id = ubq['id']
+                    if ubq['use_status'] == 1 and ubq['endTime'] > nowTime:  # 套餐使用中并且未过期
+                        Unused_Uid_Meal.objects.create(uid=UID, channel=channel, addTime=nowTime, is_ai=is_ai,
+                                                       order_id=orderID, expire=expire, bucket_id=bucketId)
+                        UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
+                        use_flag = False
+                    else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
+                        UID_Bucket.objects.filter(id=uid_bucket_id).update(uid=UID, channel=channel, bucket_id=bucketId,
+                                                                           endTime=endTime, updateTime=nowTime)
+
                 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)
+                    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
-                # 开通AI服务
                 dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
                 if dvq.exists():
                     dvq_set_update_dict = {
@@ -480,7 +478,6 @@ class PaypalCycleNotify(View):
                     }
                     dvq.update(**dvq_set_update_dict)
 
-                orderID = CommonService.createOrderID()
                 store_meal_qs = Store_Meal.objects.filter(id=rank, lang__lang='cn', is_show=0).values('lang__title',
                                                                                                       'lang__content')
                 if store_meal_qs.exists():
@@ -498,6 +495,14 @@ class PaypalCycleNotify(View):
                                            coupon_id='', uid_bucket_id=uid_bucket_id, status=1,
                                            agreement_id=agreement_id, store_meal_name=store_meal_name,
                                            plan_id=plan_id, ai_rank_id=1, trade_no=paypal_transaction_id)
+                # 开通AI服务
+                if is_ai and use_flag:
+                    ai_service = AiService.objects.filter(uid=uid, channel=channel)
+                    if ai_service.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
+                        ai_service.update(updTime=nowTime, use_status=1, orders_id=orderID, endTime=endTime)
+                    else:
+                        AiService.objects.create(uid=uid, channel=channel, detect_status=1, addTime=nowTime,
+                                                 updTime=nowTime, endTime=endTime, use_status=1, orders_id=orderID)
 
                 # 如果存在序列号,消息提示用序列号
                 device_name = CommonService.query_serial_with_uid(uid=UID)

+ 4 - 1
Model/models.py

@@ -756,6 +756,7 @@ class Store_Meal(models.Model):
     sort = models.IntegerField(default=99, blank=True, verbose_name=u'排序,越小越靠前')  # 单位月
     icloud_store_meal_id = models.IntegerField(default=0, verbose_name='关联云盘套餐id')
     pixel_level = models.SmallIntegerField(default=0, verbose_name='像素等级')  # 0:低于4k像素;1:大于等于4k像素
+    is_ai = models.SmallIntegerField(default=0, verbose_name='是否支持AI')  # 0:不支持;1:支持
 
     def __str__(self):
         return self.id
@@ -1293,8 +1294,10 @@ class Unused_Uid_Meal(models.Model):
     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)
+    is_ai = models.SmallIntegerField(verbose_name='是否开通AI服务', default=0)  # 0:不开通;1:开通
+    order_id = models.CharField(max_length=20, verbose_name='关联订单号', default='', db_index=True)
 
+    # 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关联')