| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 | #!/usr/bin/env python3  # -*- coding: utf-8 -*-  """@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.@AUTHOR: ASJRD018@NAME: AnsjerFormal@software: PyCharm@DATE: 2018/12/6 10:53@Version: python3.6@MODIFY DECORD:ansjer dev@file: OrderContrller.py@Contact: chanjunkai@163.com"""import timeimport paypalrestsdkfrom django.db.models import Ffrom django.utils.decorators import method_decoratorfrom django.views.decorators.csrf import csrf_exemptfrom django.views.generic.base import Viewfrom Ansjer.us_config.config_test import PAYPAL_CRDfrom Object.AliPayObject import AliPayObjectfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Model.models import Order_Model, Device_Infofrom Service.CommonService import CommonServicefrom Service.ModelService import ModelService'''# 获取所有设备下单信息http://192.168.136.40:8077/order/querylist?token=local&page=1&line=10'''# 设备信息添加class OrderView(View):    @method_decorator(csrf_exempt)    def dispatch(self, *args, **kwargs):        return super(OrderView, self).dispatch(*args, **kwargs)    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.GET, request, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.POST, request, operation)    def validation(self, request_dict, request, operation):        response = ResponseObject()        if operation is None:            return response.json(444, 'error path')        token = request_dict.get('token', None)        # 设备主键uid        tko = TokenObject(token)        response.lang = request_dict.get('language', 'en')        if tko.code != 0:            return response.json(tko.code)        userID = tko.userID        if operation == 'querylist':            return self.do_querylist(request_dict, userID, response)        elif operation == 'adminDelete':            return self.do_admin_delete(request_dict, userID, response)        elif operation == 'adminQuery':            return self.do_admin_query(request_dict, userID, response)        elif operation == 'detail':            return self.do_detail(request_dict, userID, response)        elif operation == 'queryByStatus':            return self.do_query_order_by_status(request_dict, userID, response)        elif operation == 'orderDetail':            return self.do_query_order_detail(request_dict, userID, response)        elif operation == 'cancel':            return self.do_cancel_order(request_dict, userID, response)        elif operation == 'delete':            return self.do_delete_order(request_dict, userID, response)        else:            return response.json(444, 'error path')    def do_detail(self, request_dict, userID, response):        orderID = request_dict.get('orderID', None)        om_qs = Order_Model.objects.filter(userID_id=userID, orderID=orderID).values('status')        if om_qs.exists():            return response.json(0, {'status': om_qs[0]['status']})        else:            return response.json(173)    def do_querylist(self, request_dict, userID, response):        page = request_dict.get('page', None)        line = request_dict.get('line', None)        uid = request_dict.get('uid', None)        lang = request_dict.get('lang', 'en')        if not page or not line:            return response.json(444, 'page,line')        page = int(page)        line = int(line)        omqs = Order_Model.objects.filter(userID_id=userID, status=1, rank__lang__lang=lang)        # 筛选指定设备id的订单        if uid:            omqs.filter(UID=uid)        if not omqs.exists():            return response.json(173)            # return response.json(10, '订单不存在')        count = omqs.count()        omqs = omqs.annotate(rank__title=F('rank__lang__title'), rank__content=F('rank__lang__content'))        order_ql = omqs[(page - 1) * line:page * line].values("orderID", "UID", "channel", "desc", "price", "currency",                                                              "addTime",                                                              "updTime", "paypal", "rank__day", "payType",                                                              "rank__price", "status",                                                              "rank__lang__content", "rank__title", "rank__currency",                                                              "rank_id","rank__expire")        order_list = list(order_ql)        data = []        nowTime = int(time.time())        # 这里需要进行优化        uid_list = []        for od in order_list:            uid_list.append(od['UID'])        didqs = Device_Info.objects.filter(userID_id=userID, UID__in=uid_list).values('id', 'UID', 'Type', 'serial_number')        for d in order_list:            if d['status'] == 0:                if d['addTime'] + 3600 < nowTime:                    d['status'] = 3            for did in didqs:                if d['UID'] == did['UID']:                    d['did'] = did['id']                    d['Type'] = did['Type']                    d['serialNumber'] = did['serial_number']                    data.append(d)            d['rank__content'] = d['rank__lang__content']            del d['rank__lang__content']            # d['rank__lang__content'] = '月' if lang == 'cn' else 'month'        return response.json(0, {'data': data, 'count': count})    # admins ^^^^^^^^^^^^    def do_admin_delete(self, request_dict, userID, response):        own_perm = ModelService.check_perm(userID, 20)        if own_perm is True:            orderID = request_dict.get('orderID')            Order_Model.objects.filter(orderID=orderID).delete()            return response.json(0)        else:            return response.json(404)    def do_admin_query(self, request_dict, userID, response):        own_perm = ModelService.check_perm(userID, 20)        if own_perm is True:            page = request_dict.get('page', None)            line = request_dict.get('line', None)            uid = request_dict.get('uid', None)            channel = request_dict.get('channel', None)            orderID = request_dict.get('orderID', None)            userID__username = request_dict.get('userID__username', None)            currency = request_dict.get('currency', None)            page = int(page)            line = int(line)            omqs = Order_Model.objects.all()            # 筛选指定设备id的订单            if uid:                omqs = omqs.filter(UID=uid)            if channel:                omqs = omqs.filter(channel=channel)            if orderID:                omqs = omqs.filter(orderID=orderID)            if userID__username:                omqs = omqs.filter(userID__username=userID__username)            if currency:                omqs = omqs.filter(currency=currency)            if not omqs.exists():                return response.json(0, [])            count = omqs.count()            order_ql = omqs[(page - 1) * line:page * line].values("orderID", "UID", "userID__username", "channel", "desc", "price",                                                                  "currency", "addTime", "updTime", "paypal",                                                                  "payType",                                                                  "rank__day",                                                                  "rank__price", "status")            order_list = list(order_ql)            return response.json(0, {'data': order_list, 'count': count})        else:            return response.json(404)    def do_query_order_by_status(self, request_dict, userID, response):        status = request_dict.get('status', None)        page = request_dict.get('page', None)        line = request_dict.get('line', None)        lang = request_dict.get('lang', 'en')        if status and page and line:            order_qs = None            status = int(status)            if status == -1: # 获取所有订单                order_qs = Order_Model.objects.filter(userID__userID=userID,rank__lang__lang=lang)            elif status == 0: # 获取【代付款】订单                order_qs = Order_Model.objects.filter(userID__userID=userID, status=0,rank__lang__lang=lang)            elif status == 1:                order_qs = Order_Model.objects.filter(userID__userID=userID, status=1,rank__lang__lang=lang)            if order_qs is None or not order_qs.exists():                return response.json(0, {'data': [], 'count': 0})            page = int(page)            line = int(line)            start = (page - 1) * line            end = status + line            count = order_qs.count()            order_qs = order_qs.annotate(rank__title=F('rank__lang__title'))            order_qs = order_qs[start:end].values("orderID", "UID", "channel", "desc", "price",                                                  "currency", "addTime", "payType", "rank__day", "rank__price",                                                  "status", 'channel', "rank__title", "currency")            return response.json(0, {'data': list(order_qs), 'count': count})        else:            return response.json(444)    def do_query_order_detail(self, request_dict, userID, response):        orderID = request_dict.get('orderID', None)        lang = request_dict.get('lang', 'en')        if orderID:            order_qs = Order_Model.objects.filter(orderID=orderID, userID__userID=userID, rank__lang__lang=lang)            if order_qs.exists():                print(order_qs)                order_qs = order_qs.annotate(rank__title=F('rank__lang__title'))                order = order_qs.values("orderID", "UID", "channel", "desc", "price",                                        "currency", "addTime", "endTime", "payType",                                        "rank__day", "rank__price", "status", 'channel', "rank__title", "currency")[0]                return response.json(0, {'data': order})            else:                return response.json(173)        else:            return response.json(444)    def do_cancel_order(self, request_dict, userID, response):        orderID = request_dict.get('orderID', None)        lang = request_dict.get('lang', 'en')        if orderID is None:            return response.json(444)        order_qs = Order_Model.objects.filter(orderID=orderID,rank__lang__lang=lang)        if not order_qs.exists():            return response.json(800)        order = order_qs[0]        if order.status != 0:            return response.json(802)        if order.payType == 1: # 支付宝支付的订单            return self.do_cancel_alipay_order(order, response)        else:            return self.do_cancel_paypal_order(order, response)    def do_delete_order(self, request_dict, userID, response):        orderID = request_dict.get('orderID', None)        if orderID:            Order_Model.objects.filter(orderID=orderID, userID__userID=userID).delete()            return response.json(0)        else:            return response.json(444)    def do_cancel_alipay_order(self, order, response):        # 交易状态:        # WAIT_BUYER_PAY(交易创建,等待买家付款)        # TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)        # TRADE_SUCCESS(交易支付成功)        # TRADE_FINISHED(交易结束,不可退款)        try:            aliPayObj = AliPayObject()            alipay = aliPayObj.conf()            result = alipay.api_alipay_trade_query(out_trade_no=order.orderID)            print(result)            if result['code'] == '100000':                trade_status = result['trade_status']                if trade_status == 'TRADE_CLOSED' or trade_status == 'WAIT_BUYER_PAY':                    order.status = 2                    order.updTime = int(time.time())                    order.save()                    return response.json(0)                elif trade_status == 'TRADE_SUCCESS':                    order.status = 1                    order.updTime = int(time.time())                    order.save()                    return response.json(802)            elif result['code'] == '40004':                order.status = 2                order.updTime = int(time.time())                order.save()                return response.json(0)            else:                return response.json(10, result['sub_msg'])        except Exception as e:            print(repr(e))            return response.json(10, repr(e))    def do_cancel_paypal_order(self, order, response):        paypalrestsdk.configure(PAYPAL_CRD)        payment = paypalrestsdk.Payment.find(order.trade_no)        transactions = payment['transactions']        transaction = transactions[0]        related_resources = transaction['related_resources']        if len(related_resources) > 0:            related_resource = related_resources[0]            sale = related_resource['sale']            if sale['state'] == 'completed':                order.status = 1            elif sale['state'] == 'refunded':                order.status = 3            order.updTime = int(time.time())            order.save()            return response.json(802)        order.status = 2        order.updTime = int(time.time())        order.save()        return response.json(0)
 |