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 Model.models import UnicomComboOrderInfo, UnicomCombo, Order_Model, UnicomDeviceInfo, UnicomFlowPush, \
-    IotCardUsageHistory, AccessNumberTaskQueue
+    IotCardUsageHistory, AccessNumberTaskQueue, IotCardOrderUsageHistory
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TelecomObject import TelecomObject
 from Object.UnicomObject import UnicomObjeect
+from Object.utils import LocalDateTimeUtil
 from Service.TelecomService import TelecomService
 
 logger = logging.getLogger('info')
@@ -69,6 +70,8 @@ class UnicomComboTaskView(View):
             return self.update_device_cycle_flow(response)
         elif operation == 'executeAccessTask':
             return self.get_access_number_change_task(response)
+        elif operation == 'queryTotalTrafficToday':
+            return self.query_total_traffic_today(response)
         else:
             return response.json(414)
 
@@ -613,3 +616,66 @@ class UnicomComboTaskView(View):
                     continue
         except Exception as 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
 
 
+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):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     ip = models.CharField(default='', max_length=32, verbose_name='ip')