فهرست منبع

修改定时监控鼎芯卡流量使用

zhangdongming 1 سال پیش
والد
کامیت
ac6ed95b5d
3فایلهای تغییر یافته به همراه117 افزوده شده و 12 حذف شده
  1. 11 5
      Controller/UnicomCombo/UnicomComboTaskController.py
  2. 8 3
      Object/UnicomObject.py
  3. 98 4
      Service/TelecomService.py

+ 11 - 5
Controller/UnicomCombo/UnicomComboTaskController.py

@@ -21,6 +21,7 @@ from Model.models import UnicomComboOrderInfo, UnicomCombo, Order_Model, UnicomD
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.UnicomObject import UnicomObjeect
+from Service.TelecomService import TelecomService
 
 logger = logging.getLogger('info')
 
@@ -152,6 +153,8 @@ class UnicomComboTaskView(View):
                 if not u_device_info_qs.exists():
                     continue
                 u_device_info_qs = u_device_info_qs.first()
+                card_type = u_device_info_qs.card_type
+
                 activate_usage_flow = float(item['flow_total_usage']) if item['flow_total_usage'] else 0.0
                 combo_id = item['combo_id']
                 combo_qs = UnicomCombo.objects.filter(id=combo_id).values()
@@ -160,10 +163,10 @@ class UnicomComboTaskView(View):
                 combo_qs = combo_qs.first()
                 flow_total = combo_qs['flow_total']
                 # 队列已使用总流量总量
-                flow_total_usage = unicom_api.get_flow_usage_total(iccid)
+                flow_total_usage = unicom_api.get_flow_usage_total(iccid, card_type)
                 flow_total_usage = float(flow_total_usage)
                 is_expire = False
-                flow = activate_usage_flow + flow_total
+                flow = activate_usage_flow + flow_total  # 激活套餐时ICCID历史用量+当前套餐流量
                 if flow_total_usage > 0:
                     # 初始套餐已使用流量 + 套餐总流量
                     if flow_total_usage >= flow:
@@ -180,9 +183,12 @@ class UnicomComboTaskView(View):
                     activate_status = cls.query_unused_combo_and_activate(iccid, year, month,
                                                                           flow_total_usage)
                     logger.info('-->当前卡{}流量已用完,是否有生效套餐:{}'.format(iccid, activate_status))
-                    if not activate_status:
-                        # 停用
-                        unicom_api.change_device_to_disable(iccid)
+                    if not activate_status:  # 停用或断网
+                        if card_type == 3:  # 鼎芯电信
+                            TelecomService().update_access_number_network(u_device_info_qs.access_number, 'ADD')
+                        else:
+                            unicom_api.change_device_to_disable(iccid)
+
         except Exception as e:
             logger.info('异步~检测流量用量详情异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 

+ 8 - 3
Object/UnicomObject.py

@@ -21,6 +21,7 @@ from Model.models import UnicomDeviceInfo
 from Object.RedisObject import RedisObject
 from Object.utils import SM3Util
 from Object.utils.SymmetricCryptoUtil import AESencrypt
+from Service.TelecomService import TelecomService
 
 """
 联通4Gapi
@@ -300,15 +301,19 @@ class UnicomObjeect:
         return sim_flow_used_total
 
     @staticmethod
-    def get_flow_usage_total(iccid):
+    def get_flow_usage_total(iccid, card_type=0):
         """
-        获取实时当前套餐队列总已用流量
-        @param iccid: 联通id
+        查询当前卡号历史总用量,默认查询珠海联通卡总使用量,单位MB
+        @param card_type: 卡类型,0:珠海联通,1:鼎芯电信
+        @param iccid: 20位卡号
         @return: flow_total_usage 当前套餐总已使用流量
         """
         flow_key = 'ASJ:UNICOM:FLOW:{}'
         usage_data = {'iccid': iccid}
         expire_time = 60 * 10 + 60
+        if card_type == 3:  # 鼎芯电信
+            return TelecomService().query_total_usage_by_access_number(iccid, flow_key.format(iccid), expire_time)
+        # 珠海联通
         return UnicomObjeect().get_flow_total_usage(flow_key.format(iccid), expire_time, **usage_data)
 
     @staticmethod

+ 98 - 4
Service/TelecomService.py

@@ -6,10 +6,13 @@
 @Email   : zhangdongming@asj6.wecom.work
 @Software: PyCharm
 """
+import json
+import re
 import time
 from decimal import Decimal
+
 from Ansjer.config import LOGGER
-from Model.models import UnicomDeviceInfo
+from Model.models import UnicomDeviceInfo, LogModel
 from Object.RedisObject import RedisObject
 from Object.TelecomObject import TelecomObject
 
@@ -17,13 +20,12 @@ from Object.TelecomObject import TelecomObject
 class TelecomService:
 
     @classmethod
-    def query_total_usage_by_access_number(cls, iccid, access_number, key, expire=600):
+    def query_total_usage_by_access_number(cls, iccid, key, expire=600):
         """
         根据接入号码查询设备总流量使用量(实现缓存)
         @param iccid: 20位ICCID
         @param key: 缓存key
         @param expire: 失效时间
-        @param access_number: 接入号码
         @return: 查询流量结果
         """
         redis = RedisObject()
@@ -38,7 +40,8 @@ class TelecomService:
             sim_vo = sim_qs.first()
 
             telecom = TelecomObject()
-            data = telecom.query_total_usage_by_date(access_number)
+            # 查询电信当月流量用量
+            data = telecom.query_total_usage_by_date(sim_vo.access_number)
             if data and data['SvcCont']['resultCode'] == '0' and 'dataCumulationTotal' in data['SvcCont']['result']:
                 cycle_total = data['SvcCont']['result'].get('dataCumulationTotal')
             else:
@@ -65,6 +68,97 @@ class TelecomService:
                 sim_flow_used_total = sim_vo.sim_used_flow + cycle_total
             else:
                 sim_flow_used_total = sim_vo.sim_used_flow + sim_vo.sim_cycle_used_flow
+            # 缓存当月流量数据
             redis.CONN.setnx(key, str(sim_flow_used_total))
             redis.CONN.expire(key, expire)
         return sim_flow_used_total
+
+    @classmethod
+    def update_access_number_network(cls, access_number, action):
+        """
+        根据接入号码修改卡网络状态
+        @param access_number: 11位接入号码
+        @param action: ADD:单独添加断网,DEL:单独恢复上网
+        @return: True|False
+        """
+        try:
+            result = TelecomObject().single_cut_net(access_number, action)
+            url = 'update/access_number/network'
+            ip = '127.0.0.1'
+            params = {'access_number': access_number, 'action': action, 'result': result}
+            if not result:
+                explain = f'{access_number}单独断网或恢复异常'
+                cls.create_operation_log(url, ip, params, explain)
+                return None
+            explain = f'{access_number}单独断网或恢复成功'
+            cls.create_operation_log(url, ip, params, explain)
+            return 'success'
+        except Exception as e:
+            LOGGER.info('***{} TelecomService.update_access_number_network:errLine:{}, errMsg:{}'
+                        .format(access_number, e.__traceback__.tb_lineno, repr(e)))
+            return None
+
+    @classmethod
+    def create_operation_log(cls, url, ip, request_dict, describe):
+        """
+        创建操作日志
+        @param url: 请求路径
+        @param describe: 描述
+        @param ip: 当前IP
+        @param request_dict: 请求参数
+        @return: True | False
+        """
+        try:
+            # 记录操作日志
+            content = json.loads(json.dumps(request_dict))
+            log = {
+                'ip': ip,
+                'user_id': 1,
+                'status': 200,
+                'time': int(time.time()),
+                'content': json.dumps(content),
+                'url': url,
+                'operation': describe,
+            }
+            LogModel.objects.create(**log)
+            return True
+        except Exception as e:
+            print('日志异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
+
+    @classmethod
+    def get_access_number_network_status(cls, access_number):
+        """
+        根据access_number查询是否单独断网
+        @param access_number: 11位接入号码
+        @return: 当前网络数据
+        """
+        try:
+            result = TelecomObject().query_product_information(access_number)
+            if not result:
+                return None
+            if result and result['result_code']:
+                # 获取产品信息
+                prod_infos = result["result"]["SvcCont"]["result"]["prodInfos"]
+
+                # 获取 funProdInfos 列表
+                fun_prod_infos = prod_infos["funProdInfos"]
+
+                # 遍历 funProdInfos 列表
+                for prod_info in fun_prod_infos:
+
+                    # 获取是否已单独断网信息
+                    if isinstance(prod_info, dict) and "productName" in prod_info:
+                        is_disconnect = prod_info.get("productName")
+                        if "是否已单独断网" in is_disconnect:
+                            is_disconnect_value = re.search(r"(?<=:).+", is_disconnect).group(0)
+                            # 进行判断
+                            if is_disconnect_value == "否":
+                                return 'disconnect'
+                            else:
+                                return 'connect'
+            return None
+        except Exception as e:
+            print('***{}get_access_number_network_status,errLine:{}, errMsg:{}'
+                  .format(access_number, e.__traceback__.tb_lineno, repr(e)))
+            return None