Ver código fonte

新增联通4G消息推送API

zhangdongming 3 anos atrás
pai
commit
d40c90d6eb
3 arquivos alterados com 196 adições e 0 exclusões
  1. 3 0
      AnsjerPush/urls.py
  2. 127 0
      Controller/ComboCron/ComboCronPushController.py
  3. 66 0
      Model/models.py

+ 3 - 0
AnsjerPush/urls.py

@@ -19,6 +19,8 @@ from Controller import DetectController, ShadowController, TestDetectController,
     AiController, TestController, gatewayController
 from django.conf.urls import url
 
+from Controller.ComboCron import ComboCronPushController
+
 urlpatterns = [
     path('admin/', admin.site.urls),
     path('notify/push', DetectController.NotificationView.as_view()),
@@ -36,4 +38,5 @@ urlpatterns = [
 
     url('testDetect/testJpush', TestController.testDetect),
     url('testDetect/testApns', TestController.testDetectApns),
+    url('unicom/device/combo/(?P<operation>.*)$', ComboCronPushController.ComboCronPushView.as_view())
 ]

+ 127 - 0
Controller/ComboCron/ComboCronPushController.py

@@ -0,0 +1,127 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : ComboCronPushController.py
+@Time    : 2022/7/8 19:52
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import logging
+import time
+import traceback
+
+from django.db.models import Q
+from django.views import View
+
+from Model.models import UnicomComboOrderInfo, UnicomDeviceInfo, GatewayPush
+from Object.ResponseObject import ResponseObject
+from Service.GatewayService import GatewayPushService
+
+
+class ComboCronPushView(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):
+        print(request_dict)
+        print(request)
+        response = ResponseObject()
+        if operation == 'expire-push':
+            return self.combo_expire_push(response)
+        else:
+            return response.json(404)
+
+    @classmethod
+    def combo_expire_push(cls, response):
+        logger = logging.getLogger('info')
+        logger.info('进入流量包过期消息推送')
+        try:
+            now_time = int(time.time())
+            combo_order_qs = UnicomComboOrderInfo.objects.filter(
+                ~Q(status=2) & Q(expire_time__gt=now_time + 3600 * 144) & Q(
+                    expire_time__lte=(now_time + 3600 * 168)), is_del=False).values()
+            if combo_order_qs.exists():
+                cls.phone_msg_push(combo_order_qs)
+            combo_order_qs = UnicomComboOrderInfo.objects.filter(
+                ~Q(status=2) & Q(expire_time__gt=now_time + 3600 * 48) & Q(
+                    expire_time__lte=(now_time + 3600 * 72)), is_del=False).values()
+            if combo_order_qs.exists():
+                cls.phone_msg_push(combo_order_qs)
+            return response.json(0)
+        except Exception as e:
+            print(e.args)
+            ex = traceback.format_exc()
+            print(ex)
+            return response.json(177, ex)
+
+    @classmethod
+    def phone_msg_push(cls, combo_order_qs):
+        """
+        消息推送
+        """
+        mow_time = int(time.time())
+        logger = logging.getLogger('info')
+        for item in combo_order_qs:
+            iccid = item['iccid']
+            device_info = UnicomDeviceInfo.objects.filter(iccid=iccid).values()
+            if not device_info.exists():
+                continue
+            nickname = device_info.first()['serial_no']
+            user_id = device_info.first()['user_id']
+            if not user_id:
+                continue
+
+            # 查询推送配置数据
+            push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
+                values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang', 'm_code',
+                       'tz')
+            if not push_qs.exists():
+                continue
+            for push_vo in push_qs:
+                kwargs = {
+                    'n_time': mow_time,
+                    'event_type': 1,
+                    'nickname': nickname,
+                }
+
+                push_type = push_vo['push_type']
+                token_val = push_vo['token_val']
+                lang = push_vo['lang']
+                app_bundle_id = push_vo['app_bundle_id']
+
+                # 获取推送所需数据
+                msg_title = GatewayPushService.get_msg_title(app_bundle_id, nickname)
+                if lang == 'cn':
+                    sys_msg_text = "温馨提示:尊敬的客户,您" + nickname + "设备4G流量套餐将在" + time.strftime("%Y-%m-%d", time.localtime(
+                        item['expire_time'])) + "到期"
+                else:
+                    sys_msg_text = 'Dear customer,the flow package for your device ' + nickname + ' will expire on ' + \
+                                   time.strftime('%m-%d-%y', time.localtime(item['expire_time']))
+                kwargs['app_bundle_id'] = app_bundle_id
+                kwargs['token_val'] = token_val
+                kwargs['msg_title'] = msg_title
+                kwargs['msg_text'] = sys_msg_text
+
+                try:
+                    # ios apns
+                    if push_type == 0:
+                        GatewayPushService.ios_apns_push(**kwargs)
+                    # android gcm
+                    elif push_type == 1:
+                        GatewayPushService.android_fcm_push(**kwargs)
+                    # android 极光推送
+                    elif push_type == 2:
+                        GatewayPushService.android_jpush(**kwargs)
+
+                except Exception as e:
+                    logger.info('4G流量预警推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                    continue
+        return True

+ 66 - 0
Model/models.py

@@ -2246,3 +2246,69 @@ class SensorRecord(models.Model):
         verbose_name_plural = verbose_name
         app_label = 'db2'
 
+
+class UnicomCombo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记Id')
+    package_id = models.CharField(default='', max_length=32, verbose_name=u'联通套餐id')
+    combo_name = models.CharField(default='', max_length=32, verbose_name=u'套餐名称')
+    status = models.SmallIntegerField(default=0, verbose_name='状态{0:开启,1:停用}')
+    # 套餐类型 0:商用,1:初始化赠送
+    combo_type = models.SmallIntegerField(default=0, verbose_name='套餐类型')
+    flow_total = models.IntegerField(default=0, blank=True, verbose_name=u'流量总量值 单位(MB)')
+    expiration_days = models.IntegerField(default=0, blank=True, verbose_name=u'有效期天数')
+    expiration_type = models.SmallIntegerField(default=0, verbose_name=u'有效期类型,0=天,1=月,2=年')
+    pay_type = models.ManyToManyField(to='Pay_Type', verbose_name='付款类型', db_table='unicom_combo_pay_type')
+    price = models.CharField(blank=True, max_length=32, verbose_name=u'价格')
+    sort = models.IntegerField(default=0, blank=True, verbose_name=u'排序,越小越靠前')
+    remark = models.TextField(blank=True, default='', verbose_name=u'描述信息')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    is_show = models.SmallIntegerField(default=1, verbose_name=u'是否显示,0:不显示,1:显示')
+    is_del = models.BooleanField(blank=True, default=False, verbose_name=u'是否删除默认false')
+
+    class Meta:
+        db_table = 'unicom_combo'
+        verbose_name = '联通套餐表'
+        verbose_name_plural = verbose_name
+
+
+class UnicomComboOrderInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记Id')
+    iccid = models.CharField(default='', max_length=32, verbose_name=u'完整的20位纯数字ICCID')
+    renew_list_id = models.CharField(blank=True, default='', max_length=32, verbose_name=u'联通订购成功套餐队列id')
+    status = models.SmallIntegerField(default=0, verbose_name='状态{0:未使用,1:已使用,2:已过期}')
+    order_id = models.CharField(blank=True, default='', max_length=32, verbose_name=u'关联订单表')
+    combo = models.ForeignKey(UnicomCombo, to_field='id', default='', on_delete=models.CASCADE,
+                              verbose_name=u'联通套餐表')
+    year = models.IntegerField(default=0, verbose_name='使用年')
+    month = models.IntegerField(default=0, verbose_name='使用月')
+    flow_total_usage = models.CharField(blank=True, default='', max_length=32, verbose_name=u'激活时当月已用流量')
+    sort = models.IntegerField(default=99, blank=True, verbose_name=u'排序')
+    next_month_activate = models.BooleanField(blank=True, default=False, verbose_name=u'下月激活')
+    activation_time = models.IntegerField(default=0, verbose_name='激活时间')
+    expire_time = models.IntegerField(default=0, verbose_name='过期时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    is_del = models.BooleanField(blank=True, default=False, verbose_name=u'是否删除')
+
+    class Meta:
+        db_table = 'unicom_combo_order_info'
+        verbose_name = '联通套餐订单信息表'
+        verbose_name_plural = verbose_name
+
+
+class UnicomDeviceInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记Id')
+    iccid = models.CharField(db_index=True, unique=True, max_length=32, verbose_name=u'完整的20位纯数字ICCID')
+    status = models.SmallIntegerField(default=0, verbose_name=u'状态{0:可测试,1:测试完成,2:已使用}')
+    serial_no = models.CharField(default='', max_length=32, verbose_name=u'设备序列号')
+    user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
+    main_card = models.SmallIntegerField(default=0, verbose_name=u'状态{0:主卡,1:拔插卡}')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'unicom_device_info'
+        verbose_name = '联通设备信息'
+        verbose_name_plural = verbose_name
+