Browse Source

新增物联网卡订单用量历史

zhangdongming 1 year ago
parent
commit
125fabd9c4
2 changed files with 88 additions and 1 deletions
  1. 67 1
      Controller/UnicomCombo/UnicomComboTaskController.py
  2. 21 0
      Model/models.py

+ 67 - 1
Controller/UnicomCombo/UnicomComboTaskController.py

@@ -19,11 +19,12 @@ from django.db.models import Q
 from django.views import View
 from django.views import View
 
 
 from Model.models import UnicomComboOrderInfo, UnicomCombo, Order_Model, UnicomDeviceInfo, UnicomFlowPush, \
 from Model.models import UnicomComboOrderInfo, UnicomCombo, Order_Model, UnicomDeviceInfo, UnicomFlowPush, \
-    IotCardUsageHistory, AccessNumberTaskQueue
+    IotCardUsageHistory, AccessNumberTaskQueue, IotCardOrderUsageHistory
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TelecomObject import TelecomObject
 from Object.TelecomObject import TelecomObject
 from Object.UnicomObject import UnicomObjeect
 from Object.UnicomObject import UnicomObjeect
+from Object.utils import LocalDateTimeUtil
 from Service.TelecomService import TelecomService
 from Service.TelecomService import TelecomService
 
 
 logger = logging.getLogger('info')
 logger = logging.getLogger('info')
@@ -69,6 +70,8 @@ class UnicomComboTaskView(View):
             return self.update_device_cycle_flow(response)
             return self.update_device_cycle_flow(response)
         elif operation == 'executeAccessTask':
         elif operation == 'executeAccessTask':
             return self.get_access_number_change_task(response)
             return self.get_access_number_change_task(response)
+        elif operation == 'queryTotalTrafficToday':
+            return self.query_total_traffic_today(response)
         else:
         else:
             return response.json(414)
             return response.json(414)
 
 
@@ -613,3 +616,66 @@ class UnicomComboTaskView(View):
                     continue
                     continue
         except Exception as e:
         except Exception as e:
             logger.info('异步变更卡网络状态异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             logger.info('异步变更卡网络状态异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def query_total_traffic_today(response):
+        """
+        4G订单查询今日总流量消耗
+        @return:
+        """
+        asy = threading.Thread(target=UnicomComboTaskView.async_save_today_use_float)
+        asy.start()
+        logger.info('查询4G订单总消耗流量记录')
+        return response.json(0)
+
+    @staticmethod
+    def async_save_today_use_float():
+        # 查询正在使用套餐并且大于等于2024年激活 不等于免费测试流量的订单数据
+        today = datetime.datetime.today()
+        yesterday = today - datetime.timedelta(days=1)
+        yesterday = yesterday.strftime('%Y%m%d')
+
+        start_time, end_time = LocalDateTimeUtil.get_start_and_end_time(today.strftime('%Y-%m-%d'), '%Y-%m-%d')
+        o_combo_qs = UnicomComboOrderInfo.objects \
+            .filter(status=1, year__gte=2024, created_time__gte=1714492800, created_time__lt=start_time) \
+            .exclude(combo__combo_type=4) \
+            .values('order_id', 'iccid', 'flow_total_usage')
+        try:
+            unicom_api = UnicomObjeect()
+            if not o_combo_qs.exists():
+                return
+
+            n_time = int(time.time())
+            day = yesterday[-2:]
+            iccid_list = []
+            for item in o_combo_qs:
+                iccid = item['iccid']
+                try:
+                    flow = float(unicom_api.get_flow_usage_total(iccid))
+                    if flow == 0:
+                        continue
+                    old_flow = float(item['flow_total_usage'])
+                    if flow == old_flow:
+                        continue
+                    total_usage = Decimal(flow - old_flow).quantize(Decimal('0.00'))
+                    iccid_list.append(IotCardOrderUsageHistory(
+                        iccid=iccid,
+                        order_id=item['order_id'],
+                        card_type=1,
+                        cycle=int(yesterday),  # 将日期转换为整数形式,如202201
+                        cycle_date=int(day),
+                        total_traffic=total_usage,
+                        created_time=n_time,
+                        updated_time=n_time
+                    ))
+                    if len(iccid_list) >= 300:
+                        IotCardOrderUsageHistory.objects.bulk_create(iccid_list)
+                        iccid_list = []
+                except Exception as e:
+                    logger.error(
+                        '查询日用量异常iccid{},errLine:{}, errMsg:{}'.format(iccid, e.__traceback__.tb_lineno, repr(e)))
+
+            if iccid_list:
+                IotCardOrderUsageHistory.objects.bulk_create(iccid_list)
+        except Exception as e:
+            logger.error('统计4G卡日用量异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 21 - 0
Model/models.py

@@ -4606,6 +4606,27 @@ class CityInformation(models.Model):
         verbose_name_plural = verbose_name
         verbose_name_plural = verbose_name
 
 
 
 
+class IotCardOrderUsageHistory(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='列表主键')
+    iccid = models.CharField(default='', db_index=True, max_length=32, verbose_name=u'ICCID号')
+    order_id = models.CharField(max_length=30, db_index=True, verbose_name='订单ID', blank=True, default='')
+    serial_no = models.CharField(max_length=32, default='', verbose_name='设备序列号')
+    card_type = models.SmallIntegerField(default=0, verbose_name='卡类型,1:联通,2:电信,3:移动,4:其它,5:国际')
+    cycle = models.IntegerField(default=0, verbose_name='帐期 如 202307')
+    cycle_date = models.IntegerField(default=0, verbose_name='帐期 如 1-31')
+    total_traffic = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'订单流量用量(MB)')
+    cycle_start_time = models.DateTimeField(null=True, blank=True, verbose_name='帐期开始时间')
+    cycle_end_time = models.DateTimeField(null=True, blank=True, verbose_name='帐期结束时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='修改时间')
+    remark = models.CharField(blank=True, default='', max_length=200, verbose_name=u'备注')
+
+    class Meta:
+        db_table = 'iot_card_order_usage_history'
+        verbose_name = '物联网卡订单用量历史'
+        verbose_name_plural = verbose_name
+
+
 class IPAddr(models.Model):
 class IPAddr(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     id = models.AutoField(primary_key=True, verbose_name='主键')
     ip = models.CharField(default='', max_length=32, verbose_name='ip')
     ip = models.CharField(default='', max_length=32, verbose_name='ip')