order_service.py 31.2 KB
Newer Older
1 2 3 4 5 6 7 8
# -*- encoding: utf-8 -*-
# -----------------------------------------------------------------------------
# @File Name  : order_service.py
# @Time       : 2020/11/18 下午3:35
# @Author     : X. Peng
# @Email      : acepengxiong@163.com
# @Software   : PyCharm
# -----------------------------------------------------------------------------
9
import datetime
10
import time
11

pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
12 13
from sqlalchemy import and_
from sqlalchemy.testing import in_
14

etscript's avatar
etscript committed
15
from app.api.engine import TAMP_SQL, tamp_pay_engine, tamp_user_engine, config, env, tamp_zhibo_engine, tamp_course_engine
16 17
from app.config.errors import Errors
from app.controller.errorhandler import CustomFlaskErr
18
from app.model.account_balance import AccountBalance
19
# from app.model.account_topup_order import AccountTopupOrder
20
from app.model.curriculum_order import OrderFlow
etscript's avatar
etscript committed
21
from app.model.tamp_user_models import CurriculumPrice, CurriculumColumn, CurriculumRes, CsFileRecord
etscript's avatar
etscript committed
22
from app.model.tamp_course_models import CoursePackage
23 24
from xml.etree import cElementTree as etree

25
from app.model.tamp_zhibo_models import ZhiboTheme, ZhiboFile
26 27
from app.utils.alipay.alipayWap import prePay
from app.utils.apple_pay import apple_pay
pengxiong's avatar
pengxiong committed
28
from app.utils.wxpay import wx_jsapi_pay
29
from app.utils.wxpay.wx_app_pay import WXPay
etscript's avatar
etscript committed
30
import requests
31

etscript's avatar
etscript committed
32
# course_price_api = "https://devtamper.tanpuyun.com/course/res/money/price"
etscript's avatar
etscript committed
33 34

course_price_api = "http://s-nginx/course/res/money/price"
35

etscript's avatar
etscript committed
36
course_rollback_api = "http://s-nginx/fatools/pay/course/rollback"
etscript's avatar
etscript committed
37

etscript's avatar
etscript committed
38 39
ad_course_rollback_api = "http://s-nginx/course/advertise/detail?id="

40
class TopUpOrderService:
41 42 43
    """"""
    def __init__(self):
        pass
44

pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
45 46 47 48 49
    def get_order(self, args):
        pageNumber = args['pageNumber']
        pageSize = args['pageSize']
        user_id = args['user_id']
        offset = (pageNumber - 1)*pageSize
50 51 52
        with TAMP_SQL(tamp_user_engine) as tamp_user:
            tamp_user_session = tamp_user.session
            totalSize = tamp_user_session.query(OrderFlow.id).filter(
pengxiong's avatar
pengxiong committed
53 54 55 56 57 58 59 60
                and_(OrderFlow.createby == user_id, OrderFlow.ab_type == '6', OrderFlow.ab_status == 'SUCCESS'), OrderFlow.deletetag == '0').count()
            res = tamp_user_session.query(OrderFlow).filter(and_(
                OrderFlow.createby == user_id,
                OrderFlow.ab_type == '6',
                OrderFlow.ab_status == 'SUCCESS',
                OrderFlow.deletetag == '0'
                )
            ).order_by(
61
            OrderFlow.createtime.desc()).offset(offset).limit(pageSize)
pengxiong's avatar
pengxiong committed
62
            res = [r.to_dict() for r in res]
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
63
        allowed = {'id', 'ab_ordernum', 'transaction_serial_no', 'ab_payment', 'ab_pay_mode', 'createtime', 'pay_time', 'complete_time', 'ab_type'}
64 65 66 67
        for r in res:
            keys = set(r.keys()) - allowed
            for key in keys:
                del r[key]
68 69
        if not res:
            res = []
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
70
        return {
71
            'content': res,
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
72 73 74 75
            'pageNum': pageNumber,
            'pageSize': pageSize,
            'totalSize': totalSize
        }
76 77 78


    def create_order(self, args):
79 80
        args['ab_ordernum'] = time.strftime('%Y%m%d', time.localtime(time.time())) + str(int(time.time() * 100000))
        args['id'] = OrderFlow.__tablename__ + str(int(time.time() * 100000))
81
        args['amount'] = args['amount'] * 100
82
        args['ab_status'] = 'WAIT'
83
        subject = '探普币充值'
84
        out_trade_no = args['ab_ordernum']
85
        notify_url = config[env]['pay_url_prefix'] + '/tamp_order/micro_shop/topUpOrderNotify'
86
        pay_params = None
87
        if args['pay_method'] == 5:
88
            # 微信支付
89
            wx_pay = WXPay(out_trade_no, subject, args['amount'], args['remote_addr'], notify_url=notify_url)
90 91
            params = wx_pay.getReturnParams()
            pay_params = params
92
        elif args['pay_method'] == 6:
93
            # 支付宝支付
94
            total_amount = args['amount'] / 100
95
            res = prePay(subject, out_trade_no, total_amount, notify_url=notify_url)
96
            pay_params = res
97
        elif args['pay_method'] == 7:
98
            # 苹果支付
99
            # 入参校验
100
            receipt_data = args.get('receipt_data', '')
101 102 103 104 105 106 107
            product_id = args.get('product_id', '')
            if not receipt_data:
                raise CustomFlaskErr(Errors.INPUT_PARAMS_ERROR)
            if not product_id:
                raise CustomFlaskErr(Errors.INPUT_PARAMS_ERROR)
            apple_pay_res = apple_pay(receipt_data, product_id)
            if not apple_pay_res['success']:
108
                raise CustomFlaskErr(Errors.APPLE_VOCHER_INVALID)
109
            args['transaction_serial_no'] = apple_pay_res.get('transaction_id', '')
110 111 112 113 114 115 116 117 118 119 120 121
            with TAMP_SQL(tamp_user_engine) as tamp_user, TAMP_SQL(tamp_pay_engine) as tamp_pay:
                tamp_user_session, tamp_pay_session = tamp_user.session, tamp_pay.session
                if tamp_user_session.query(OrderFlow).filter(OrderFlow.transaction_serial_no == args['transaction_serial_no']).all():
                    raise CustomFlaskErr(Errors.APPLE_VOCHER_USED)
                args['ab_status'] = 'SUCCESS'
                if not tamp_pay_session.query(AccountBalance).filter(AccountBalance.user_id == args['user_id']).all():
                    tamp_pay_session.add(AccountBalance(id=AccountBalance.__tablename__+str(int(time.time()*100000)), user_id=args['user_id'], apple_balance=args['amount']))
                else:
                    tamp_pay_session.query(AccountBalance).filter(
                        AccountBalance.user_id == args['user_id']).update({
                        'apple_balance': AccountBalance.apple_balance + args['amount']
                    })
122
        args.pop('host_url', '')
123 124
        args.pop('remote_addr', '')
        args.pop('receipt_data', '')
125 126 127 128
        args.pop('product_id', '')
        args['ab_payment'] = args.pop('amount', '')
        args['ab_pay_mode'] = args.pop('pay_method', '')
        args['createby'] = args.pop('user_id', '')
129
        args['ab_type'] = '6'
130
        order_info = OrderFlow(**args)
131
        with TAMP_SQL(tamp_user_engine) as tamp_user:
132 133
            tamp_user_session = tamp_user.session
            tamp_user_session.add(order_info)
134
        return pay_params
135

136 137

class CurriculumOrderService:
138
    """消费订单"""
139
    def __init__(self):
140
        pass
141

pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
142
    def get_order(self, args):
143
        """."""
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
144 145 146 147
        pageNumber = args['pageNumber']
        pageSize = args['pageSize']
        user_id = args['user_id']
        offset = (pageNumber - 1) * pageSize
etscript's avatar
etscript committed
148
        with TAMP_SQL(tamp_user_engine) as tamp_user, TAMP_SQL(tamp_zhibo_engine) as tamp_zhibo, TAMP_SQL(tamp_course_engine) as tamp_course:
149
            tamp_user_session = tamp_user.session
pengxiong's avatar
pengxiong committed
150
            tamp_zhibo_session = tamp_zhibo.session
etscript's avatar
etscript committed
151
            tamp_course_session = tamp_course.session
152 153 154 155 156 157 158 159 160 161
            # curriculum_column = tamp_user_session.query(CurriculumColumn.id, CurriculumColumn.title, CurriculumColumn.cover, CurriculumColumn.info).all()
            # curriculum_res = tamp_user_session.query(CurriculumRes.id, CurriculumRes.title, CurriculumRes.cover, CurriculumRes.teacher_name).all()
            # zhibo = tamp_zhibo_session.query(ZhiboTheme.id, ZhiboTheme.zt_name, ZhiboTheme.zt_img, ZhiboTheme.manager_name, ZhiboTheme.zt_starttime).all()
            # zhibo_file = tamp_zhibo_session.query(ZhiboFile.id, ZhiboFile.remark)
            
            curriculum_column = tamp_user_session.query(CurriculumColumn)
            curriculum_res = tamp_user_session.query(CurriculumRes)
            zhibo = tamp_zhibo_session.query(ZhiboTheme)
            zhibo_file = tamp_zhibo_session.query(ZhiboFile)
            
162
            res = tamp_user_session.query(OrderFlow).filter(
pengxiong's avatar
pengxiong committed
163 164 165 166 167 168
                and_(
                    OrderFlow.createby == user_id,
                    OrderFlow.ab_type != '6',
                    OrderFlow.ab_status == 'SUCCESS',
                    OrderFlow.deletetag == '0'
                )
169 170 171 172 173 174
            )
            totalSize = res.count()
            res = res.order_by(OrderFlow.createtime.desc()).offset(offset).limit(pageSize)
            
            # 找出 1栏目表 , 3直播间信息表, [4,5]课程资源, 7附件 的list id
            orders = [r.to_dict() for r in res if r.to_dict()['ab_status'] == 'SUCCESS']
etscript's avatar
etscript committed
175
            orders_dict = {'1':[], '3':[], '4':[], '5':[], '7':[], '300':[], '305':[]}
176 177 178
            for i in orders:
                prod_type = i.get('ab_type', '')
                prod_id = i.get('ab_proid', '')
etscript's avatar
etscript committed
179
                if (prod_type in '13457' or prod_type == '300' or prod_type == '305') and prod_id:
180 181 182 183 184 185 186 187 188
                    orders_dict[prod_type].append(prod_id)
                    
            # 四组组合查询,将 需要的 1栏目表 , 3直播间信息表, [4,5]课程资源, 7附件 查出
            
            curriculum_column = tamp_user_session.query(CurriculumColumn.id, CurriculumColumn.title, 
                                                        CurriculumColumn.cover, CurriculumColumn.info).\
                                                            filter(CurriculumColumn.id.in_(orders_dict["1"])).all()
            curriculum_res = tamp_user_session.query(CurriculumRes.id, CurriculumRes.title, 
                                                     CurriculumRes.cover, CurriculumRes.teacher_name).\
wang zhengwei's avatar
wang zhengwei committed
189
                                                         filter(CurriculumRes.id.in_(orders_dict["4"] + orders_dict["5"])).all()
190 191 192 193 194
            zhibo = tamp_zhibo_session.query(ZhiboTheme.id, ZhiboTheme.zt_name, ZhiboTheme.zt_img, 
                                             ZhiboTheme.manager_name, ZhiboTheme.zt_starttime).\
                                                 filter(ZhiboTheme.id.in_(orders_dict["3"])).all()
            zhibo_file = tamp_zhibo_session.query(ZhiboFile.id, ZhiboFile.remark).\
                                                filter(ZhiboFile.id.in_(orders_dict["7"])).all()
etscript's avatar
etscript committed
195 196 197 198
            course_package = tamp_course_session.query(CoursePackage.id, CoursePackage.main_title, 
                                                    CoursePackage.square_img, CoursePackage.bg_status,
                                                    CoursePackage.bg_img).\
                                            filter(CoursePackage.id.in_(orders_dict["300"])).all()
etscript's avatar
etscript committed
199 200
            course_file = tamp_user_session.query(CsFileRecord.guid, CsFileRecord.original_name).\
                                            filter(CsFileRecord.guid.in_(orders_dict["305"])).all()
201
            
pengxiong's avatar
pengxiong committed
202 203 204
            curriculum_column = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_column}
            curriculum_res = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_res}
            zhibo = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3], 'zb_start_time': int(r[4].timestamp()) if r[4] else 0} for r in zhibo}
205 206
            zhibo_file = {r[0]: {'title': r[1]} for r in zhibo_file}
            # orders = [r.to_dict() for r in res if r.to_dict()['ab_status'] == 'SUCCESS']
etscript's avatar
etscript committed
207
            course_package = {r[0]: {'title': r[1], 'square_img': r[2], 'bg_status': r[3], 'bg_img': r[4]} for r in course_package}
etscript's avatar
etscript committed
208
            course_file = {r[0]: {'title': r[1]} for r in course_file}
209 210
            
        allowed = {'id', 'title', 'cover', 'info', 'ab_type', 'ab_payment', 'ab_score', 'ab_pay_mode', 'ab_ordernum', 'transaction_serial_no', 'pay_method', 'createtime', 'pay_time', 'complete_time',
etscript's avatar
etscript committed
211
                   'ab_status', 'ab_pro_siid', 'zb_start_time', 'square_img', 'bg_status', 'bg_img'}
212
        temp_orders = []
213
        for order in orders:
214
            prod_type = order.get('ab_type', '')
215
            prod_id = order.get('ab_proid', '')
216
            if prod_type == '1' and curriculum_column.get(prod_id):
217
                order = {**order, **curriculum_column.get(prod_id, None)}
pengxiong's avatar
pengxiong committed
218 219 220
            elif prod_type == '3' and zhibo.get(prod_id, None):
                order = {**order, **zhibo.get(prod_id, None)}
            elif prod_type in ['4', '5'] and curriculum_res.get(prod_id, None):
221
                order = {**order, **curriculum_res.get(prod_id, None)}
222 223
            elif prod_type == '7' and zhibo_file.get(prod_id, None):
                order = {**order, **zhibo_file.get(prod_id, None)}
etscript's avatar
etscript committed
224 225
            elif prod_type == '300' and course_package.get(prod_id, None):
                order = {**order, **course_package.get(prod_id, None)}
etscript's avatar
etscript committed
226 227
            elif prod_type == '305' and course_file.get(prod_id, None):
                order = {**order, **course_file.get(prod_id, None)}
etscript's avatar
etscript committed
228

229
            keys = set(order.keys()) - allowed
230
            for key in keys:
231 232 233 234 235 236 237 238 239 240 241
                del order[key]
            temp_orders.append(order)
        # temp_orders = temp_orders[offset: offset+pageSize]
        # allowed = {'id', 'title', 'cover', 'info', 'ab_type', 'ab_payment', 'ab_score', 'ab_pay_mode', 'ab_ordernum', 'transaction_serial_no', 'pay_method', 'createtime', 'pay_time', 'complete_time',
        #            'ab_status', 'ab_pro_siid', 'zb_start_time'}
        # for r in temp_orders:
        #     keys = set(r.keys()) - allowed
        #     for key in keys:
        #         del r[key]
        # if not temp_orders:
        #     temp_orders = []
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
242
        return {
243
            'content': temp_orders,
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
244 245 246 247
            'pageNum': pageNumber,
            'pageSize': pageSize,
            'totalSize': totalSize
        }
248 249 250


    def create_order(self, args):
251
        """。"""
252 253
        with TAMP_SQL(tamp_user_engine) as tamp_user, TAMP_SQL(tamp_pay_engine) as tamp_pay:
            tamp_user_session, tamp_pay_session = tamp_user.session, tamp_pay.session
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
254
            args['ab_ordernum'] = time.strftime('%Y%m%d', time.localtime(time.time())) + str(int(time.time() * 100000))
etscript's avatar
etscript committed
255 256 257 258 259 260 261

            # 该用户是否重复购买同一商品
            repeat_buy = tamp_user_session.query(OrderFlow.id).filter(and_(OrderFlow.createby == args['user_id']),
                                                                      OrderFlow.ab_proid == args['ab_proid'],
                                                                      OrderFlow.ab_status == 'SUCCESS').all()
            if repeat_buy:
                raise CustomFlaskErr(Errors.REPEAT_BUY)
etscript's avatar
etscript committed
262
            if args['ab_type'] == 300 and args.get('ad') == 'April':
etscript's avatar
etscript committed
263
                amount = requests.get(ad_course_rollback_api + args.get('ad_id'),
etscript's avatar
etscript committed
264 265 266
                                    timeout = 5)
                try:
                    amount = amount.json()
etscript's avatar
etscript committed
267
                    amount = [int(amount["attributes"]["bargainPrice"])]
etscript's avatar
etscript committed
268 269 270 271
                except:
                    raise CustomFlaskErr(Errors.PROD_NOPRICE)

            elif args['ab_type'] == 300:
etscript's avatar
etscript committed
272 273 274 275 276 277
                data = {
                            "payReqs": [{"resId": args['ab_proid']}],
                            "userId": args['user_id']
                        }
                headers = {
                    "Content-Type": "application/json",
etscript's avatar
etscript committed
278
                    # "tampToken": args['tampToken'],
etscript's avatar
etscript committed
279 280 281 282
                    "env": args['env']
                }
                amount = requests.post(course_price_api, 
                                    headers = headers,
etscript's avatar
etscript committed
283 284
                                    json = data,
                                    timeout = 5)
etscript's avatar
etscript committed
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
                try:
                    amount = amount.json()
                    '''
                        {
                            "statusCode": "0000",
                            "message": "成功",
                            "attributes": {
                                "COURSE_PACKAGE16185457769740": {
                                    "resId": "COURSE_PACKAGE16185457769740",
                                    "totalPrice": "998",
                                    "chargeMode": 3,
                                    "discountPrice": "8",
                                    "time3Type": null,
                                    "memberDiscountPrice": null,
                                    "memberTime3Type": null,
                                    "finalPrice": "998",
                                    "isNeedBuy": 1,
                                    "isBuy": 2
                                }
                            },
                            "success": true
                        }
                    '''
etscript's avatar
etscript committed
308
                    amount = [int(amount["attributes"][args['ab_proid']]["finalPrice"])]
etscript's avatar
etscript committed
309 310 311 312 313 314 315 316 317
                except:
                    raise CustomFlaskErr(Errors.PROD_NOPRICE)
            else:
                amount = tamp_user_session.query(CurriculumPrice.price).filter(CurriculumPrice.rel_id == args['ab_proid']).first()
                if not amount:
                    raise CustomFlaskErr(Errors.PROD_NOPRICE)

            amount = amount[0]

pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
318 319 320 321 322
            args['id'] = OrderFlow.__tablename__ + str(int(time.time() * 100000))
            args['ab_payment'] = amount
            args['ab_status'] = 'WAIT'
            subject = args.get('prod_name', '')
            out_trade_no = args['ab_ordernum']
323
            notify_url = config[env]['pay_url_prefix'] + '/tamp_order/micro_shop/consumeOrderNotify'
etscript's avatar
etscript committed
324 325
            pay_params = None         

326 327 328
            if int(amount) == 0:
                args['ab_status'] = 'SUCCESS'
            elif args['ab_pay_mode'] == 4:
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
329 330 331 332 333 334 335 336 337
                # 探普币支付
                if args['env'] == 'ios':
                    res = tamp_pay_session.query(AccountBalance.apple_balance).filter(
                        AccountBalance.user_id == args['user_id']).first()
                    if not res:
                        raise CustomFlaskErr(Errors.TANGPU_BALANCE_NOT_ENOUGH)
                    elif res[0] < args['ab_payment']:
                        raise CustomFlaskErr(Errors.TANGPU_BALANCE_NOT_ENOUGH)
                    else:
etscript's avatar
etscript committed
338
                        tamp_pay_session.query(AccountBalance).filter(
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
339 340 341 342 343 344 345 346 347 348 349 350
                            AccountBalance.user_id == args['user_id']).update({
                            'apple_balance': AccountBalance.apple_balance - args['ab_payment']
                        })
                        args['ab_status'] = 'SUCCESS'
                elif args['env'] == 'android':
                    res = tamp_pay_session.query(AccountBalance.android_balance).filter(
                        AccountBalance.user_id == args['user_id']).first()
                    if not res:
                        raise CustomFlaskErr(Errors.TANGPU_BALANCE_NOT_ENOUGH)
                    elif res[0] < args['ab_payment']:
                        raise CustomFlaskErr(Errors.TANGPU_BALANCE_NOT_ENOUGH)
                    else:
etscript's avatar
etscript committed
351
                        tamp_pay_session.query(AccountBalance).filter(
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
352 353 354 355 356
                            AccountBalance.user_id == args['user_id']).update({
                            'android_balance': AccountBalance.android_balance - args['ab_payment']
                        })
                        args['ab_status'] = 'SUCCESS'
            elif args['ab_pay_mode'] == 5:
pengxiong's avatar
pengxiong committed
357
                # 微信App支付
358
                wx_pay = WXPay(out_trade_no, subject, args['ab_payment'], args['remote_addr'], notify_url)
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
359 360 361 362 363
                params = wx_pay.getReturnParams()
                pay_params = params
            elif args['ab_pay_mode'] == 6:
                # 支付宝支付
                total_amount = args['ab_payment'] / 100
364
                res = prePay(subject, out_trade_no, total_amount, notify_url)
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
365
                pay_params = res
pengxiong's avatar
pengxiong committed
366
            elif args['ab_pay_mode'] == 8:
pengxiong's avatar
pengxiong committed
367
                # 微信公众号支付
etscript's avatar
etscript committed
368 369 370 371
                # 特殊情况,广告推广支付
                ad = args.get("ad")
                if ad == 'April':
                    args.pop('ad', '')
etscript's avatar
etscript committed
372
                    subject = subject + ',ad='+ ad
pengxiong's avatar
pengxiong committed
373 374 375
                wx_pay = wx_jsapi_pay.WXPay(args['openid'], out_trade_no, subject, args['ab_payment'], args['remote_addr'], notify_url)
                params = wx_pay.getReturnParams()
                pay_params = params
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
376 377 378 379
            args['createby'] = args.pop('user_id', '')
            args.pop('prod_name', '')
            args.pop('env', '')
            args.pop('remote_addr', '')
380
            args.pop('host_url', '')
pengxiong's avatar
pengxiong committed
381
            args.pop('openid', '')
etscript's avatar
etscript committed
382
            args.pop('tampToken', '')
wang zhengwei's avatar
wang zhengwei committed
383 384
            args.pop('ad', '')
            args.pop('ad_id', '')
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
385 386 387
            order_info = OrderFlow(**args)
            tamp_user_session.add(order_info)
            return pay_params
388 389


390
def topUpSuccessAction(order_no, transaction_id):
391
    """."""
392 393 394
    with TAMP_SQL(tamp_user_engine) as tamp_user, TAMP_SQL(tamp_pay_engine) as tamp_pay:
        tamp_user_session, tamp_pay_session = tamp_user.session, tamp_pay.session
        topup_order = tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).first()
395 396 397 398
        if not topup_order:
            raise CustomFlaskErr(Errors.NO_ORDERS)
        else:
            topup_order = topup_order.to_dict()
399
        # 幂等校验
400
        if topup_order.get('ab_status', '') == 'SUCCESS':
401 402 403
            return False
        tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).update({
            'ab_status': 'SUCCESS',
404
            'transaction_serial_no': transaction_id,
405 406
            'pay_time': datetime.datetime.now(),
            'complete_time': datetime.datetime.now()
407
        })
408 409
        # 账户充值
        account_topup_order = tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).first().to_dict()
410 411
        user_id = account_topup_order.get('createby', '')
        ab_payment = account_topup_order.get('ab_payment', '')
412
        # 安卓支付宝,微信支付
413 414
        if not tamp_pay_session.query(AccountBalance).filter(AccountBalance.user_id == user_id).all():
            tamp_pay_session.add(AccountBalance(id=AccountBalance.__tablename__ + str(int(time.time()*10000)), user_id=user_id, android_balance=ab_payment))
415
        else:
416 417
            tamp_pay_session.query(AccountBalance).filter(AccountBalance.user_id == user_id).update({
                'android_balance': AccountBalance.android_balance + ab_payment
418
            })
419

420 421


422
def consumeSucessAction(order_no, transaction_id):
423
    """."""
424 425
    with TAMP_SQL(tamp_user_engine) as tamp_user:
        tamp_user_session = tamp_user.session
426 427 428 429 430
        curriculum_order = tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).first()
        if not curriculum_order:
            raise CustomFlaskErr(Errors.NO_ORDERS)
        else:
            curriculum_order = curriculum_order.to_dict()
431
        # 幂等校验
432
        if curriculum_order.get('ab_status', '') == 'SUCCESS':
433 434 435
            return False
        tamp_user_session.query(OrderFlow).filter(OrderFlow.ab_ordernum == order_no).update({
            'ab_status': 'SUCCESS',
436
            'transaction_serial_no': transaction_id,
437 438 439
            'pay_time': datetime.datetime.now(),
            'complete_time': datetime.datetime.now()
        })
440

etscript's avatar
etscript committed
441 442
        if curriculum_order.get('ab_type') == '300':
            data = {"resId": curriculum_order.get('ab_proid'),
etscript's avatar
etscript committed
443
                    "userId": curriculum_order.get('createby'),
etscript's avatar
etscript committed
444
                    "phone": curriculum_order.get('register_phone')}
etscript's avatar
etscript committed
445 446 447 448 449
            headers = {
                "Content-Type": "application/json",
                "env": "ios"
            }
            try:
etscript's avatar
etscript committed
450
                tmp = requests.post(course_rollback_api, 
etscript's avatar
etscript committed
451 452 453
                                headers = headers,
                                json = data,
                                timeout = 5)
etscript's avatar
etscript committed
454
                print(tmp.json())
etscript's avatar
etscript committed
455 456 457 458
            except:
                print("用户提升级别接口失败")


459 460 461

def getAccountBalance(user_id):
    """查询探普币余额"""
462 463 464 465 466 467 468
    with TAMP_SQL(tamp_pay_engine) as tamp_pay:
        tamp_pay_session = tamp_pay.session
        account_balance = tamp_pay_session.query(AccountBalance).filter(AccountBalance.user_id == user_id).first()
        if not account_balance:
            return {'user_id': user_id, 'android_balance': 0, 'apple_balance': 0}
        else:
            return account_balance.to_dict()
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490


def xml2dict(content):
    """将从微信服务器接收到的xml转为dict."""
    raw = {}
    root = etree.fromstring(content)
    for child in root:
        raw[child.tag] = child.text
    return raw


def dict2xml(dict_):
    """将dict转为要发送到微信服务器的xml格式."""
    s = ""
    for k, v in dict_.items():
        s += "<{0}>{1}</{0}>".format(k, v)
    s = "<xml>{0}</xml>".format(s)
    return s.encode("utf-8")

def alipayWxPayCheck(res_info):
    """支付宝,微信支付异步通知"""
    success = False
491 492
    body = ''
    transaction_id = ''
493 494
    header = {'Content-Type': 'application/text'}
    res = {}
495 496 497 498 499 500 501 502 503
    if 'xml' in res_info:
        # 微信支付
        res = xml2dict(res_info)
        if res['return_code'] == 'SUCCESS' and res['result_code'] == 'SUCCESS':
            success = True
            transaction_id = res.get('transaction_id', '')
            header = {'Content-Type': 'application/xml'}
            body = '<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>'
    else:
504 505 506 507 508
        # 支付宝支付
        res_info = res_info.split('&')
        for ss in res_info:
            key, value = ss.split('=')
            res[key] = value
509
        if res.get('trade_status', '') == 'TRADE_SUCCESS':
510
            success = True
511
            transaction_id = res.get('trade_no', '')
512 513
            body = 'success'.encode()

514
    return {'success': success, 'header': header, 'body': body, 'order_no': res['out_trade_no'], 'transaction_id': transaction_id}
515 516 517 518 519 520 521 522


def getAllOrders(args):
    """."""
    pageNumber = args['pageNumber']
    pageSize = args['pageSize']
    user_id = args['user_id']
    offset = (pageNumber - 1) * pageSize
etscript's avatar
etscript committed
523
    with TAMP_SQL(tamp_user_engine) as tamp_user, TAMP_SQL(tamp_zhibo_engine) as tamp_zhibo, TAMP_SQL(tamp_course_engine) as tamp_course:
524
        tamp_user_session = tamp_user.session
pengxiong's avatar
pengxiong committed
525
        tamp_zhibo_session = tamp_zhibo.session
etscript's avatar
etscript committed
526
        tamp_course_session = tamp_course.session
527
        
528
        # 全部订单
529 530 531 532 533 534
        # curriculum_column = tamp_user_session.query(CurriculumColumn.id, CurriculumColumn.title, CurriculumColumn.cover,
        #                                             CurriculumColumn.info).all()
        # curriculum_res = tamp_user_session.query(CurriculumRes.id, CurriculumRes.title, CurriculumRes.cover,
        #                                          CurriculumRes.teacher_name).all()
        # zhibo = tamp_zhibo_session.query(ZhiboTheme.id, ZhiboTheme.zt_name, ZhiboTheme.zt_img, ZhiboTheme.manager_name,
        #                                  ZhiboTheme.zt_starttime).all()
535
        res = tamp_user_session.query(OrderFlow).filter(
pengxiong's avatar
pengxiong committed
536 537 538 539 540
            and_(
                OrderFlow.createby == user_id,
                OrderFlow.ab_status == 'SUCCESS',
                OrderFlow.deletetag == '0'
            )
541 542 543 544 545 546
        )
        totalSize = res.count()
        res = res.order_by(OrderFlow.createtime.desc()).offset(offset).limit(pageSize)
        
        # 找出 1栏目表 , 3直播间信息表, [4,5]课程资源, 7附件 的list id
        orders = [r.to_dict() for r in res if r.to_dict()['ab_status'] == 'SUCCESS']
547
        orders_dict = {'1':[], '3':[], '4':[], '5':[], '7':[], '300':[], '305':[]}
548 549 550
        for i in orders:
            prod_type = i.get('ab_type', '')
            prod_id = i.get('ab_proid', '')
551
            if (prod_type in '13457' or prod_type == '300' or prod_type == '305') and prod_id:
552
                orders_dict[prod_type].append(prod_id)
etscript's avatar
etscript committed
553
        # 四组组合查询,将 需要的 1栏目表 , 3直播间信息表, [4,5]课程资源, 7附件, 300 课程包 查出
554 555 556 557 558 559
            
        curriculum_column = tamp_user_session.query(CurriculumColumn.id, CurriculumColumn.title, 
                                                    CurriculumColumn.cover, CurriculumColumn.info).\
                                                        filter(CurriculumColumn.id.in_(orders_dict["1"])).all()
        curriculum_res = tamp_user_session.query(CurriculumRes.id, CurriculumRes.title, 
                                                    CurriculumRes.cover, CurriculumRes.teacher_name).\
wang zhengwei's avatar
wang zhengwei committed
560
                                                        filter(CurriculumRes.id.in_(orders_dict["4"] + orders_dict["5"])).all()
561 562 563 564 565
        zhibo = tamp_zhibo_session.query(ZhiboTheme.id, ZhiboTheme.zt_name, ZhiboTheme.zt_img, 
                                            ZhiboTheme.manager_name, ZhiboTheme.zt_starttime).\
                                                filter(ZhiboTheme.id.in_(orders_dict["3"])).all()
        zhibo_file = tamp_zhibo_session.query(ZhiboFile.id, ZhiboFile.remark).\
                                            filter(ZhiboFile.id.in_(orders_dict["7"])).all()
etscript's avatar
etscript committed
566 567 568 569
        course_package = tamp_course_session.query(CoursePackage.id, CoursePackage.main_title, 
                                                    CoursePackage.square_img, CoursePackage.bg_status,
                                                    CoursePackage.bg_img).\
                                            filter(CoursePackage.id.in_(orders_dict["300"])).all()
570 571
        course_file = tamp_user_session.query(CsFileRecord.guid, CsFileRecord.original_name).\
                                            filter(CsFileRecord.guid.in_(orders_dict["305"])).all()
572 573
                
        
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
574 575
        curriculum_column = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_column}
        curriculum_res = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3]} for r in curriculum_res}
pengxiong's avatar
pengxiong committed
576
        zhibo = {r[0]: {'title': r[1], 'cover': r[2], 'info': r[3], 'zb_start_time':  int(r[4].timestamp()) if r[4] else 0} for r in zhibo}
577
        zhibo_file = {r[0]: {'title': r[1]} for r in zhibo_file}
etscript's avatar
etscript committed
578
        course_package = {r[0]: {'title': r[1], 'square_img': r[2], 'bg_status': r[3], 'bg_img': r[4]} for r in course_package}
579
        course_file = {r[0]: {'title': r[1]} for r in course_file}
580 581 582
        
        allowed = {'id', 'title', 'cover', 'info', 'ab_type', 'ab_payment', 'ab_score', 'ab_pay_mode', 'ab_ordernum',
                   'transaction_serial_no', 'pay_method', 'createtime', 'pay_time', 'complete_time',
etscript's avatar
etscript committed
583
                   'ab_status', 'ab_pro_siid', 'zt_start_time', 'square_img', 'bg_status', 'bg_img'}
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
584 585 586 587
        temp_orders = []
        for order in orders:
            prod_type = order.get('ab_type', '')
            prod_id = order.get('ab_proid', '')
588
            
pengxiong's avatar
pengxiong committed
589
            if prod_type == '1' and curriculum_column.get(prod_id, None):
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
590
                order = {**order, **curriculum_column.get(prod_id, None)}
pengxiong's avatar
pengxiong committed
591 592 593
            elif prod_type == '3' and zhibo.get(prod_id, None):
                order = {**order, **zhibo.get(prod_id, None)}
            elif prod_type in ['4', '5'] and curriculum_res.get(prod_id, None):
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
594
                order = {**order, **curriculum_res.get(prod_id, None)}
595 596
            elif prod_type == '7' and zhibo_file.get(prod_id, None):
                order = {**order, **zhibo_file.get(prod_id, None)}
etscript's avatar
etscript committed
597 598
            elif prod_type == '300' and course_package.get(prod_id, None):
                order = {**order, **course_package.get(prod_id, None)}
599 600
            elif prod_type == '305' and course_file.get(prod_id, None):
                order = {**order, **course_file.get(prod_id, None)}
601 602 603
            
            # 将多余字段删除
            keys = set(order.keys()) - allowed
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
604
            for key in keys:
605 606 607 608 609 610 611 612 613 614
                del order[key] 
            
            temp_orders.append(order)
        
        # for r in temp_orders:
        #     keys = set(r.keys()) - allowed
        #     for key in keys:
        #         del r[key]
        # if not temp_orders:
        #     temp_orders = []
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
615
        return {
616
            'content': temp_orders,
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
617 618 619 620
            'pageNum': pageNumber,
            'pageSize': pageSize,
            'totalSize': totalSize
        }