Browse Source

Merge branch 'test' of http://192.168.136.99:3000/servers/ASJServer into cheng

keiSenFront 2 years ago
parent
commit
a363d85371

+ 3 - 0
AdminController/VersionManagementController.py

@@ -9,6 +9,7 @@ import boto3
 import botocore
 from django.db import transaction
 from django.views.generic.base import View
+from Ansjer.config import LOGGER
 
 from Ansjer.config import BASE_DIR, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
 from Object.TokenObject import TokenObject
@@ -171,8 +172,10 @@ class VersionManagement(View):
                 with open(full_name, 'wb+') as write_file:
                     for chunk in file.chunks():
                         write_file.write(chunk)
+                LOGGER.info('versionManagement/upLoadFile成功上传{}'.format(file_name))
                 return response.json(0)
         except Exception as e:
+            LOGGER.info('versionManagement/upLoadFile接口异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     def editVersionInformation(self, request_dict, response):

+ 40 - 21
Controller/CloudStorage.py

@@ -21,7 +21,7 @@ from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.views.generic.base import View
 
 from Ansjer.config import SERVER_DOMAIN, PAYPAL_CRD, SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
-    AWS_ARN, OAUTH_ACCESS_TOKEN_SECRET, DETECT_PUSH_DOMAINS
+    AWS_ARN, OAUTH_ACCESS_TOKEN_SECRET, DETECT_PUSH_DOMAINS, CONFIG_INFO, CONFIG_CN
 from Controller.CheckUserData import DataValid
 from Controller.CloudPhoto.CloudServiceController import CloudServiceController
 from Controller.PaymentCycle import Paypal
@@ -206,7 +206,7 @@ class CloudStorageView(View):
             store_qs = store_qs.filter(~Q(pay_type='10'))
         else:
             store_qs = store_qs.filter(pay_type='10')
-        if is_ai != 2:  # 返回支持AI的套餐
+        if CONFIG_INFO != CONFIG_CN and is_ai != 2:  # 返回支持AI的套餐
             store_qs = store_qs.filter(is_ai=1)
         else:  # 返回不支持AI的套餐
             store_qs = store_qs.filter(is_ai=0)
@@ -477,11 +477,10 @@ class CloudStorageView(View):
             })
 
         device_info_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid, isShare=False).values(
-            'vodPrimaryUserID',
-            'vodPrimaryMaster')
+            'vodPrimaryUserID', 'Type', 'vodPrimaryMaster')
         if not device_info_qs.exists():
             return response.json(12)
-
+        device_type = device_info_qs[0]['Type']
         device_info_qs_time_over = int(time.time())
         if uid == 'UWE2ZJ52SE4FX75U111A':
             logger.info({
@@ -492,8 +491,10 @@ class CloudStorageView(View):
         if device_info_qs[0]['vodPrimaryUserID'] != user_id:
             return response.json(10034)
         now_time = int(time.time())
-        uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel).values(
-            'bucket_id').order_by('addTime')
+        if device_type == 34:  # 枪球设备开通云存不区分通道
+            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time)
+        else:
+            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel)
         if not uid_bucket_qs.exists():
             return response.json(10030)
 
@@ -682,18 +683,23 @@ class CloudStorageView(View):
         if not all([uid, status, channel]):
             return response.json(444, 'uid,status,channel')
         device_info_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid, isShare=False, isExist=1).values(
-            'vodPrimaryUserID')
+            'vodPrimaryUserID', 'Type')
         if not device_info_qs.exists() or device_info_qs[0]['vodPrimaryUserID'] != user_id:
             return response.json(12)
-        uid_bucket_qs = UID_Bucket.objects.filter(channel=channel, uid=uid)
+        device_type = device_info_qs[0]['Type']
+        if device_type == 34:  # 枪球设备开通云存不区分通道
+            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid)
+        else:
+            uid_bucket_qs = UID_Bucket.objects.filter(channel=channel, uid=uid)
         if not uid_bucket_qs.exists():
             return response.json(10030)
         now_time = int(time.time())
         if now_time > uid_bucket_qs[0].endTime:
             return response.json(10031)
-        uid_bucket_qs.update(status=status)
         if status == 0:
+            uid_bucket_qs.update(status=status)
             return response.json(0)
+        uid_bucket_qs.update(status=status, channel=channel)
         uid_obj = UidTokenObject()
         uid_obj.generate(data={'uid': uid, 'channel': channel})
 
@@ -738,10 +744,14 @@ class CloudStorageView(View):
             'vodPrimaryUserID', 'Type')
         if not device_info_qs.exists() or device_info_qs[0]['vodPrimaryUserID'] != user_id:
             return response.json(12)
+        device_type = device_info_qs[0]['Type']
         uid_set_qs = UidSetModel.objects.filter(uid=uid)
         if not uid_set_qs.exists():
             return response.json(12)
-        uid_bucket_qs = UID_Bucket.objects.filter(channel=channel, uid=uid)
+        if device_type == 34:  # 枪球设备开通云存不区分通道
+            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid)
+        else:
+            uid_bucket_qs = UID_Bucket.objects.filter(channel=channel, uid=uid)
         if not uid_bucket_qs.exists():
             return response.json(10030)
         now_time = int(time.time())
@@ -750,11 +760,12 @@ class CloudStorageView(View):
             return response.json(10031)
         try:
             with transaction.atomic():
-                uid_bucket_qs.update(status=vod_status)
                 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)
                 uid_obj = UidTokenObject()
                 uid_obj.generate(data={'uid': uid, 'channel': channel})
 
@@ -764,7 +775,7 @@ 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:
+                if uid_set_qs[0].is_ai != 2 and CONFIG_INFO != CONFIG_CN:
                     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')
 
@@ -921,7 +932,7 @@ class CloudStorageView(View):
                 if not store_qs.exists():
                     return response.json(173)
                 bucket_id = store_qs[0]['bucket_id']
-                uiu_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
+                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']
                 # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
@@ -938,15 +949,17 @@ class CloudStorageView(View):
                 if promotion.exists():
                     promotion_rule_id = promotion[0]['id']
                     expire = expire * 2
+                unuse_meal_flag = False  # 是否关联未使用套餐
                 with transaction.atomic():
-                    if uiu_bucket_qs.exists():
-                        uid_bucket = uiu_bucket_qs.first()
+                    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:  # 已过期或者不相同的套餐加入未使用的关联套餐表
+                            unuse_meal_flag = True
                             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():
@@ -982,7 +995,7 @@ class CloudStorageView(View):
                                     promotion_rule_id=promotion_rule_id)
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
                     # 开通AI服务
-                    if store_qs[0]['is_ai']:
+                    if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
                         ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
                         if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
                             ai_service_qs.update(endTime=end_time, use_status=1, updTime=now_time)
@@ -1128,6 +1141,7 @@ class CloudStorageView(View):
             if promotion_rule_qs.exists():
                 promotion_rule_id = promotion_rule_qs[0]['id']
                 expire = expire * 2
+            unuse_meal_flag = False  # 是否关联未使用套餐
             with transaction.atomic():
                 if uid_bucket_qs.exists():
                     uid_bucket = uid_bucket_qs.first()
@@ -1137,6 +1151,7 @@ class CloudStorageView(View):
                                                                               endTime=end_time,
                                                                               bucket_id=bucket_id, updateTime=now_time)
                     else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
+                        unuse_meal_flag = True
                         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():
@@ -1171,7 +1186,7 @@ class CloudStorageView(View):
                                 promotion_rule_id=promotion_rule_id)
                 date_time = time.strftime("%Y-%m-%d", time.localtime())
                 # 开通AI服务
-                if store_qs[0]['is_ai']:
+                if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
                     ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
                     if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
                         ai_service_qs.update(endTime=end_time, use_status=1, updTime=now_time)
@@ -1299,6 +1314,7 @@ class CloudStorageView(View):
                 if promotion_rule_qs.exists():
                     promotion_rule_id = promotion_rule_qs[0]['id']
                     expire = expire * 2
+                unuse_meal_flag = False  # 是否关联未使用套餐
                 with transaction.atomic():
                     if uid_bucket_qs.exists():
                         uid_bucket = uid_bucket_qs.first()
@@ -1308,6 +1324,7 @@ class CloudStorageView(View):
                                                                                   bucket_id=bucket_id,
                                                                                   endTime=end_time, updateTime=now_time)
                         else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
+                            unuse_meal_flag = True
                             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():
@@ -1343,7 +1360,7 @@ class CloudStorageView(View):
                                     promotion_rule_id=promotion_rule_id)
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
                     # 开通AI服务
-                    if store_qs[0]['is_ai']:
+                    if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
                         ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
                         if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
                             ai_service_qs.update(endTime=end_time, use_status=1, updTime=now_time)
@@ -1689,7 +1706,8 @@ class CloudStorageView(View):
         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']
-        icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
+        unuse_meal_flag = False  # 是否关联未使用套餐
+        # 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():
         #     return response.json(173)
@@ -1704,6 +1722,7 @@ class CloudStorageView(View):
                                                                               bucket_id=bucket_id,
                                                                               endTime=end_time, updateTime=now_time)
                     else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
+                        unuse_meal_flag = True
                         unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
                         nums = 1
                         if unused_uid_qs.exists():
@@ -1720,7 +1739,7 @@ class CloudStorageView(View):
                                                            use_status=1)
                     uid_bucket_id = uid_bucket.id
                 #  开通AI体验
-                if store_qs[0]['is_ai']:
+                if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
                     order_type = 1
                     ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
                     if ai_service_qs.exists():

+ 5 - 3
Controller/CloudVod.py

@@ -13,7 +13,8 @@ from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 
-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, \
+    CONFIG_INFO, CONFIG_CN
 from Model.models import Device_Info, Order_Model, Store_Meal, OssCrdModel, UID_Bucket, StsCrdModel, \
     VodBucketModel, UidSetModel, AiService
 from Object.AliPayObject import AliPayObject
@@ -96,7 +97,7 @@ class CloudVodView(View):
                 'endTime': item['endTime'],
                 'uid': item['uid'],
             }
-            if uid_set_qs[0]['is_ai'] != 2:
+            if uid_set_qs[0]['is_ai'] != 2 and CONFIG_INFO != CONFIG_CN:
                 ai_server_qs = AiService.objects.filter(uid=uid, use_status=1).values('detect_status', 'detect_group')
                 if not ai_server_qs.exists():
                     return response.json(12)
@@ -580,7 +581,8 @@ class CloudVodView(View):
             thumb = bucket.sign_url('GET', ts, 3600,
                                     params={'x-oss-process': 'video/snapshot,t_1000,m_fast,w_300'})
             vod_play_list.append(
-                {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'], 'id': vod['id']})
+                {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'],
+                 'id': vod['id']})
         vod_play_list = sorted(vod_play_list, key=lambda item: -item['name'])
         return response.json(0, vod_play_list)
 

+ 9 - 12
Controller/Cron/CronTaskController.py

@@ -317,8 +317,7 @@ class CronUpdateDataView(View):
             expired_uid_bucket.update(use_status=2)
         AiService.objects.filter(Q(endTime__lte=now_time), ~Q(use_status=2)).update(use_status=2)
         # 监控有未使用套餐则自动生效
-        expired_uid_buckets = \
-            UID_Bucket.objects.filter(endTime__lte=now_time, has_unused=1).values("id", "uid")[0:1000]
+        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(
@@ -328,30 +327,28 @@ class CronUpdateDataView(View):
                 "addTime",
                 "expire",
                 "num",
-                "bucket_id").order_by('addTime')[0:1]
+                "bucket_id").order_by('addTime')
             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()
+                    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'])
+                    end_time = CommonService.calcMonthLater(unused['expire'] * unused['num'])
                     UID_Bucket.objects.filter(
                         uid=expired_uid_bucket['uid']).update(
                         channel=unused['channel'],
-                        endTime=endTime,
+                        endTime=end_time,
                         bucket_id=unused['bucket_id'],
                         updateTime=now_time,
                         use_status=1,
                         has_unused=has_unused)
                     Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
-                    StsCrdModel.objects.filter(
-                        uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
-                    AiService.objects.filter(uid=expired_uid_bucket['uid'], channel=unused['channel']).update(
-                        use_status=1, endTime=endTime, updTime=now_time)
+                    StsCrdModel.objects.filter(uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
+                    AiService.objects.filter(uid=expired_uid_bucket['uid']).update(use_status=1, endTime=end_time,
+                                                                                   updTime=now_time,
+                                                                                   channel=unused['channel'])
             except Exception as e:
                 print(repr(e))
                 continue

+ 23 - 6
Controller/SensorGateway/GatewayDeviceController.py

@@ -7,6 +7,7 @@
 @Software: PyCharm
 """
 import datetime
+import threading
 import time
 
 import requests
@@ -29,6 +30,7 @@ from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
+from Service.ModelService import ModelService
 
 
 class GatewayDeviceView(View):
@@ -164,6 +166,7 @@ class GatewayDeviceView(View):
         @param response:
         @return:
         """
+        LOGGER.info('开始删除设备:{}'.format(request_dict))
         device_id = request_dict.get('deviceId')
         family_id = request_dict.get('familyId')
         # 1 删除网关 否则删除子设备
@@ -190,7 +193,18 @@ class GatewayDeviceView(View):
                             SocketSchedule.objects.filter(device_id=device_id).delete()
                             SceneLog.objects.filter(device_id=serial_number).delete()
                             SmartSocketView.delete_alexa_socket(serial_number)
-
+                        # 重置设备
+                        topic_name = SUB_DEVICE_TOPIC.format(serial_number)
+                        msg = {
+                            'zigbee': 'recover',
+                        }
+                        success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
+                        LOGGER.info('删除重置设备结果:{}'.format(success))
+                        try:
+                            assert success
+                        except AssertionError:
+                            return response.json(10044)
+                        time.sleep(0.3)
                         # 如果有子设备,删除子设备和关联的场景数据
                         gateway_qs = GatewaySubDevice.objects.filter(device_id=device_id)
                         if gateway_qs.exists():
@@ -200,8 +214,8 @@ class GatewayDeviceView(View):
 
                             # 下发删除设备消息
                             ieee_addr_list = gateway_qs.values_list('ieee_addr', flat=True)
-                            topic_name = SUB_DEVICE_TOPIC.format(serial_number)
                             for ieee_addr in ieee_addr_list:
+                                # 删除设备
                                 msg = {
                                     'zigbee': 'delete',
                                     'ieee': ieee_addr
@@ -212,7 +226,6 @@ class GatewayDeviceView(View):
                                 except AssertionError:
                                     return response.json(10044)
                                 time.sleep(0.3)
-
                         else:
                             smart_scene_qs = SmartScene.objects.filter(device_id=device_id)
                         if smart_scene_qs.exists():
@@ -235,6 +248,9 @@ class GatewayDeviceView(View):
                         gateway_qs.delete()  # 删除子设备
                         SceneLog.objects.filter(device_id=device_id).delete()
                         device_qs.delete()
+                        # 异步删除推送消息
+                        asy = threading.Thread(target=ModelService.del_eq_info, args=(user_id, serial_number))
+                        asy.start()
                 elif sub_ids:
                     sub_id_list = list(map(int, sub_ids.split(',')))
                     FamilyRoomDevice.objects.filter(sub_device__in=sub_id_list).delete()
@@ -250,6 +266,7 @@ class GatewayDeviceView(View):
                     ieee_addr_list = gateway_sub_device_qs.values_list('ieee_addr', flat=True)
                     topic_name = SUB_DEVICE_TOPIC.format(serial_number)
                     for ieee_addr in ieee_addr_list:
+                        # 删除设备
                         msg = {
                             'zigbee': 'delete',
                             'ieee': ieee_addr
@@ -260,12 +277,10 @@ class GatewayDeviceView(View):
                         except AssertionError:
                             return response.json(10044)
                         time.sleep(0.3)
-
                     # 删除场景,下发MQTT通知设备
                     smart_scene_qs = SmartScene.objects.filter(sub_device_id__in=sub_id_list)
                     if smart_scene_qs.exists():
                         topic_name = SMART_SCENE_TOPIC.format(serial_number)
-
                         smart_scene_info = smart_scene_qs.values('id')
                         for smart_scene in smart_scene_info:
                             # 通知设备删除场景id
@@ -283,7 +298,9 @@ class GatewayDeviceView(View):
 
                     gateway_sub_device_qs.delete()
                     SceneLog.objects.filter(sub_device_id__in=sub_id_list).delete()
-
+                    # 异步删除推送消息
+                    asy = threading.Thread(target=ModelService.del_eq_info, args=(user_id, serial_number))
+                    asy.start()
                 return response.json(0)
         except Exception as e:
             return response.json(177, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 1 - 1
Controller/SerialNumberController.py

@@ -725,7 +725,7 @@ class SerialNumberView(View):
         time_stamp_token = request_dict.get('time_stamp_token', None)
         time_stamp = request_dict.get('time_stamp', None)
         if not all([serial_number, time_stamp_token, time_stamp]):
-            return response(444)
+            return response.json(444)
         # 时间戳token校验
         if not CommonService.check_time_stamp_token(time_stamp_token, time_stamp):
             return response.json(13)

+ 5 - 5
Controller/TestApi.py

@@ -938,11 +938,11 @@ class testView(View):
                 # 判断主用户是否存在
                 primary_qs = device_info_qs.exclude(primaryUserID='')
                 if primary_qs.exists():
-                    uid_user_message['uid'] = primary_qs['UID'],
-                    uid_user_message['serialNumber'] = primary_qs['serial_number']
-                    uid_user_message['userID'] = primary_qs['userID_id']
-                    uid_user_message['username'] = primary_qs['userID__username']
-                    uid_user_message['primaryUserID'] = primary_qs['primaryUserID']
+                    uid_user_message['uid'] = primary_qs[0]['UID'],
+                    uid_user_message['serialNumber'] = primary_qs[0]['serial_number']
+                    uid_user_message['userID'] = primary_qs[0]['userID_id']
+                    uid_user_message['username'] = primary_qs[0]['userID__username']
+                    uid_user_message['primaryUserID'] = primary_qs[0]['primaryUserID']
                 else:
                     device_info = device_info_qs.first()
                     uid_user_message['uid'] = device_info['UID']

+ 35 - 0
Controller/UnicomCombo/UnicomComboTaskController.py

@@ -50,6 +50,9 @@ class UnicomComboTaskView(View):
             month = today.month
             self.query_unused_combo_and_activate(request_dict.get('iccid'), year, month, '666')
             return response.json(0)
+        elif operation == 'updateFlowUsed':  # 更新流量使用
+            self.unicom_flow_used(request_dict, response)
+            return response.json(0)
 
     @classmethod
     def check_activate_combo(cls, request_dict, response):
@@ -306,3 +309,35 @@ class UnicomComboTaskView(View):
             UnicomFlowPush.objects.create(**push_data)
         except Exception as e:
             logger.info('-->出错了~,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def unicom_flow_used(request_dict, response):
+        """
+        查询设备每张卡流量使用情况
+        @param request_dict:
+        @param response:
+        @return:
+        """
+        page_size = int(request_dict.get('pageSize', 1))
+        device_count = UnicomDeviceInfo.objects.filter(card_type=0).count()
+        total_pages = device_count // page_size + (device_count % page_size > 0)  # 计算总页数
+        for page_number in range(1, total_pages + 1):
+            u_device_qs = UnicomDeviceInfo.objects.filter(card_type=0).values('id', 'iccid', 'sim_used_flow').order_by(
+                '-created_time')[(page_number - 1) * page_size:page_number * page_size]
+            asy = threading.Thread(target=UnicomComboTaskView.thread_collect_flow_used, args=(u_device_qs,))
+            asy.start()
+        return response.json(0)
+
+    @staticmethod
+    def thread_collect_flow_used(u_device_qs):
+        for item in u_device_qs:
+            try:
+                unicom_api = UnicomObjeect()
+                n_time = int(time.time())
+                # 队列已使用总流量总量
+                flow_total_usage = unicom_api.get_flow_usage_total(item['iccid'])
+                UnicomDeviceInfo.objects.filter(id=item['id']).update(updated_time=n_time,
+                                                                      sim_used_flow=flow_total_usage)
+            except Exception as e:
+                print(repr(e))
+                continue

+ 1 - 0
Model/models.py

@@ -2946,6 +2946,7 @@ class UnicomDeviceInfo(models.Model):
     user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
     card_type = models.SmallIntegerField(default=0, verbose_name=u'状态{0:联通,1:电信,2:移动}')
     main_card = models.SmallIntegerField(default=0, verbose_name=u'SIM卡类型{0:拔插卡,1:贴片卡}')
+    sim_used_flow = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'sim卡已用总流量(MB)')
     updated_time = models.IntegerField(default=0, verbose_name='更新时间')
     created_time = models.IntegerField(default=0, verbose_name='创建时间')