12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- # -*- encoding: utf-8 -*-
- """
- @File : TelecomService.py
- @Time : 2024/1/24 15:12
- @Author : stephen
- @Email : zhangdongming@asj6.wecom.work
- @Software: PyCharm
- """
- import time
- from decimal import Decimal
- from Ansjer.config import LOGGER
- from Model.models import UnicomDeviceInfo
- from Object.RedisObject import RedisObject
- from Object.TelecomObject import TelecomObject
- class TelecomService:
- @classmethod
- def query_total_usage_by_access_number(cls, iccid, access_number, key, expire=600):
- """
- 根据接入号码查询设备总流量使用量(实现缓存)
- @param iccid: 20位ICCID
- @param key: 缓存key
- @param expire: 失效时间
- @param access_number: 接入号码
- @return: 查询流量结果
- """
- redis = RedisObject()
- sim_flow_used_total = redis.get_data(key)
- if sim_flow_used_total:
- return Decimal(sim_flow_used_total).quantize(Decimal('0.00'))
- else:
- # 查询SIM卡信息
- sim_qs = UnicomDeviceInfo.objects.filter(iccid=iccid)
- if not sim_qs:
- return None
- sim_vo = sim_qs.first()
- telecom = TelecomObject()
- data = telecom.query_total_usage_by_date(access_number)
- if data and data['SvcCont']['resultCode'] == '0' and 'dataCumulationTotal' in data['SvcCont']['result']:
- cycle_total = data['SvcCont']['result'].get('dataCumulationTotal')
- else:
- LOGGER.info(f'query_total_usage_by_access_number查询流量异常,iccid:{iccid}')
- return sim_vo.sim_used_flow + sim_vo.sim_cycle_used_flow
- cycle_total = Decimal(cycle_total).quantize(Decimal('0.00'))
- n_time = int(time.time())
- # 判断数据库周期流量用量 是否大于API查询出来的周期用量 如果是则判定进入了下一个周期
- if sim_vo.sim_cycle_used_flow != 0 and sim_vo.sim_cycle_used_flow > cycle_total:
- sim_used_flow = sim_vo.sim_used_flow + sim_vo.sim_cycle_used_flow
- sim_qs.update(
- sim_used_flow=sim_used_flow,
- sim_cycle_used_flow=cycle_total,
- updated_time=n_time
- )
- # 队列用量历史总量 + 上一个周期流量 + 当前周期流量 = 总消耗流量
- sim_flow_used_total = sim_used_flow + cycle_total
- elif cycle_total > sim_vo.sim_cycle_used_flow: # API周期用量大于当前数据库用量则更新记录
- sim_qs.update(sim_cycle_used_flow=cycle_total, updated_time=n_time)
- # 队列用量历史总量 + 当前周期流量 = 总消耗流量
- 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
|