Browse Source

Merge branch 'dev' of http://192.168.136.99:3000/SERVER/AnsjerServer into zjz

 Conflicts:
	Controller/Cloudsum.py
zjz 4 years ago
parent
commit
affaae746a

+ 5 - 0
Ansjer/config.py

@@ -68,6 +68,11 @@ OSS_STS_ACCESS_KEY = 'LTAIyMkGfEdogyL9'
 OSS_STS_ACCESS_SECRET = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
 OSS_ROLE_ARN = 'acs:ram::1901342792446414:role/stsoss'
 
+# aws api key
+AWS_ACCESS_KEY_ID = ['AKIA2MMWBR4DSFG67DTG','AKIA2E67UIMD45Y3HL53']  #0国内, 1国外
+AWS_SECRET_ACCESS_KEY = ['aI9gxcAKPmiGgPy9axrtFKzjYGbvpuytEX4xWweL','ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw']
+AWS_ARN = ['arn:aws-cn:s3','arn:aws:s3']
+
 # 不同环境配置
 if SERVER_TYPE == 'Ansjer.local_settings':
     from Ansjer.config_local import *

+ 0 - 2
Ansjer/urls.py

@@ -266,8 +266,6 @@ urlpatterns = [
     #url(r'^test/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
     url(r'^Cloudsum/$', Cloudsum.Cloudsum.as_view()),
 
-
-
     re_path('(?P<path>.*)', LogManager.errorPath),
 
 

+ 365 - 253
Controller/CloudStorage.py

@@ -12,10 +12,14 @@
 @Contact: chanjunkai@163.com
 """
 import json
+import os
 import time
 import urllib
+from urllib.parse import quote, parse_qs, unquote
 
+import apns2
 import boto3
+import jpush
 import oss2
 import paypalrestsdk
 import threading
@@ -27,11 +31,12 @@ from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.views.generic.base import View
+from pyfcm import FCMNotification
 
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
-    SERVER_DOMAIN_SSL
+    SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, JPUSH_CONFIG
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
-    ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User
+    ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel
 from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -96,6 +101,11 @@ class CloudStorageView(View):
             return self.do_sign_play_m3u8(request_dict, response)
         elif operation == 'payOK':
             return self.do_pay_ok(request_dict)
+        elif operation == 'vodMsgEnd':
+            return self.do_vod_msg_end(request_dict)
+        elif operation == 'vodMsgNotice':
+            return self.do_vod_msg_Notice(request_dict)
+
         else:
             token = request_dict.get('token', None)
             # 设备主键uid
@@ -253,11 +263,11 @@ class CloudStorageView(View):
         bucket_name = vh_qs[0]['bucket__bucket']
         print(bucket__region)
         print(bucket_name)
-        aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-        aws_secret_access_key = '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'
+
+
         session = Session(
-            aws_access_key_id=aws_access_key_id,
-            aws_secret_access_key=aws_secret_access_key,
+            aws_access_key_id=AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]],
+            aws_secret_access_key = AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]],
             region_name=bucket__region
         )
         '''
@@ -329,142 +339,77 @@ class CloudStorageView(View):
                    values("bucket__mold", "bucket__bucket", "bucket__endpoint",
                           "bucket__region", "endTime").order_by('addTime')[:1]
         if ubqs.exists():
-            if ubqs[0]["bucket__mold"] == 0:
-                # 阿里云 oss sts
-                oc_qs = OssCrdModel.objects.filter(uid=uid, channel=channel). \
-                    values("addTime", "data")
-                if oc_qs.exists():
-                    endTime = int(oc_qs[0]["addTime"]) + 3500
-                    if endTime > now_time:
-                        print(endTime)
-                        print(now_time)
-                        res = json.loads(oc_qs[0]["data"])
-                        return JsonResponse(status=200, data=res)
+            # 亚马逊 s3 sts
+            sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
+                values("addTime", "data")
+            if sts_qs.exists():
+                endTime = int(sts_qs[0]["addTime"]) + 3500
+                if endTime > now_time:
+                    print(endTime)
+                    print(now_time)
+                    res = json.loads(sts_qs[0]["data"])
+                    return JsonResponse(status=200, data=res)
                 # 套餐id
-                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
-                bucket_name = ubqs[0]['bucket__bucket']
-                endpoint = ubqs[0]['bucket__endpoint']
-                access_key_id = OSS_STS_ACCESS_KEY
-                access_key_secret = OSS_STS_ACCESS_SECRET
-                region_id = ubqs[0]['bucket__region']
-                role_arn = OSS_ROLE_ARN
-                clt = client.AcsClient(access_key_id, access_key_secret, region_id)
-                req = AssumeRoleRequest.AssumeRoleRequest()
-                # 设置返回值格式为JSON。
-                req.set_accept_format('json')
-                req.set_RoleArn(role_arn)
-                req.set_RoleSessionName(uid + '_' + channel)
-                req.set_DurationSeconds(3600)
-                Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*". \
-                    format(bucket_name=bucket_name, uid_channel=storage)
-                print(Resource_access)
-                policys = {
-                    "Version": "1",
-                    "Statement": [
-                        {
-                            "Action": ["oss:PutObject", "oss:DeleteObject", ],
-                            "Resource": [Resource_access],
-                            "Effect": "Allow",
-                            "Condition": {
-                                "IpAddress": {"acs:SourceIp": ip}
-                                # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
-                                # "IpAddress": {"acs:SourceIp": "*"}
-                            }
-                        }
-                    ]
-                }
-                req.set_Policy(Policy=json.dumps(policys))
-                body = clt.do_action(req)
-                # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
-                token = json.loads(body.decode('utf-8'))
-                print(token)
-                res = {
-                    'AccessKeyId': token['Credentials']['AccessKeyId'],
-                    'AccessKeySecret': token['Credentials']['AccessKeySecret'],
-                    'SecurityToken': token['Credentials']['SecurityToken'],
-                    'Expiration': token['Credentials']['Expiration'],
-                    'expire': '3600',
-                    'endpoint': endpoint,
-                    'bucket_name': bucket_name,
-                    'arn': token['AssumedRoleUser']['Arn'],
-                    'code': 0,
-                    'storage': storage,
-                    'endTime': ubqs[0]['endTime'],
-                    'ip': ip}
-                if oc_qs.exists():
-                    oc_qs.update(data=json.dumps(res), addTime=now_time)
-                else:
-                    OssCrdModel.objects.create \
-                        (uid=uid, channel=channel, data=json.dumps(res), addTime=now_time)
-                return JsonResponse(status=200, data=res)
-            elif ubqs[0]["bucket__mold"] == 1:
-                # 亚马逊 s3 sts
-                sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
-                    values("addTime", "data")
-                if sts_qs.exists():
-                    endTime = int(sts_qs[0]["addTime"]) + 3500
-                    if endTime > now_time:
-                        print(endTime)
-                        print(now_time)
-                        res = json.loads(sts_qs[0]["data"])
-                        return JsonResponse(status=200, data=res)
-                    # 套餐id
-                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
-                bucket_name = ubqs[0]['bucket__bucket']
-                endpoint = ubqs[0]['bucket__endpoint']
-                region_id = ubqs[0]['bucket__region']
-
-                ###############
-                REGION_NAME = region_id
-                boto3_sts = boto3.client(
-                    'sts',
-                    aws_access_key_id='AKIA2E67UIMD45Y3HL53',
-                    aws_secret_access_key='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',
-                    region_name=REGION_NAME
-                )
-                print('--------2--test')
-                print(REGION_NAME)
-                Policy = {
-                    "Version": "2012-10-17",
-                    "Statement": [
-                        {
-                            "Effect": "Allow",
-                            "Action": "s3:*",
-                            "Resource": ["arn:aws:s3:::{bucket_name}/{uid_channel}*".
-                                             format(bucket_name=bucket_name, uid_channel=storage)]
-                        }
-                    ]
-                }
-                print(Policy)
-                response = boto3_sts.get_federation_token(
-                    Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
-                    Policy=json.dumps(Policy),
-                    DurationSeconds=7200
-                )
-                ###############
-                res = {
-                    'AccessKeyId': response['Credentials']['AccessKeyId'],
-                    'AccessKeySecret': response['Credentials']['SecretAccessKey'],
-                    'SessionToken': response['Credentials']['SessionToken'],
-                    'Expiration': response['Credentials']['Expiration'],
-                    'expire': '3600',
-                    'endpoint': endpoint,
-                    'bucket_name': bucket_name,
-                    'arn': response['FederatedUser']['Arn'],
-                    'code': 0,
-                    'storage': storage,
-                    'endTime': ubqs[0]['endTime'],
-                    'ip': ip,
-                }
-                if sts_qs.exists():
-                    sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
-                else:
-                    StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
-                                               addTime=now_time, type=1)
-                return JsonResponse(status=200, data=res)
-            else:
-                res = {'code': 404, 'msg': 'data not exists!'}
+            storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
+            bucket_name = ubqs[0]['bucket__bucket']
+            endpoint = ubqs[0]['bucket__endpoint']
+            region_id = ubqs[0]['bucket__region']
+
+            try:
+                aws_access_key_id = AWS_ACCESS_KEY_ID[ubqs[0]["bucket__mold"]]
+                aws_secret_access_key = AWS_SECRET_ACCESS_KEY[ubqs[0]["bucket__mold"]]
+                aws_arn = AWS_ARN[ubqs[0]["bucket__mold"]]
+            except:
+                res = {'code': 404, 'msg': 'mold not exists!'}
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
+
+            ###############
+            boto3_sts = boto3.client(
+                'sts',
+                aws_access_key_id=aws_access_key_id,
+                aws_secret_access_key=aws_secret_access_key,
+                region_name=region_id
+            )
+            Policy = {
+                "Version": "2012-10-17",
+                "Statement": [
+                    {
+                        "Effect": "Allow",
+                        "Action": "s3:*",
+                        "Resource": ["{aws_arn}:::{bucket_name}/{uid_channel}*".
+                                         format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
+                    }
+                ]
+            }
+            response = boto3_sts.get_federation_token(
+                Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
+                Policy=json.dumps(Policy),
+                DurationSeconds=7200
+            )
+            ##############
+            res = {
+                'AccessKeyId': response['Credentials']['AccessKeyId'],
+                'AccessKeySecret': response['Credentials']['SecretAccessKey'],
+                'SessionToken': response['Credentials']['SessionToken'],
+                'Expiration': response['Credentials']['Expiration'],
+                'expire': '3600',
+                'endpoint': endpoint,
+                'bucket_name': bucket_name,
+                'arn': response['FederatedUser']['Arn'],
+                'code': 0,
+                'storage': storage,
+                'endTime': ubqs[0]['endTime'],
+                'ip': ip,
+            }
+            if sts_qs.exists():
+                sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
+            else:
+                StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
+                                           addTime=now_time, type=1)
+            return JsonResponse(status=200, data=res)
+            # else:
+            #     res = {'code': 404, 'msg': 'data not exists!'}
+            #     return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
         res = {'code': 405, 'msg': 'Not purchased or expired!'}
         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
 
@@ -481,19 +426,17 @@ class CloudStorageView(View):
         if dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(10034)
         now_time = int(time.time())
-        bv_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).order_by('addTime')
+        bv_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).values('bucket_id').order_by('addTime')
         if not bv_qs.exists():
             return response.json(10030)
         vh_qs = VodHlsModel.objects.filter \
-            (uid=uid, channel=channel, time__range=(startTime, endTime), endTime__gte=now_time). \
+            (uid=uid, channel=channel, endTime__gte=now_time,time__range=(startTime, endTime), bucket_id=bv_qs[0]['bucket_id']). \
             values("id", "time", "sec", "bucket__bucket", "fg", "bucket__endpoint", "bucket__region", "bucket__mold")
         vod_play_list = []
-
         if not vh_qs.exists():
             return response.json(0, vod_play_list)
-
-        aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-        aws_secret_access_key = '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'
+        aws_access_key_id = AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]]
+        aws_secret_access_key = AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]]
         session = Session(
             aws_access_key_id=aws_access_key_id,
             aws_secret_access_key=aws_secret_access_key,
@@ -505,57 +448,29 @@ class CloudStorageView(View):
             bucket__mold = vod["bucket__mold"]
             bucket_name = vod["bucket__bucket"]
             endpoint = vod["bucket__endpoint"]
-            # bucket__region = vod["bucket__region"]
-            if bucket__mold == 0:
-                auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
-                bucket = oss2.Bucket(auth, endpoint, bucket_name)
-                m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
-                urllst = url.split('?')
-                url_start = urllib.parse.unquote(urllst[0])
-                url_end = urllst[1]
-                vod_play_url = '{url_start}?{url_end}'. \
-                    format(url_start=url_start, url_end=url_end)
-                thumb = bucket.sign_url('GET', ts, 3600,
-                                        params={'x-oss-process': 'video/snapshot,t_10000,m_fast,w_300'})
-                vod_play_list.append({'name': vod['time'], 'sign_url': vod_play_url,
-                                      'thumb': thumb, 'sec': vod['sec'], 'vod_id': vod['id']})
-            elif bucket__mold == 1:
-
-                # aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-                # aws_secret_access_key = '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'
-                # session = Session(
-                #     aws_access_key_id=aws_access_key_id,
-                #     aws_secret_access_key=aws_secret_access_key,
-                #     region_name=bucket__region
-                # )
-                # conn = session.client('s3')
-
-                thumbspng = '{uid}/vod{channel}/{time}/Thumb.jpeg'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                response_url = conn.generate_presigned_url(
-                    'get_object',
-                    Params={
-                        'Bucket': bucket_name,
-                        'Key': thumbspng
-                    },
-                    ExpiresIn=3600
-                )
-                vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
-                          'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
-                    format(server_domain=SERVER_DOMAIN, uid=uid, channel=channel, time=vod['time'])
-                ts_num = int(vod['fg']) & 0xf
-                vod_play_list.append({
-                    'name': vod['time'],
-                    'sign_url': vod_url,
-                    'thumb': response_url,
-                    'sec': vod['sec'],
-                    'ts_num': ts_num,
-                    'vod_id': vod['id']
-                }),
+            bucket__region = vod["bucket__region"]
+            thumbspng = '{uid}/vod{channel}/{time}/Thumb.jpeg'. \
+                format(uid=uid, channel=channel, time=vod['time'])
+            response_url = conn.generate_presigned_url(
+                'get_object',
+                Params={
+                    'Bucket': bucket_name,
+                    'Key': thumbspng
+                },
+                ExpiresIn=3600
+            )
+            vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
+                      'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
+                format(server_domain=SERVER_DOMAIN, uid=uid, channel=channel, time=vod['time'])
+            ts_num = int(vod['fg']) & 0xf
+            vod_play_list.append({
+                'name': vod['time'],
+                'sign_url': vod_url,
+                'thumb': response_url,
+                'sec': vod['sec'],
+                'ts_num': ts_num,
+                'vod_id': vod['id']
+            }),
         return response.json(0, vod_play_list)
 
     def do_store_playlist(self, request_dict, response):
@@ -585,44 +500,25 @@ class CloudStorageView(View):
             bucket_id = ub_qs_data['bucket__id']
             end_time = int(storeTime) + store_day * 86400
             if ub_qs_data['status'] == 1:
-                if ub_qs_data["bucket__mold"] == 0:
-                    oss_crd_qs = OssCrdModel.objects.filter(uid=UID, channel=channel)
-                    if oss_crd_qs.exists():
-                        VodHlsModel.objects.create(
-                            uid=UID,
-                            channel=channel,
-                            time=storeTime,
-                            endTime=end_time,
-                            bucket_id=bucket_id,
-                            sec=sec,
-                        )
-                        res = {'code': 0, 'msg': '存储成功'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                    else:
-                        res = {'code': 404, 'msg': '设备未购买'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                elif ub_qs_data['bucket__mold'] == 1:
-                    sts_qs = StsCrdModel.objects.filter(uid=UID, channel=channel, type=1). \
-                        values("addTime", "data")
-                    if sts_qs.exists():
-                        VodHlsModel.objects.create(
-                            uid=UID,
-                            channel=channel,
-                            time=storeTime,
-                            endTime=end_time,
-                            bucket_id=bucket_id,
-                            fg=fg,
-                            sec=sec,
-                        )
-                        res = {'code': 0, 'msg': '存储成功'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                    else:
-                        res = {'code': 404, 'msg': '设备未购买'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
+                sts_qs = StsCrdModel.objects.filter(uid=UID, channel=channel, type=1). \
+                    values("addTime", "data")
+                if sts_qs.exists():
+                    VodHlsModel.objects.create(
+                        uid=UID,
+                        channel=channel,
+                        time=storeTime,
+                        endTime=end_time,
+                        bucket_id=bucket_id,
+                        fg=fg,
+                        sec=sec,
+                    )
+                    res = {'code': 0, 'msg': '存储成功'}
+                    return HttpResponse(json.dumps(res, ensure_ascii=False),
+                                        content_type="application/json,charset=utf-8")
+                else:
+                    res = {'code': 404, 'msg': '设备未购买'}
+                    return HttpResponse(json.dumps(res, ensure_ascii=False),
+                                        content_type="application/json,charset=utf-8")
             else:
                 res = {'code': 404, 'msg': '设备未开启'}
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
@@ -830,8 +726,11 @@ class CloudStorageView(View):
         response = ResponseObject()
         data = request.POST.dict()
         logger = logging.getLogger('log')
-        try:
 
+        try:
+            passback_params = data["passback_params"]
+            parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
+            lang = parmap["lang"]
             signature = data["sign"]
             data.pop('sign')
             orderID = data['out_trade_no']
@@ -890,6 +789,8 @@ class CloudStorageView(View):
                     dvq.update(**dvq_set_update_dict)
 
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+                sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
+                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
                 red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
                 return HttpResponseRedirect(red_url)
             return response.json(0, signature)
@@ -903,6 +804,7 @@ class CloudStorageView(View):
         paymentId = request_dict.get('paymentId', None)
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
+        lang = request_dict.get('lang', None)
 
         try:
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
@@ -963,6 +865,8 @@ class CloudStorageView(View):
                 }
                 dvq.update(**dvq_set_update_dict)
             order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+            sys_msg_text_list = ['成功购买云存','Successful purchase of cloud storage']
+            self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
 
             # return response.json(0)
             red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
@@ -983,6 +887,9 @@ class CloudStorageView(View):
             pay = WechatPayObject()
             data = pay.weixinpay_call_back(request.body)
 
+            attach = data["attach"]
+            parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
+            lang = parmap["lang"]
             trade_status = data['result_code']  # 业务结果  SUCCESS/FAIL
             out_trade_no = data['out_trade_no']  # 商户订单号
             order_qs = Order_Model.objects.filter(orderID=out_trade_no, status=0)
@@ -1036,6 +943,8 @@ class CloudStorageView(View):
                     }
                     dvq.update(**dvq_set_update_dict)
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+                sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
+                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
                 return HttpResponse(pay.xml_to_dict({'return_code': 'SUCCESS', 'return_msg': 'OK'}))
 
             else:
@@ -1054,6 +963,7 @@ class CloudStorageView(View):
         pay_type = int(request_dict.get('pay_type', None))
         rank = request_dict.get('rank', None)
         is_select_discount = request_dict.get('is_select_discount', 0)
+        lang = request_dict.get('lang', 0)
         if not uid or not channel or not pay_type or not rank:
             return response.json(444)
         dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1).values(
@@ -1099,10 +1009,10 @@ class CloudStorageView(View):
 
         orderID = CommonService.createOrderID()
         if pay_type == 1:
-            call_sub_url = "{SERVER_DOMAIN}cloudstorage/dopaypalcallback?orderID={orderID}". \
-                format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
-            #call_sub_url = "http://binbin.uicp.vip/cloudstorage/dopaypalcallback?orderID={orderID}".format(
-                 #SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
+            call_sub_url = "{SERVER_DOMAIN}cloudstorage/dopaypalcallback?orderID={orderID}&lang={lang}". \
+                format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID, lang=lang)
+            # call_sub_url = "http://binbin.uicp.vip/cloudstorage/dopaypalcallback?orderID={orderID}".format(
+            # SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
             call_clc_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             paypalrestsdk.configure(PAYPAL_CRD)
             payment = paypalrestsdk.Payment({
@@ -1110,6 +1020,8 @@ class CloudStorageView(View):
                 "payer": {"payment_method": "paypal"},
                 "redirect_urls": {"return_url": call_sub_url, "cancel_url": call_clc_url},
                 "transactions": [{
+                    "item_list": {"items": [
+                        {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
                     "amount": {"total": price, "currency": currency},
                     "description": content}]})
             if payment.create():
@@ -1151,10 +1063,12 @@ class CloudStorageView(View):
                     notify_url="{SERVER_DOMAIN_SSL}cloudstorage/doalicallback".format(
                         SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
                     quit_url="{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN),
+                    passback_params=quote("lang="+lang)
                     # return_url="http://192.168.136.40/cloudstorage/payOK",
                     # notify_url="http://192.168.136.40/cloudstorage/aliPayCallback"
                 )
 
+
             except Exception as e:
                 print(repr(e))
                 return response.json(10, repr(e))
@@ -1169,6 +1083,7 @@ class CloudStorageView(View):
                                                pay_url=redirectUrl, isSelectDiscounts=is_select_discount,
                                                commodity_code=commodity_code, commodity_type=commodity_type,
                                                rank_id=rank)
+
                     return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
                                                           'result': {"redirectUrl": redirectUrl, "orderID": orderID},
                                                           'error_code': 0})
@@ -1182,14 +1097,13 @@ class CloudStorageView(View):
             # 获取参数
             response = ResponseObject()
 
-            parameter_dict = pay.get_parameter(orderID, content, float(price) * 100, ip, notify_url)
+            parameter_dict = pay.get_parameter(orderID, content, float(price) * 100, ip, notify_url, quote("lang="+lang))
             print('parameter_dict', parameter_dict)
             # parameter_dict 参数中获取MWEB_URL 调转页面在路径后面添加redirect_url
             # 统一调用接口
             response = pay.re_finall(orderid=orderID)
             if not response:
                 return response.json(10, '生成订单错误.')
-
             # 回调函数
             Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
                                        desc=content, payType=pay_type, payTime=nowTime,
@@ -1214,9 +1128,9 @@ class CloudStorageView(View):
         if cdk != None and pay_type == 11:
             cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id', 'rank__commodity_code')
             if not cdk_qs.exists():
-                return response.json(10, '无效激活码')
+                return response.json(10040)
             if cdk_qs[0]['is_activate'] == 1:
-                return response.json(10, '激活码已被使用过')
+                return response.json(10039)
             rank = cdk_qs[0]['rank__id']
             commodity_code = cdk_qs[0]['rank__commodity_code']
 
@@ -1368,23 +1282,221 @@ class CloudStorageView(View):
         if switch_commodity_id:
             # 切换设备套餐关联
             using_uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=int(time.time())).values("id", "uid",
-                                                                                                        "endTime",
-                                                                                                        "bucket__content").order_by(
-                'addTime')
-
+                                                                                                        "endTime","bucket__content","addTime").order_by('addTime')
             if not using_uid_bucket.exists():
                 return response.json(10030)
-
-            if int(using_uid_bucket[0]['id']) == int(switch_commodity_id):
+            useing_uid_bucket_id = using_uid_bucket[0]['id']
+            useing_uid_bucket_addTime = using_uid_bucket[0]['addTime']
+            if int(useing_uid_bucket_id) == int(switch_commodity_id):
                 return response.json(10032)
 
-            # UID_Bucket.objects.filter(id=switch_commodity_id).update(is_use=1)  #更新转移的云存套餐为使用中
-            UID_Bucket.objects.filter(id=using_uid_bucket[0]['id']).delete()  # 删除原来使用中的云存套餐
+            UID_Bucket.objects.filter(id=switch_commodity_id).update(addTime=useing_uid_bucket_addTime)#更新转移的云存套餐为使用中
+            UID_Bucket.objects.filter(id=useing_uid_bucket_id).delete()  # 删除原来使用中的云存套餐
             VodHlsModel.objects.filter(uid=uid).delete()  # 删除播放列表
             StsCrdModel.objects.filter(uid=uid).delete()  # 删除sts记录
             return response.json(0)
         return response.json(444)
 
+    # 云存操作系统消息
+    def do_vod_msg_Notice(self, uid, channel, userID, lang, sys_msg_text_list):
+        try:
+            logger = logging.getLogger('log')
+            logger.info('进来了')
+            # user = Device_User.objects.get(userID = userID)
+            # lang = user.language;
+            if lang == 'cn':
+                sys_msg_text = sys_msg_text_list[0]
+            else:
+                sys_msg_text = sys_msg_text_list[1]
+            nowTime = int(time.time())
+            create_data = {'userID_id': userID, 'msg': sys_msg_text, 'addTime': nowTime,
+                           'updTime': nowTime, 'uid': uid, 'eventType': 0}
+            SysMsgModel.objects.create(**create_data)
+            self.pushApp(nowTime, uid, channel, sys_msg_text)
+
+            logger.info('出去了')
+        except Exception as e:
+            return repr(e)
+    # 云存到期续费提醒   提前1天
+    def do_vod_msg_end(self):
+        response = ResponseObject()
+        now_time = int(time.time())
+
+        list = UID_Bucket.objects.filter(Q(endTime__lte=(now_time - 3600 * 24)) & Q(endTime__gt=now_time)).values('id',
+                                                                                                                  'uid',
+                                                                                                                  'bucket__area','channel')
+
+        uq_list = []
+        ids = []
+        for ub in list:
+            ids.append(ub['id'])
+
+        oqlist = Order_Model.objects.filter(uid_bucket_id__in=ids).values('userID_id', 'uid_bucket_id')
+
+        for ub in list:
+            for oo in oqlist:
+                if ub['id'] == oo['uid_bucket_id']:
+                    if ub['bucket__area'] == 'cn':
+                        sys_msg_text = "云存即将过期,请您注意!"
+                    else:
+                        sys_msg_text = "Cloud storage is about to expire, please pay attention!"
+                    uq_list.append(SysMsgModel(
+                        userID_id=oo['userID_id'],
+                        addTime=now_time,
+                        updTime=now_time,
+                        uid=ub['uid'],
+                        eventType=0,
+                        msg=sys_msg_text,
+                        status=0
+                    ))
+                    self.pushApp(now_time, ub['uid'], ub['channel'], sys_msg_text)
+
+        SysMsgModel.objects.bulk_create(uq_list)
+
+
+        return response.json(0)
+
+    def pushApp(self, nowTime, uid, channel, sys_msg_text):
+        n_time = nowTime
+
+        kwag_args = {
+            'uid': uid,
+            'channel': channel,
+            'event_type': 0,
+            'n_time': n_time
+        }
+
+        # 从数据库查询出来
+        uid_push_qs = UidPushModel.objects.filter(uid_set__uid=uid, uid_set__detect_status=1). \
+            values('token_val', 'app_type', 'appBundleId', 'm_code',
+                   'push_type', 'userID_id', 'userID__NickName',
+                   'lang', 'm_code', 'tz', 'uid_set__nickname', 'uid_set__detect_interval', 'uid_set__detect_group',
+                   'uid_set__channel')
+        print(uid_push_qs)
+        # 新建一个list接收数据
+        redis_list = []
+        # 把数据库数据追加进redis_list
+        for qs in uid_push_qs:
+            redis_list.append(qs)
+
+        nickname = redis_list[0]['uid_set__nickname']
+
+        for up in redis_list:
+            push_type = up['push_type']
+            appBundleId = up['appBundleId']
+            token_val = up['token_val']
+            lang = up['lang']
+            tz = up['tz']
+            if tz is None or tz == '':
+                tz = 0
+
+            package_title_config = {
+                'com.ansjer.customizedd_a': 'DVS',
+                'com.ansjer.zccloud_a': 'ZosiSmart',
+                'com.ansjer.zccloud_ab': '周视',
+                'com.ansjer.adcloud_a': 'ADCloud',
+                'com.ansjer.adcloud_ab': 'ADCloud',
+                'com.ansjer.accloud_a': 'ACCloud',
+                'com.ansjer.loocamccloud_a': 'Loocam',
+                'com.ansjer.loocamdcloud_a': 'Anlapus',
+                'com.ansjer.customizedb_a': 'COCOONHD',
+                'com.ansjer.customizeda_a': 'Guardian365',
+                'com.ansjer.customizedc_a': 'PatrolSecure',
+            }
+            if appBundleId in package_title_config.keys():
+                msg_title = package_title_config[appBundleId] + '(' + nickname + ')'
+            else:
+                msg_title = nickname
+
+            # 发送内容
+            msg_text = sys_msg_text
+            kwag_args['appBundleId'] = appBundleId
+            kwag_args['token_val'] = token_val
+            kwag_args['msg_title'] = msg_title
+            kwag_args['msg_text'] = msg_text
+            push_server_status = 0
+            # 推送
+            if push_type == 0:  # ios apns
+
+                try:
+                    cli = apns2.APNSClient(mode=APNS_MODE,
+                                           client_cert=os.path.join(BASE_DIR,
+                                                                    APNS_CONFIG[appBundleId]['pem_path']))
+
+                    push_data = {"alert": "Motion ", "event_time": n_time, "event_type": 0, "msg": "",
+                                 "received_at": n_time, "sound": "sound.aif", "uid": uid, "zpush": "1",
+                                 "channel": channel}
+                    alert = apns2.PayloadAlert(body=msg_text, title=msg_title)
+                    payload = apns2.Payload(alert=alert, custom=push_data)
+
+                    # return uid, channel, appBundleId, str(token_val), event_type, n_time, msg_title,msg_text
+                    n = apns2.Notification(payload=payload, priority=apns2.PRIORITY_LOW)
+                    res = cli.push(n=n, device_token=token_val, topic=appBundleId)
+                    print(res.status_code)
+                    if res.status_code == 200:
+                        return res.status_code
+                    else:
+                        print('apns push fail')
+                        print(res.reason)
+                        return res.status_code
+                except (ValueError, ArithmeticError):
+                    return 'The program has a numeric format exception, one of the arithmetic exceptions'
+                except Exception as e:
+                    print(repr(e))
+                    return repr(e)
+
+            elif push_type == 1:  # android gcm
+                try:
+                    FCM_CONFIG = {
+                        'com.ansjer.zccloud_a': 'AAAAb9YP3rk:APA91bHu8u-CTpcd0g6lKPo0WNVqCi8jZub1cPPbSAY9AucT1HxlF65ZDUko9iG8q2ch17bwu9YWHpK1xI1gHSRXCslLvZlXEmHZC0AG3JKg15XuUvlFKACIajUFV-pOeGRT8tM6-31I',
+                        'com.ansjer.loocamccloud_a': 'AAAAb9YP3rk:APA91bFCgd-kbVmpK4EVpfdHH_PJZQCYTkOGnTZdIuBWEz2r7aMRsJYHOH3sB-rwcbaRWgnufTyjX9nGQxb6KxQbWVk4ah_H-M3IqGh6Mb60WQQAuR33V6g_Jes5pGL6ViuIxGHqVMaR',
+                        'com.ansjer.loocamdcloud_a': 'AAAAb9YP3rk:APA91bGw2I2KMD4i-5T7nZO_wB8kuAOuqgyqe5rxmY-W5qkpYEx9IL2IfmC_qf6B_xOyjIDDSjckvMo-RauN__SEoxvAkis7042GRkoKpw7cjZ_H8lC-d50PC0GclPzccrOGFusyKbFY',
+                        'com.ansjer.customizedb_a': 'AAAAb9YP3rk:APA91bE7kI4vcm-9h_CJNFlOZfc-xwP4Btn6AnjOrwoKV6fgYN7fdarkO76sYxVZiAbDnxsFfOJyP7vQfwyan6mdjuyD5iHdt_XgO22VqniC0vA1V4GJiCS8Tp7LxIX8JVKZl9I_Powt',
+                        'com.ansjer.customizeda_a': 'AAAAb9YP3rk:APA91bF0HzizVWDc6dKzobY9fsaKDK4veqkOZehDXshVXs8pEEvNWjR_YWbhP60wsRYCHCal8fWN5cECVOWNMMzDsfU88Ty2AUl8S5FtZsmeDTkoGntQOswBr8Ln7Fm_LAp1VqTf9CpM',
+                        'com.ansjer.customizedd_a': 'AAAAb9YP3rk:APA91bHkxOozJWBrlv3eNT0PgwosYENI9aM4Zuzd418cX-iKkpa1zFNC5MkNDKApx1KH4fhmAfaJ6IMRZ0nj5GIxCpstDYCaZWwgC7-etqfSxG5JAq8LOwJx0o_1tUZqwjIic8ztsg0o',
+                        'com.ansjer.adcloud_a': 'AAAAb9YP3rk:APA91bFm06w8b9OKQ0gz0iaWFuRqRIkvgAz6z7Gp3dBU_X-LNGJQd1hc1QR2W7QzBglF8SHtERA45a2lbdLRa5qv7hxfd6W_sJLBK7dA8jklsOQBvy505oUzTwMKWy4TwH-exps9KrhO',
+                        'com.ansjer.accloud_a': 'AAAAb9YP3rk:APA91bFm06w8b9OKQ0gz0iaWFuRqRIkvgAz6z7Gp3dBU_X-LNGJQd1hc1QR2W7QzBglF8SHtERA45a2lbdLRa5qv7hxfd6W_sJLBK7dA8jklsOQBvy505oUzTwMKWy4TwH-exps9KrhO',
+                        'com.ansjer.zccloud_ab': 'AAAAb9YP3rk:APA91bHu8u-CTpcd0g6lKPo0WNVqCi8jZub1cPPbSAY9AucT1HxlF65ZDUko9iG8q2ch17bwu9YWHpK1xI1gHSRXCslLvZlXEmHZC0AG3JKg15XuUvlFKACIajUFV-pOeGRT8tM6-31I',
+                    }
+                    serverKey = FCM_CONFIG[appBundleId]
+                except Exception as e:
+                    return 'serverKey abnormal'
+                push_service = FCMNotification(api_key=serverKey)
+                data = {"alert": "Motion ", "event_time": n_time, "event_type": 0, "msg": "",
+                        "received_at": n_time, "sound": "sound.aif", "uid": uid, "zpush": "1", "channel": channel}
+                result = push_service.notify_single_device(registration_id=token_val, message_title=msg_title,
+                                                           message_body=msg_text, data_message=data,
+                                                           extra_kwargs={
+                                                               'default_vibrate_timings': True,
+                                                               'default_sound': True,
+                                                               'default_light_settings': True
+                                                           })
+                print('fcm push ing')
+                print(result)
+                return result
+            elif push_type == 2:  # android jpush
+                print('do_jpush')
+                app_key = JPUSH_CONFIG[appBundleId]['Key']
+                master_secret = JPUSH_CONFIG[appBundleId]['Secret']
+                # 此处换成各自的app_key和master_secre
+                _jpush = jpush.JPush(app_key, master_secret)
+                push = _jpush.create_push()
+                # if you set the logging level to "DEBUG",it will show the debug logging.
+                # _jpush.set_logging("DEBUG")
+                # push.audience = jpush.all_
+                push.audience = jpush.registration_id(token_val)
+                push_data = {"alert": "Motion ", "event_time": n_time, "event_type": 0, "msg": "",
+                             "received_at": n_time, "sound": "sound.aif", "uid": uid, "zpush": "1", "channel": channel}
+                android = jpush.android(alert=msg_text, priority=1, style=1, alert_type=7,
+                                        big_text=msg_text, title=msg_title,
+                                        extras=push_data)
+                push.notification = jpush.notification(android=android)
+                push.platform = jpush.all_
+                res = push.send()
+                print(res)
+                return res.status_code
+
+
 
 # 删除过期云存播放列表
 def deleteVodHls(request):
@@ -1423,4 +1535,4 @@ def deleteExpiredUidBucket(request):
     expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
     id_list = expired_uid_bucket.values_list("id", flat=True)
     UID_Bucket.objects.filter(id__in=list(id_list)).delete()  # 删除过期云存关联套餐, 后续是否考虑用软删除
-    return response.json(0)
+    return response.json(0)

+ 6 - 4
Controller/CloudTest.py

@@ -80,8 +80,10 @@ class cloudTestView(View):
             vodPrimaryMaster = newUserName
 
             with transaction.atomic():
-                # 更新设备信息
-                old_deviceInfo_qs.update(userID=newUserID, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
+                # 更新旧设备userID
+                old_deviceInfo_qs.update(userID=newUserID)
+                # 更新所有设备主用户信息
+                Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                 VodHlsModel.objects.filter(uid=uid).delete()
         except Exception as e:
             # print(e)
@@ -134,8 +136,8 @@ class cloudTestView(View):
                 return response.json(10014)
 
             with transaction.atomic():
-                # 更新设备主用户信息
-                new_deviceInfo_qs.update(vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
+                # 更新所有设备主用户信息
+                Device_Info.objects.filter(UID=new_uid).update(vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                 # vod_uid_bucket表更新uid
                 old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
                 UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(uid=new_uid)

+ 63 - 126
Controller/Cloudsum.py

@@ -1,37 +1,34 @@
-from Model.models import Order_Model, UID_Bucket, UserExModel, App_Info, Device_User
+from Model.models import Order_Model,UID_Bucket,UserExModel,App_Info
 from django.http import JsonResponse
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from django.views import View
+from Service.ModelService import Device_User,ModelService
+from django.db.models import Count, Sum
 
-from django.utils.decorators import method_decorator
-from django.views.generic import TemplateView
-from django.views.decorators.csrf import csrf_exempt
-from Service.ModelService import ModelService
-class Cloudsum(TemplateView):
-    @method_decorator(csrf_exempt)
-    def dispatch(self, *args, **kwargs):
-        return super(Cloudsum, self).dispatch(*args, **kwargs)
+class Cloudsum(View):
+    def dispatch(self, requset, *args, **kwargs):
+        return super(Cloudsum, self).dispatch(requset, *args, **kwargs)
 
     def get(self, request, *args, **kwargs):
+        operation = kwargs.get('operation')
         request.encoding = 'utf-8'
-        return self.validation(request_dict=request.GET)
+        return self.validation(request.GET, request, operation)
 
     def post(self, request, *args, **kwargs):
+        operation = kwargs.get('operation')
         request.encoding = 'utf-8'
-        return self.validation(request_dict=request.POST)
+        return self.validation(request.POST, request, operation)
 
-    def validation(self, request_dict, *args, **kwargs):
+    def validation(self, request_dict, request, operation):
         response = ResponseObject()
         token = request_dict.get('token', None)
         tko = TokenObject(token)
         response.lang = tko.lang
+        userID = tko.userID
+        print('userID:', userID)
         if tko.code != 0:
             return response.json(tko.code)
-        userID = tko.userID
-        operation = request_dict.get('operation', None)
-        print("userID",userID)
-        print('operation:', operation)
         if userID is None or operation is None:
             return response.json(444, 'operation')
         if operation == 'cloudservicesum':
@@ -39,140 +36,80 @@ class Cloudsum(TemplateView):
         if operation == 'userappversion':
             return self.userappversion(userID, response)
         if operation == 'usercount':
-            return self.usercount(userID, response)
+            return self.usercount(userID, request_dict, response)
+        if operation == 'usercloud':
+            return self.usercloud(userID, response)
 
     # 类型:用户手机
     # 统计用户手机型号  已有
-    # 统计某段时间内新用户的增长数
+    # 统计某段时间内新用户的增长数
     # 统计一天用户打开zosi app的频率   已有
     # 统计用户下载zosi app数,卸载人数
     # 统计用户使用zosi app的版本√
+
+    # 统计用户使用zosi app的版本以及使用zosi app不同版本的用户数量
     def userappversion(self, userID, response):
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        version = UserExModel.objects.values_list('appBundleId').order_by('appBundleId').distinct()
-        res = App_Info.objects.filter(appBundleId__in=version).values_list('appBundleId','newAppversion')
-        return response.json(0, dict(res))
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+        res = UserExModel.objects.extra(tables=['App_Info'],
+                                        select={'appname':'App_Info.appName',
+                                                'appversion':'App_Info.newAppversion'},
+                                        where=["user_ex.appBundleId=app_Info.appBundleId"]).\
+            values('appBundleId','appname','appversion').annotate(dates=Count('appBundleId')).order_by()
+        print(res.query)
+        print(res)
+        return response.json(0, list(res))
+
+    # 统计某段时间内新用户的增长数
+    def usercount(self, userID, request_dict, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        # 优化代码
+        # usercountyear = request_dict.get('usercountyear', None)
+        # if usercountyear == None:
+        #     return response.json(444)
+        # usercountyear = int(usercountyear)
+        # count = Device_User.objects.extra(select={'dates': "DATE_FORMAT(data_joined,'%%Y-%%m')"},
+        #                                   where=["data_joined between '%s-01-01' and '%s-01-01' "],
+        #                                   params=[usercountyear, usercountyear+1]).values(
+        #     'dates').annotate(用户合计=Count('data_joined')).order_by('dates')
+        count = Device_User.objects.extra(select={'dates': "DATE_FORMAT(data_joined,'%%Y-%%m')"},).values(
+            'dates').annotate(用户合计=Count('data_joined')).order_by('dates')
+        print(count.query)
+        return response.json(0, list(count))
 
     # 类型:云存服务统计
     # 统计开通云存的设备有多少台√
     # 统计未支付,支付成功的订单√
-    # 统计开通云存的增长率
+    # 统计开通云存的增长率    (每个月开通云存的总数)√
     # 统计已开通云存的各套餐总数√
     # 统计已支付的订单总金额√
     def cloudservicesum(self, userID, response):
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        from django.db.models import Sum
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
         uid_cloud = UID_Bucket.objects.values('uid').distinct().count()
-        pay_0 = Order_Model.objects.filter(status='0').count()
-        pay_1 = Order_Model.objects.filter(status='1').count()
-        money = Order_Model.objects.filter(status='1').aggregate(Sum('price'))
-        print(type(money))
-        print(money)
         cloud_sum = UID_Bucket.objects.all().count()
-        data_dict = {
-            "开通云存的设备数": uid_cloud,
-            "未支付的订单数": pay_0,
-            "已支付的订单数": pay_1,
-            "已支付的订单总金额": money['price__sum'],
-            "已开通云存的各套餐总数": cloud_sum,
-        }
-        return response.json(0, data_dict)
-
-    def usercount(self, userID, response):
-        from django.db.models import Count
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        count1 = Device_User.objects.extra(select={'year': 'year(data_joined)', 'month': 'month(data_joined)'}).values('year','month').annotate(用户合计=Count('data_joined')).order_by()
-        #print(count1)
-        return response.json(0, list(count1))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class Cloudsum_test(View):
-    def dispatch(self, requset, *args, **kwargs):
-        return super(Cloudsum_test, self).dispatch(requset, *args, **kwargs)
-
-    def get(self, request, *args, **kwargs):
-        operation = kwargs.get('operation')
-        request.encoding = 'utf-8'
-        return self.validation(request.GET, request, operation)
-
-    def post(self, request, *args, **kwargs):
-        operation = kwargs.get('operation')
-        print('operation:',operation)
-        request.encoding = 'utf-8'
-        return self.validation(request.POST, request, operation)
-
-    def validation(self, request_dict, request, operation):
-        response = ResponseObject()
-        token = request_dict.get('token', None)
-        tko = TokenObject(token)
-        response.lang = tko.lang
-        userID = tko.userID
-        print('userID:',userID)
-        if tko.code != 0:
-            return response.json(tko.code)
-        if userID is None or operation is None:
-            return response.json(444, 'operation')
-        if operation == 'cloudservicesum':
-            return self.cloudservicesum(userID, response)
-
-    def cloudservicesum(self, userID, response):
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        from django.db.models import Sum
-        uid_cloud = UID_Bucket.objects.values('uid').distinct().count()
         pay_0 = Order_Model.objects.filter(status='0').count()
         pay_1 = Order_Model.objects.filter(status='1').count()
         money = Order_Model.objects.filter(status='1').aggregate(Sum('price'))
-        cloud_sum = UID_Bucket.objects.all().count()
         data_dict = {
             "开通云存的设备数": uid_cloud,
-            "未支付的订单数": pay_0,
-            "已支付的订单数": pay_1,
-            "已支付的订单总金额": money['price__sum'],
             "已开通云存的各套餐总数": cloud_sum,
-        }
-        return response.json(0, data_dict)
-
-
-
-
-
-def test(request):
-        from django.db.models import Sum
-        pay_0 = Order_Model.objects.filter(status='0').count()
-        pay_1 = Order_Model.objects.filter(status='1').count()
-        money = Order_Model.objects.filter(status='1').aggregate(Sum('price'))
-        print(pay_0)
-        print(money['price__sum'])
-        data_dict = {
             "未支付的订单数": pay_0,
             "已支付的订单数": pay_1,
             "已支付的订单总金额": money['price__sum'],
         }
-        return JsonResponse(data_dict, json_dumps_params={'ensure_ascii':False},safe=False)
-
-
-
-
-
-
+        return response.json(0, data_dict)
 
+    # 每个月开通云存的总数
+    def usercloud(self, userID, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+        a = Order_Model.objects.extra(select={'dates': "FROM_UNIXTIME(addTime,'%%Y-%%m')"}).values(
+            'dates').filter(status=1).annotate(开通云存合计=Count('addTime')).order_by('dates')
+        return response.json(0, list(a))

+ 51 - 5
Controller/EquipmentManager.py

@@ -363,6 +363,8 @@ def addInterface(request):
     View_Password = request_dict.get('View_Password', '')
     Type = request_dict.get('Type', None)
     ChannelIndex = request_dict.get('ChannelIndex', None)
+    isCheckMainUser = request_dict.get('isCheckMainUser', None)
+    isMainUserExists = False
     if all([UID, NickName, View_Account, Type, ChannelIndex]):
         tko = TokenObject(token)
         response.lang = tko.lang
@@ -383,10 +385,10 @@ def addInterface(request):
                     asy.start()
                     return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
                 pass
-                # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
-                # # 判断是否有已绑定用户
-                # if is_bind:
-                #     return response.json(15)
+
+                pk = CommonService.getUserID(getUser=False)
+
+
 
                 userName = Device_User.objects.get(userID=userID).username
                 main_exist = Device_Info.objects.filter(UID=UID)
@@ -397,7 +399,47 @@ def addInterface(request):
                     vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
                     vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
 
-                pk = CommonService.getUserID(getUser=False)
+                is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID')
+                # 判断是否有已绑定用户
+                isvodPrimaryUserID = ''
+
+                for forbind in is_bind:
+                    if forbind['vodPrimaryUserID'] != '':
+                        isvodPrimaryUserID = forbind['vodPrimaryUserID']
+
+                # 判断是否有已绑定用户
+                if is_bind and isCheckMainUser == '1' and isvodPrimaryUserID != userID and isvodPrimaryUserID != '':
+                    res = {
+                        'id': pk,
+                        'userID': userID,
+                        'NickName': NickName,
+                        'UID': UID,
+                        'View_Account': View_Account,
+                        'View_Password': View_Password,
+                        'ChannelIndex': ChannelIndex,
+                        'Type': Type,
+                        'isShare': False,
+                        'primaryUserID': '',
+                        'primaryMaster': '',
+                        'vodPrimaryUserID': vodPrimaryUserID,
+                        'vodPrimaryMaster': vodPrimaryMaster,
+                        'data_joined': '',
+                        'version': '',
+                        'isVod': 0,
+                        'isExist': 1,
+                        'userID__userEmail': ''
+                    }
+                    res['vod'] = [
+                        {
+                            "status": 1,
+                            "channel": ChannelIndex,
+                            "endTime": '',
+                            "bucket__content": '',
+                            "uid": UID
+                        }
+                    ]
+                    res['isMainUserExists'] = 1
+                    return response.json(0, res)
 
                 try:
                     # 判断是否有用户绑定
@@ -420,6 +462,8 @@ def addInterface(request):
                                              NickName=NickName, View_Account=View_Account,
                                              View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                     userDevice.save()
+                    Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
+                                                               vodPrimaryMaster=vodPrimaryMaster)
                     # redisObj = RedisObject(db=8)
                     # redisObj.del_data(key='uid_qs_' + userID)
                 except Exception as e:
@@ -437,6 +481,8 @@ def addInterface(request):
                         values('bucket__content', 'status', 'channel', 'endTime', 'uid')
                     res = dvql[0]
                     res['vod'] = list(ubqs)
+                    if isMainUserExists:
+                        res['isMainUserExists'] = 1
                     return response.json(0, res)
 
 

+ 131 - 5
Controller/EquipmentManagerV2.py

@@ -8,7 +8,7 @@ from django.db.models import Q
 from django.views.generic.base import View
 
 from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
-from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel
+from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel, UidChannelSetModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -207,7 +207,133 @@ class EquipmentManagerV2(View):
 
     def do_query_reset(self, userID, request_dict, response):
         dvqs = Device_Info.objects.filter(userID_id=userID, isExist=2)
-        dvql = dvqs.values \
-            ('id', 'NickName', 'UID', 'ChannelIndex', 'Type', 'isShare')
-        res = CommonService.qs_to_list(dvql)
-        return response.json(0, res)
+        dvql = dvqs.values('id', 'userID', 'NickName', 'UID', 'View_Account',
+                           'View_Password', 'ChannelIndex', 'Type', 'isShare',
+                           'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID', 'vodPrimaryMaster',
+                           'userID__userEmail',
+                           'version', 'isVod', 'isExist', 'NotificationMode')
+        dvls = CommonService.qs_to_list(dvql)
+        uid_list = []
+        for dvl in dvls:
+            if dvl['primaryUserID'] and dvl['id'] == dvl['primaryUserID']:
+                dvl['isPrimaryUser'] = 1
+            else:
+                dvl['isPrimaryUser'] = 0
+
+            uid_list.append(dvl['UID'])
+
+        ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
+            values('bucket__content', 'status', 'channel', 'endTime', 'uid')
+        upqs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
+        auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+        bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
+        nowTime = int(time.time())
+        data = []
+        # 设备拓展信息表
+        us_qs = UidSetModel.objects.filter(uid__in=uid_list).values('id', 'uid', 'version', 'nickname', 'ucode',
+                                                                    'detect_status', 'detect_group',
+                                                                    'detect_interval',
+                                                                    'region_alexa', 'is_alexa', 'deviceModel',
+                                                                    'TimeZone', 'TimeStatus', 'SpaceUsable',
+                                                                    'SpaceSum', 'MirrorType', 'RecordType',
+                                                                    'OutdoorModel', 'WIFIName', 'isDetector',
+                                                                    'DetectorRank')
+        uv_dict = {}
+        for us in us_qs:
+            uv_dict[us['uid']] = {
+                'version': us['version'],
+                'nickname': us['nickname'],
+                'ucode': us['ucode'],
+                'detect_interval': us['detect_interval'],
+                'detect_group': us['detect_group'],
+                'detect_status': us['detect_status'],
+                'region_alexa': us['region_alexa'],
+                'is_alexa': us['is_alexa'],
+                'deviceModel': us['deviceModel'],
+                'TimeZone': us['TimeZone'],
+                'TimeStatus': us['TimeStatus'],
+                'SpaceUsable': us['SpaceUsable'],
+                'SpaceSum': us['SpaceSum'],
+                'MirrorType': us['MirrorType'],
+                'RecordType': us['RecordType'],
+                'OutdoorModel': us['OutdoorModel'],
+                'WIFIName': us['WIFIName'],
+                'isDetector': us['isDetector'],
+                'DetectorRank': us['DetectorRank']
+            }
+            # 从uid_channel里面取出通道配置信息
+            ucs_qs = UidChannelSetModel.objects.filter(uid__id=us['id']).values('channel', 'pir_audio', 'mic_audio',
+                                                                                'battery_status', 'battery_level',
+                                                                                'sleep_status', 'sleep_time',
+                                                                                'light_night_model',
+                                                                                'light_alarm_type',
+                                                                                'light_alarm_level',
+                                                                                'light_alarm_man_en',
+                                                                                'light_alarm_vol',
+                                                                                'light_long_light'
+                                                                                )
+            channels = []
+            for ucs in ucs_qs:
+                channels_dict = {
+                    'channel': ucs['channel'],
+                    'pir_audio': ucs['pir_audio'],
+                    'mic_audio': ucs['mic_audio'],
+                    'battery_status': ucs['battery_status'],
+                    'battery_level': ucs['battery_level'],
+                    'sleep_status': ucs['sleep_status'],
+                    'sleep_time': ucs['sleep_time'],
+                    'light_night_model': ucs['light_night_model'],
+                    'light_alarm_type': ucs['light_alarm_type'],
+                    'light_alarm_level': ucs['light_alarm_level'],
+                    'light_alarm_man_en': ucs['light_alarm_man_en'],
+                    'light_alarm_vol': ucs['light_alarm_vol'],
+                    'light_long_light': ucs['light_long_light']
+                }
+                channels.append(channels_dict)
+            uv_dict[us['uid']]['channels'] = channels
+
+        for p in dvls:
+            p['vod'] = []
+            for dm in ubqs:
+                if p['UID'] == dm['uid']:
+                    if dm['endTime'] > nowTime:
+                        p['vod'].append(dm)
+            p['preview'] = []
+            for up in upqs:
+                if p['UID'] == up['uid']:
+                    obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
+                    img_sign = bucket.sign_url('GET', obj, 300)
+                    p['preview'].append(img_sign)
+            p_uid = p['UID']
+            if p_uid in uv_dict:
+                # 设备版本号
+                p['uid_version'] = uv_dict[p_uid]['version']
+                p['ucode'] = uv_dict[p_uid]['ucode']
+                p['detect_interval'] = uv_dict[p_uid]['detect_interval']
+                p['detect_status'] = uv_dict[p_uid]['detect_status']
+                p['detect_group'] = uv_dict[p_uid]['detect_group']
+                p['region_alexa'] = uv_dict[p_uid]['region_alexa']
+                p['is_alexa'] = uv_dict[p_uid]['is_alexa']
+                p['deviceModel'] = uv_dict[p_uid]['deviceModel']
+                p['TimeZone'] = uv_dict[p_uid]['TimeZone']
+                p['TimeStatus'] = uv_dict[p_uid]['TimeStatus']
+                p['SpaceUsable'] = uv_dict[p_uid]['SpaceUsable']
+                p['SpaceSum'] = uv_dict[p_uid]['SpaceSum']
+                p['MirrorType'] = uv_dict[p_uid]['MirrorType']
+                p['RecordType'] = uv_dict[p_uid]['RecordType']
+                p['OutdoorModel'] = uv_dict[p_uid]['OutdoorModel']
+                p['WIFIName'] = uv_dict[p_uid]['WIFIName']
+                p['isDetector'] = uv_dict[p_uid]['isDetector']
+                p['DetectorRank'] = uv_dict[p_uid]['DetectorRank']
+                p['channels'] = uv_dict[p_uid]['channels']
+                # 设备昵称 调用影子信息昵称,先阶段不可
+                if uv_dict[p_uid]['nickname']:
+                    p['NickName'] = uv_dict[p_uid]['nickname']
+            else:
+                # 设备版本号
+                p['uid_version'] = ''
+                p['ucode'] = ''
+            data.append(p)
+        result = data
+
+        return response.json(0, result)

+ 59 - 10
Controller/EquipmentManagerV3.py

@@ -67,7 +67,8 @@ class EquipmentManagerV3(View):
         View_Password = self.decode_pwd(View_Password)
         Type = request_dict.get('Type', None)
         ChannelIndex = request_dict.get('ChannelIndex', None)
-
+        isCheckMainUser = request_dict.get('isCheckMainUser', None)
+        isMainUserExists = False
         if all([UID, NickName, View_Account, Type, ChannelIndex]):
             tko = TokenObject(token)
             response.lang = tko.lang
@@ -87,10 +88,11 @@ class EquipmentManagerV3(View):
                                                args=(CommonService.get_ip_address(request), userID, 'addV3'))
                         asy.start()
                         return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
-                    # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
-                    # # 判断是否有已绑定用户
-                    # if is_bind:
-                    #     return response.json(15)
+
+                    pk = CommonService.getUserID(getUser=False)
+
+
+
 
                     userName = Device_User.objects.get(userID=userID).username
                     main_exist = Device_Info.objects.filter(UID=UID)
@@ -101,7 +103,46 @@ class EquipmentManagerV3(View):
                         vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
                         vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
 
-                    pk = CommonService.getUserID(getUser=False)
+                    is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'vodPrimaryUserID')
+                    isvodPrimaryUserID = ''
+
+                    for forbind in is_bind:
+                        if forbind['vodPrimaryUserID'] != '':
+                            isvodPrimaryUserID = forbind['vodPrimaryUserID']
+
+                    # 判断是否有已绑定用户
+                    if is_bind and isCheckMainUser == '1' and isvodPrimaryUserID != userID and isvodPrimaryUserID != '':
+                        res = {
+                            'id': pk,
+                            'userID': userID,
+                            'NickName': NickName,
+                            'UID': UID,
+                            'View_Account': View_Account,
+                            'View_Password': View_Password,
+                            'ChannelIndex': ChannelIndex,
+                            'Type': Type,
+                            'isShare': False,
+                            'primaryUserID': '',
+                            'primaryMaster': '',
+                            'vodPrimaryUserID': vodPrimaryUserID,
+                            'vodPrimaryMaster': vodPrimaryMaster,
+                            'data_joined': '',
+                            'version': '',
+                            'isVod': 0,
+                            'isExist': 1,
+                            'userID__userEmail': ''
+                        }
+                        res['vod'] = [
+                            {
+                                "status": 1,
+                                "channel": ChannelIndex,
+                                "endTime": '',
+                                "bucket__content": '',
+                                "uid": UID
+                            }
+                        ]
+                        res['isMainUserExists'] = 1
+                        return response.json(0, res)
 
                     try:
                         # 判断是否有用户绑定
@@ -125,6 +166,8 @@ class EquipmentManagerV3(View):
                                                  View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
                                                  vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                         userDevice.save()
+                        Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
+                                                                       vodPrimaryMaster=vodPrimaryMaster)
 
                         if not us_qs.exists():
                             us_qs = UidSetModel.objects.filter(uid=UID)
@@ -152,6 +195,7 @@ class EquipmentManagerV3(View):
                             values('bucket__content', 'status', 'channel', 'endTime', 'uid')
                         res = dvql[0]
                         res['vod'] = list(ubqs)
+
                         return response.json(0, res)
 
                 else:
@@ -593,7 +637,12 @@ class EquipmentManagerV3(View):
         return password
 
     def do_mainUserDevice(self, request_dict, response):
-        vodPrimaryUserID = request_dict.get('vodPrimaryUserID')
-        qs = Device_User.objects.filter(userID=vodPrimaryUserID).values('NickName', 'username', 'userEmail', 'phone')
-        dvql = CommonService.qs_to_list(qs)
-        return response.json(0, dvql)
+        UID = request_dict.get('UID')
+        dvq = Device_Info.objects.filter(UID=UID)
+        dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
+        qs = {}
+        if dvq.exists():
+            qs = Device_User.objects.filter(userID=dvq[0]['vodPrimaryUserID']).values('userID', 'NickName', 'username', 'userEmail', 'phone')
+            qs = CommonService.qs_to_list(qs)
+
+        return response.json(0, qs)

+ 11 - 12
Controller/MealManage.py

@@ -127,9 +127,11 @@ class MealManage(View):
         line = int(request_dict.get('line', None))
         if page is None or line is None:
             return response.json(444)
+
         qs = Store_Meal.objects.values("id", "title", "price", "content", "day", "add_time", "update_time", "currency"
-                                       , "bucket_id", "bucket__bucket", "bucket__area", "commodity_type", "commodity_code",
-                                       "bucket__storeDay", "virtual_price", "is_discounts", "discount_price", "discount_content", "expire", "symbol")
+                                       , "bucket_id", "commodity_type", "commodity_code", "virtual_price", "is_discounts"
+                                       , "discount_price", "discount_content", "expire", "symbol"
+                                       , "bucket__bucket", "bucket__area", "bucket__storeDay")
         res = {}
         if qs.exists():
             ql = list(qs)
@@ -137,16 +139,13 @@ class MealManage(View):
             from itertools import groupby
             ql.sort(key=itemgetter('bucket__area'))
             ql=CommonService.qs_to_list(ql[(page - 1) * line:page * line])
-            for area, items in groupby(ql, key=itemgetter('bucket__area')):
-                items_list = list(items)
-                for key, val in enumerate(items_list):
-                    pay_types = Pay_Type.objects.filter(store_meal=items_list[key]['id']).values("id", "payment")
-                    items_list[key]['pay_type'] = list(pay_types)
-
-
-                res['count'] = len(ql)
-                res['data'] = items_list
-
+            # for area, items in groupby(ql, key=itemgetter('bucket__area')):
+            items_list = list(ql)
+            for key, val in enumerate(items_list):
+                pay_types = Pay_Type.objects.filter(store_meal=items_list[key]['id']).values("id", "payment")
+                items_list[key]['pay_type'] = list(pay_types)
+        res['count'] = len(ql)
+        res['data'] = items_list
         return response.json(0, res)
 
     def update(self, request_dict, userID, response):

+ 16 - 15
Controller/VoicePromptController.py

@@ -145,14 +145,18 @@ class VoicePromptView(View):
                 uid = voice_qs[0].uid
                 device_qs = Device_Info.objects.filter(UID=uid, userID=userID)
                 if device_qs.exists():
+                    channel = voice_qs[0].channel
+                    filename = voice_qs[0].filename
                     voice_qs.delete()
-                    # auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
-                    # bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
-                    # obj = 'voice_prompt/{uid}/{channel}/'.format(uid=uid, channel=voice_qs[0].channel) + voice_qs[0].filename
-                    # bucket.delete_object(obj)
+                    auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+                    bucket = oss2.Bucket(auth, 'http://oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
+                    obj = 'voice_prompt/{uid}/{channel}/'.format(uid=uid, channel=channel) + filename
+                    bucket.delete_object(obj)
                     return response.json(0)
                 else:
                     return response.json(404)
+            else:
+                return response.json(173)
         else:
             return response.json(444)
 
@@ -172,14 +176,16 @@ class VoicePromptView(View):
                 'voice_status': 0,
                 'voice_mute': 0
             }
+            enter_voice_id = 0
+            leave_voice_id = 0
             if channel_qs.exists():
                 channel_qs = channel_qs.values('voice_prompt_enter', 'voice_prompt_leave', 'voice_prompt_status',
                                                'voice_prompt_intelligent_mute', 'voice_start_x', 'voice_start_y',
                                                'voice_end_x', 'voice_end_y', 'voice_start_time', 'voice_end_time',
                                                'voice_repeat_day', 'voice_direction')
                 print(channel_qs)
-                res['enter_voice'] = int(channel_qs[0]['voice_prompt_enter'])
-                res['leave_voice'] = int(channel_qs[0]['voice_prompt_leave'])
+                enter_voice_id = int(channel_qs[0]['voice_prompt_enter'])
+                leave_voice_id = int(channel_qs[0]['voice_prompt_leave'])
                 res['voice_status'] = channel_qs[0]['voice_prompt_status']
                 res['voice_mute'] = channel_qs[0]['voice_prompt_intelligent_mute']
                 res['start_x'] = channel_qs[0]['voice_start_x']
@@ -210,12 +216,12 @@ class VoicePromptView(View):
                     del system['filename']
                     if system['type'] == 0:
                         enter_systems.append(system)
-                        if res['enter_voice'] == system['id']:
+                        if enter_voice_id == system['id']:
                             res['enter_voice'] = system
 
                     elif system['type'] == 1:
                         leave_systems.append(system)
-                        if res['leave_voice'] == system['id']:
+                        if leave_voice_id == system['id']:
                             res['leave_voice'] = system
 
             if voice_qs.exists():
@@ -229,18 +235,13 @@ class VoicePromptView(View):
                     del voice['filename']
                     if voice['type'] == 0:
                         enter_customs.append(voice)
-                        if res['enter_voice'] == voice['id']:
+                        if enter_voice_id == voice['id']:
                             res['enter_voice'] = voice
                     elif voice['type'] == 1:
                         leave_customs.append(voice)
-                        if res['leave_voice'] == voice['id']:
+                        if leave_voice_id == voice['id']:
                             res['leave_voice'] = voice
 
-            if res['leave_voice'] == 0:
-                res['leave_voice'] = {}
-            if res['enter_voice'] == 0:
-                res['enter_voice'] = {}
-
             res['system']['enter'] = enter_systems
             res['system']['leave'] = leave_systems
             res['custom']['enter'] = enter_customs

+ 4 - 4
Model/models.py

@@ -772,12 +772,12 @@ class UidChannelSetModel(models.Model):
     voice_prompt_leave = models.IntegerField(default=0, verbose_name='离开铃声id')
     voice_prompt_intelligent_mute = models.SmallIntegerField(default=0, verbose_name='智能静音。0:关闭,1:开启')
     voice_start_x = models.FloatField(default=0, verbose_name='起始坐标的x')
-    voice_start_y = models.FloatField(default=0, verbose_name='起始坐标的y')
-    voice_end_x = models.FloatField(default=0, verbose_name='结束坐标的x')
-    voice_end_y = models.FloatField(default=0, verbose_name='结束坐标的y')
+    voice_start_y = models.FloatField(default=18, verbose_name='起始坐标的y')
+    voice_end_x = models.FloatField(default=44, verbose_name='结束坐标的x')
+    voice_end_y = models.FloatField(default=18, verbose_name='结束坐标的y')
     voice_start_time = models.IntegerField(default=0, verbose_name='语音执行的起始时间')
     voice_end_time = models.IntegerField(default=0, verbose_name='语音执行的结束时间')
-    voice_repeat_day = models.IntegerField(default=0, verbose_name='语音执行的日期,周几')
+    voice_repeat_day = models.IntegerField(default=127, verbose_name='语音执行的日期,周几')
     voice_direction = models.IntegerField(default=0, verbose_name='语音方向。')
 
     class Meta:

+ 4 - 0
Object/ResponseObject.py

@@ -92,6 +92,8 @@ class ResponseObject(object):
             10036: 'Non device primary users cannot exchange for cloud storage',
             10037: 'Non device primary user cannot transfer device',
             10038: 'Non device primary user cannot transfer packages',
+            10039: 'Activation code has been used',
+            10040: 'Invalid activation code'
         }
         data_cn = {
             0: '成功',
@@ -178,6 +180,8 @@ class ResponseObject(object):
             10036: '非设备主用户无法兑换云存',
             10037: '非设备主用户无法转移设备',
             10038: '非设备主用户无法转移套餐',
+            10039: '激活码已被使用过',
+            10040: '无效激活码'
         }
         if self.lang == 'cn':
             msg = data_cn

+ 3 - 2
Object/WechatPayObject.py

@@ -23,7 +23,7 @@ class WechatPayObject:
         self.error = None
         self.params = None
 
-    def get_parameter(self, order_id, body, total_fee, spbill_create_ip, notify_url):
+    def get_parameter(self, order_id, body, total_fee, spbill_create_ip, notify_url, attach):
         self.params = {
             'appid': self.APPID,  # appid
             'mch_id': self.MCHID,  # 商户号
@@ -34,7 +34,8 @@ class WechatPayObject:
             'spbill_create_ip': spbill_create_ip,  # 127.0.0.1
             'trade_type': self.TRADE_TYPE,  # 交易类型
             'notify_url': notify_url,  # 微信支付结果异步通知地址
-            'receipt': 'Y'
+            'receipt': 'Y',
+            'attach' : attach
         }
         return self.params