| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | # -*- encoding: utf-8 -*-"""@File    : UserDataController.py@Time    : 2023/6/29 14:56@Author  : peng@Email   : zhangdongming@asj6.wecom.work@Software: PyCharm"""from django.db.models import Q, Sumfrom django.views.generic.base import Viewfrom Model.models import UnicomDeviceInfo, UnicomComboOrderInfofrom Service.CommonService import CommonServicefrom Object.RedisObject import RedisObjectclass UnicomDataView(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):        token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)        if token_code != 0:            return response.json(token_code)        if operation == 'getFlowInfo':  # 查询流量使用情况            return self.get_flow_info(request_dict, response)        elif operation == 'getMonthlyFlowInfo':  # 查询流量使用情况            return self.get_monthly_flow_info(request_dict, response)        else:            return response.json(414)    @classmethod    def get_flow_info(cls, request_dict, response):        """        查询流量使用情况        @param request_dict: 请求数据        @request_dict year: 年        @request_dict month: 月        @request_dict query_type: 查询流量类型        @request_dict iccid: 卡号        @request_dict user_id: 用户id        @request_dict page: 查询分页数        @request_dict line: 查询条数        @param response:响应对象        @return:        """        query_type = request_dict.get('query_type', None)        iccid = request_dict.get('iccid', None)        user_id = request_dict.get('user_id', None)        year = request_dict.get('year', None)        month = request_dict.get('month', None)        page = request_dict.get('page', None)        line = request_dict.get('line', None)        if not all([query_type, page, line]):            return response.json(444)        page = int(page)        line = int(line)        redis_obj = RedisObject()        iccid_list = []        try:            if query_type == '1':  # 查询联通测试流量信息                iccid_qs = UnicomComboOrderInfo.objects.all()                iccid_qs = iccid_qs.filter(combo__combo_type=1)                if user_id:                    user_qs = UnicomDeviceInfo.objects.filter(user_id=user_id).values('iccid')                    if not user_qs.exists():                        return response.json(173)                    iccid_qs = iccid_qs.filter(iccid=user_qs[0]['iccid'])                if iccid:                    iccid_qs = iccid_qs.filter(iccid=iccid)                iccid_qs = iccid_qs.values('iccid', 'flow_total_usage')                total_flow = iccid_qs.aggregate(total=Sum('flow_total_usage'))['total']                count = iccid_qs.count()                iccid_qs = iccid_qs[(page - 1) * line:page * line]                for item in iccid_qs:                    user_qs = UnicomDeviceInfo.objects.filter(iccid=item['iccid']).values('user_id')                    item['user_id'] = user_qs[0]['user_id'] if user_qs.exists() else ''                    iccid_list.append(item)            elif query_type == '2':  # 查询联通月度流量信息                iccid_qs = UnicomDeviceInfo.objects.filter(card_type=0)                if iccid:                    iccid_qs = iccid_qs.filter(iccid=iccid)                if user_id:                    iccid_qs = iccid_qs.filter(user_id=user_id)                iccid_qs = iccid_qs.values('iccid').distinct().order_by('iccid')                count = iccid_qs.count()                iccid_qs = iccid_qs[(page - 1) * line:page * line]                total_flow = 0                for item in iccid_qs:                    item['flow_total_usage'] = 0                    key = 'monthly_flow_' + item['iccid']                    user_qs = UnicomDeviceInfo.objects.filter(iccid=item['iccid']).values('user_id')                    item['user_id'] = user_qs[0]['user_id'] if user_qs.exists() else ''                    if year and month:                        file = year + '-' + month                        flow = redis_obj.get_hash_data(key, file)[0]                        flow = float(flow.decode()) if flow else 0                        item['flow_total_usage'] = flow                    else:                        flow_dict = redis_obj.get_all_hash_data(key)                        for k, v in flow_dict.items():                            item['flow_total_usage'] += float(v)                    iccid_list.append(item)                    item['flow_total_usage'] = round(item['flow_total_usage'], 2)                    total_flow += float(item['flow_total_usage'])            else:                return response.json(444)            res = {                'iccidInfo': iccid_list,                'totalFlow': round(total_flow, 2),                'count': count            }            return response.json(0, res)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def get_monthly_flow_info(cls, request_dict, response):        """        查询月度流量使用情况        @param request_dict: 请求数据        @request_dict year: 年        @request_dict month: 月        @request_dict iccid: 卡号        @param response:响应对象        @return:        """        iccid = request_dict.get('iccid', None)        year = request_dict.get('year', None)        month = request_dict.get('month', None)        page = request_dict.get('page', None)        line = request_dict.get('line', None)        redis_obj = RedisObject()        data_list = []        if not all([iccid, page, line]):            return response.json(444)        page = int(page)        line = int(line)        try:            key = 'monthly_flow_' + iccid            if year and month:                file = year + '-' + month                flow = redis_obj.get_hash_data(key, file)[0]                flow = flow.decode() if flow else 0                data_list.append({file: flow})            else:                flow_dict = redis_obj.get_all_hash_data(key)                for k, v in flow_dict.items():                    data_list.append({k.decode(): float(v)})            res = {                'list': data_list[(page - 1) * line:page * line],                'count': len(data_list)            }            return response.json(0, res)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 |