# -*- encoding: utf-8 -*- """ @File : UnicomComboController.py @Time : 2022/6/23 9:18 @Author : stephen @Email : zhangdongming@asj6.wecom.work @Software: PyCharm """ import json import logging import time from django.db import transaction from django.http import HttpResponse from django.views.generic.base import View from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject from Object.UnicomObject import UnicomObjeect class UnicomComboView(View): 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): if operation == 'buy-notify': return self.package_callback_notify(request_dict, request) elif operation == 'device-queue-monitoring': return self.device_queue_monitoring_push(request_dict, request) elif operation == 'device-status-change': return self.device_status_change_push(request_dict, request) else: token = TokenObject(request.META.get('HTTP_AUTHORIZATION')) lang = request_dict.get('lang', token.lang) response = ResponseObject(lang) if token.code != 0: return response.json(token.code) user_id = token.userID if operation == 'device-bind': return self.device_add(user_id, request_dict, response) elif operation == 'combo-save': return self.save_unicom_combo(request_dict, response) elif operation == 'combo-list': return self.query_package_list(response) @classmethod def device_add(cls, user_id, request_dict, response): """ 设备绑定iccid @param user_id: @param request_dict: @param response: @return: """ iccid = request_dict.get('iccid', None) uid = request_dict.get('uid', None) if not all([iccid, uid]): return response.json(444) n_time = int(time.time()) try: # 待完善代码 根据uid与用户id验证系统设备 unicom_device_qs = UnicomDeviceInfo.objects.filter(iccid=iccid) if unicom_device_qs.exists(): return response.json(174) unicom_obj = UnicomObjeect() result = unicom_obj.verify_device(iccid=iccid) if result.status_code == 200 and result.text: res_dict = json.loads(result.text) if res_dict['success']: if res_dict['data']['status'] == 0: return response.json(173) params = {'user_id': user_id, 'iccid': iccid, 'uid': uid, 'updated_time': n_time, 'created_time': n_time} UnicomDeviceInfo.objects.create(**params) return response.json(0) else: return response.json(173) except Exception as e: print(e) return response.json(177, repr(e)) @classmethod def save_unicom_combo(cls, request_dict, response): """ 联通套餐保存 @param request_dict: @param response: @return: """ combo_id = request_dict.get('id', None) combo_name = request_dict.get('comboName', None) flow_total = request_dict.get('flowTotal', None) expiration_days = request_dict.get('expirationDays', None) expiration_type = request_dict.get('expirationType', None) price = request_dict.get('price', None) remark = request_dict.get('remark', None) pay_type = request_dict.get('payType', '').split(',') if not all([pay_type, combo_name, flow_total, expiration_days, expiration_type, price]): return response.json(444) try: flow_total = int(flow_total) expiration_days = int(expiration_days) expiration_type = int(expiration_type) with transaction.atomic(): re_data = { 'combo_name': combo_name, 'flow_total': flow_total, 'expiration_days': expiration_days, 'expiration_type': expiration_type, 'price': price, } if remark: re_data['remark'] = remark if combo_id: UnicomCombo.objects.filter(id=combo_id).update(**re_data) UnicomCombo.objects.get(id=combo_id).pay_type.set(pay_type) return response.json(0) UnicomCombo.objects.create(**re_data).pay_type.set(pay_type) return response.json(0) except Exception as e: print(e) return response.json(177, repr(e)) @classmethod def query_package_list(cls, response): """ 查询套餐列表 @return: """ try: combo_qs = UnicomCombo.objects.filter(is_show=1, status=0, is_del=False) \ .order_by('sort').values('id', 'combo_name', 'flow_total', 'expiration_days', 'expiration_type', 'price', 'remark') if not combo_qs.exists(): return response.json(0, []) combo_list = [] for item in combo_qs: # 获取支付方式列表 pay_type_qs = Pay_Type.objects.filter(unicomcombo=item['id']).values('id', 'payment') combo_list.append({ 'id': item['id'], 'comboName': item['combo_name'], 'flowTotal': item['flow_total'], 'expirationDays': item['expiration_days'], 'expirationType': item['expiration_type'], 'price': item['price'], 'remark': item['remark'], 'payTypes': list(pay_type_qs), }) return response.json(0, combo_list) except Exception as e: print(e) return response.json(177, repr(e)) @classmethod def buy_package(cls): """ 购买套餐 @return: """ pass @classmethod def query_device_usage_history(cls): """ 查询用量历史 @return: """ @staticmethod def package_callback_notify(request_dict, request): """ 异步套餐订购回调 @param request_dict: @param request: @return: """ logger = logging.getLogger('info') try: logger.info('联通异步套餐订购回调参数{}'.format(request_dict)) body = request.body.decode("utf-8") if body: dict_data = json.loads(body) sign = dict_data['sign'] logger.info('设备订购异步回调请求参数{}'.format(dict_data)) dict_data.pop('sign') unicom_obj = UnicomObjeect() generate_sign = unicom_obj.createSign(**dict_data) logger.info('设备订购请求签名{}'.format(sign)) logger.info('设备订购生成签名{}'.format(generate_sign)) r_data = {'success': True, 'msg': '成功'} return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8") except Exception as e: print(repr(e)) r_data = {'success': False, 'msg': '失败'} return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8") @staticmethod def device_queue_monitoring_push(request_dict, request): """ 设备套餐队列用完或者到期推送 @param request_dict: @param request: @return: """ logger = logging.getLogger('info') try: logger.info('设备套餐队列推送{}'.format(request_dict)) body = request.body.decode("utf-8") if body: dict_data = json.loads(body) sign = dict_data['sign'] logger.info('设备套餐队列回调请求参数{}'.format(dict_data)) dict_data.pop('sign') unicom_obj = UnicomObjeect() generate_sign = unicom_obj.createSign(**dict_data) logger.info('设备套餐队列请求签名{}'.format(sign)) logger.info('设备套餐队列生成签名{}'.format(generate_sign)) r_data = {'success': True, 'msg': '成功'} return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8") except Exception as e: print(repr(e)) r_data = {'success': False, 'msg': '失败'} return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8") @staticmethod def device_status_change_push(request_dict, request): """ 设备状态变更推送执行场景说明 @param request_dict: @param request: @return: """ logger = logging.getLogger('info') try: logger.info('设备状态变更推送{}'.format(request_dict)) body = request.body.decode("utf-8") if body: dict_data = json.loads(body) sign = dict_data['sign'] logger.info('设备状态变更推送请求参数{}'.format(dict_data)) dict_data.pop('sign') unicom_obj = UnicomObjeect() generate_sign = unicom_obj.createSign(**dict_data) logger.info('设备状态变更推送请求签名{}'.format(sign)) logger.info('设备状态变更推送生成签名{}'.format(generate_sign)) r_data = {'success': True, 'msg': '成功'} return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8") except Exception as e: print(repr(e)) r_data = {'success': False, 'msg': '失败'} return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")