Pārlūkot izejas kodu

新增鼎芯API,优化添加4G设备绑定用户id,新增联通无限流量兑换码功能,优化同步uid数据增加判断

zhangdongming 2 gadi atpakaļ
vecāks
revīzija
ff3c331afc

+ 23 - 13
AdminController/UnicomManageController.py

@@ -8,13 +8,14 @@ import hashlib
 import json
 import time
 import uuid
-from Ansjer.config import CONFIG_INFO
+
 import openpyxl
 import requests
 from django.db import transaction, connection
 from django.http import HttpResponse
 from django.views.generic.base import View
 
+from Ansjer.config import CONFIG_INFO
 from Ansjer.config import LOGGER
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, UnicomComboOrderInfo, Device_User, Order_Model, \
@@ -239,7 +240,7 @@ class UnicomManageControllerView(View):
             return response.json(0, {'list': list_data, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
     def query_sql_4g():
@@ -390,7 +391,7 @@ class UnicomManageControllerView(View):
                     UnicomCombo.objects.create(**re_data).pay_type.set(pay_type)
                 return response.json(0)
             except Exception as e:
-                return response.json(500, repr(e))
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
     def get_unicom_info(request_dict, response):
@@ -446,7 +447,7 @@ class UnicomManageControllerView(View):
             return response.json(0, {'list': combo_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @classmethod
     def get_pay_type(cls, response):
@@ -554,7 +555,7 @@ class UnicomManageControllerView(View):
             return response.json(0, {'list': list_data})
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @classmethod
     def get_flow_packages(cls, request_dict, response):
@@ -615,7 +616,7 @@ class UnicomManageControllerView(View):
                 return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @classmethod
     def get_iccid_info(cls, request_dict, response):
@@ -633,7 +634,7 @@ class UnicomManageControllerView(View):
             return response.json(0, res_dict['data']['status'])
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @classmethod
     def package_cdk_export_excel(cls, response):
@@ -668,7 +669,7 @@ class UnicomManageControllerView(View):
         except Exception as e:
             LOGGER.info('*****UnicomManageController.package_cdk_export_excel:errLine:{}, errMsg:{}'
                         .format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
     def fix_string_length(code_no):
@@ -697,7 +698,7 @@ class UnicomManageControllerView(View):
             combo = combo_qs.first()
             exchange_code_list = []
             now_time = int(time.time())
-            if combo.combo_type == 3:
+            if combo.combo_type == 3:  # 五兴电信
                 for i in range(int(quantity)):
                     # 10位兑换码 后面两位为标识代表五兴电信
                     code = cls.generate_code() + 'WD'
@@ -706,14 +707,23 @@ class UnicomManageControllerView(View):
                                                            expire_time=0,
                                                            created_time=now_time,
                                                            updated_time=now_time))
-                if exchange_code_list:
-                    ExchangeCode.objects.bulk_create(exchange_code_list)
+            elif combo.combo_type == 0:  # 珠海联通
+                for i in range(int(quantity)):
+                    # 10位兑换码 后面两位为标识代表五兴电信
+                    code = cls.generate_code() + 'ZL'
+                    exchange_code_list.append(ExchangeCode(code=code, status=False, is_down=0,
+                                                           package_type=0, package_id=combo.id,
+                                                           expire_time=0,
+                                                           created_time=now_time,
+                                                           updated_time=now_time))
+            if exchange_code_list:
+                ExchangeCode.objects.bulk_create(exchange_code_list)
                 return response.json(0)
-            return response.json(0)
+            return response.json(178)
         except Exception as e:
             LOGGER.info('*****UnicomManageController.create_package_cdk:errLine:{}, errMsg:{}'
                         .format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @classmethod
     def generate_code(cls):

+ 7 - 0
Ansjer/config.py

@@ -481,3 +481,10 @@ WX_TECH_URL = 'http://www.wxkjwlw.com'
 WX_TECH_APP_KEY = 'PHNSIzLG9Ciyla3aiOuBuN17U0qk5mM4'
 # 五兴接口密钥
 TWX_TECH_SECRET = '9477ace7e28f4d3fabae63a786d53d81'
+
+# 鼎芯科技baseUrl
+DX_TECH_URL = 'https://oapi.eiotclub.com'
+# 鼎芯接口appKey
+DX_TECH_APP_KEY = '19b92a9a5e56429e97f271855ce731b2'
+# 鼎芯接口secret
+DX_TECH_SECRET = '6627548e7cfe4044add7ea72ae3391e0'

+ 3 - 1
Controller/EquipmentManagerV3.py

@@ -380,7 +380,9 @@ class EquipmentManagerV3(View):
             if not unicom_device_info_qs[0].user_id:
                 # 生成4G免费订单
                 UnicomComboView.experience_order_4G(unicom_device_info_qs[0].iccid,
-                                                    serial_number, user_id, True)
+                                                    serial_number, user_id, False)
+                UnicomDeviceInfo.objects.filter(iccid=unicom_device_info_qs[0].iccid) \
+                    .update(user_id=user_id, updated_time=int(time.time()))
             return True
         except Exception as e:
             logging.info('创建体验4G订单异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 22 - 8
Controller/UnicomCombo/UnicomComboController.py

@@ -21,6 +21,7 @@ from django.views.generic.base import View
 from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, Order_Model, Store_Meal, AiStoreMeal, \
     UnicomComboOrderInfo, UnicomComboExperienceHistory, UnicomDeviceStatusChangePush, SysMsgModel, UnicomFlowPush, \
     LogModel
+from Object.EIoTClubObject import EIoTClubObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -384,13 +385,6 @@ class UnicomComboView(View):
                 # 待完善代码 根据uid与用户id验证系统设备mdcmd
                 unicom_device_qs = UnicomDeviceInfo.objects.filter(iccid=iccid)
                 if unicom_device_qs.exists():
-                    # if unicom_device_qs.first().status == 1:
-                    #     key = 'ASJ:UNICOM:RESET:{}'.format(serial_no)
-                    #     reset_cache = redis.get_data(key)
-                    #     if reset_cache:
-                    #         logger.info('--->三十分后再次访问接口生效赠送流量套餐')
-                    #         return response.json(0, 'Thirty minutes later to visit again take effect')
-                    #     cls.user_activate_flow(iccid)
                     if unicom_device_qs.first().serial_no != serial_no:
                         unicom_device_qs.update(main_card=sim, updated_time=n_time, serial_no=serial_no)
                         cls.create_operation_log('unicom/api/device-bind',
@@ -403,7 +397,12 @@ class UnicomComboView(View):
                 unicom_obj = UnicomObjeect()
                 params = {'iccid': iccid, 'serial_no': serial_no, 'updated_time': n_time,
                           'created_time': n_time, 'main_card': sim}
-                if cls.check_iccid(iccid):
+                if cls.is_dingxin_iot(iccid):  # 鼎芯物联卡
+                    params['card_type'] = 5  # 国际
+                    params['status'] = 2
+                    UnicomDeviceInfo.objects.create(**params)
+                    return response.json(0)
+                if cls.check_iccid(iccid):  # 五兴物联卡
                     params['card_type'] = 1
                     params['status'] = 2
                     UnicomDeviceInfo.objects.create(**params)
@@ -429,6 +428,21 @@ class UnicomComboView(View):
             logger.info('--->设备调用4G注册接口异常:{}'.format(ex))
             return response.json(177, repr(e))
 
+    @classmethod
+    def is_dingxin_iot(cls, iccid):
+        """
+        根据iccid判断是否鼎芯国际卡
+        """
+        try:
+            dx_iot = EIoTClubObject()
+            params = {'iccid': iccid}
+            result = dx_iot.get_cards_info('v3', **params)
+            assert result['code'] == '200'
+            return True
+        except Exception as e:
+            print(repr(e))
+            return False
+
     @classmethod
     def check_iccid(cls, iccid):
         """

+ 46 - 24
Controller/UnicomCombo/WXTechController.py

@@ -97,7 +97,7 @@ class WXTechController(View):
             except Exception as e:
                 LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
-                return response.json(500, repr(e))
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
         @classmethod
         def get_cards_info(cls, request_dict, response):
@@ -116,7 +116,7 @@ class WXTechController(View):
             except Exception as e:
                 LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
-                return response.json(500, repr(e))
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
         @classmethod
         def get_experience_package(cls, request_dict, response):
@@ -148,7 +148,7 @@ class WXTechController(View):
             except Exception as e:
                 LOGGER.info('*****WXTechController.get_experience_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
-                return response.json(500, repr(e))
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
         @classmethod
         def create_order_package(cls, request_dict, response):
@@ -189,7 +189,7 @@ class WXTechController(View):
             except Exception as e:
                 LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
-                return response.json(500, repr(e))
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
         @classmethod
         def created_order(cls, serial_no, user_id, trade_no, combo_id=None, pay_type=10):
@@ -220,7 +220,7 @@ class WXTechController(View):
                           'store_meal_name': combo_info_vo['combo_name'],
                           'trade_no': trade_no}
             Order_Model.objects.create(**order_dict)
-            return True
+            return order_id
 
         @classmethod
         def delete_card_package(cls, request_dict, response):
@@ -250,7 +250,7 @@ class WXTechController(View):
             except Exception as e:
                 LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
-                return response.json(500, repr(e))
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
         @classmethod
         def wx_exchange_package(cls, request_dict, response, request, user_id):
@@ -267,14 +267,13 @@ class WXTechController(View):
                 # 校验兑换码格式是否正确
                 if not (code.isalnum() and len(code) == 10):
                     return response.json(10040)  # 兑换码格式错误
-                card_type = 1
-                device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number, card_type=card_type) \
+                device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
                     .values('iccid')
                 if not device_info_qs.exists():
                     return response.json(173)  # 设备信息不存在
                 #  查询兑换码信息
-                exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False, package_type=card_type) \
-                    .values('package_id', 'expire_time')
+                exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False) \
+                    .values('package_id', 'expire_time', 'package_type')
                 if not exchange_code_qs.exists():
                     return response.json(10040)  # 兑换码无效
                 combo_id = exchange_code_qs[0]['package_id']
@@ -285,26 +284,49 @@ class WXTechController(View):
                     return response.json(173)
                 package_code = package_info_qs[0]['package_id']
                 iccid = device_info_qs[0]['iccid']
-                # 五兴订购流量包请求参数
-                data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
-                        'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
-                wx_tech = WXTechObject()
-                # 请求五兴API订购套餐接口
-                res = wx_tech.create_order_package(**data)
-                LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
-                if res['code'] == '0':
-                    trade_no = res['data']['orderNumber']
-                    cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
-                    exchange_code_qs.update(status=True, updated_time=int(time.time()))
-                    cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
-                    return response.json(0)
+                # 兑换码套餐类型
+                package_type = exchange_code_qs[0]['package_type']
+                if package_type == 0:  # 联通无限流量兑换码
+                    result = cls.exchange_unicom_package(serial_number, iccid,
+                                                         user_id, combo_id)
+                    if result:
+                        exchange_code_qs.update(status=True, updated_time=int(time.time()))
+                        cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
+                        return response.json(0)
+                elif package_type == 1:  # 五兴电信无限流量兑换码
+                    # 五兴订购流量包请求参数
+                    data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
+                            'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
+                    wx_tech = WXTechObject()
+                    # 请求五兴API订购套餐接口
+                    res = wx_tech.create_order_package(**data)
+                    LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
+                    if res['code'] == '0':
+                        trade_no = res['data']['orderNumber']
+                        cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
+                        exchange_code_qs.update(status=True, updated_time=int(time.time()))
+                        cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
+                        return response.json(0)
                 cls.save_log(ip, 10040, '兑换失败{},{}'.format(serial_number, code))
                 return response.json(10040)
             except Exception as e:
                 LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                 cls.save_log(ip, 500, '兑换内部错误')
-                return response.json(500, repr(e))
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+        @classmethod
+        def exchange_unicom_package(cls, serial_number, iccid, user_id, combo_id):
+            try:
+                # 通过兑换码创建订单记录
+                order_id = cls.created_order(serial_number, user_id, 'ansjer', combo_id, 11)
+                # 根据订单信息创建流量套餐包
+                UnicomComboView.create_combo_order_info(order_id, 0, iccid, combo_id)
+                return True
+            except Exception as e:
+                LOGGER.info('*****WXTechController.exchange_unicom_package:errLine:{}, errMsg:{}'
+                            .format(e.__traceback__.tb_lineno, repr(e)))
+                return False
 
         @staticmethod
         def save_log(ip, code, operation):

+ 2 - 2
Model/models.py

@@ -2939,9 +2939,9 @@ 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'设备序列号')
+    serial_no = models.CharField(default='', db_index=True, max_length=32, verbose_name=u'设备序列号')
     user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
-    card_type = models.SmallIntegerField(default=0, verbose_name=u'状态{0:联通,1:电信,2:移动}')
+    card_type = models.SmallIntegerField(default=0, verbose_name=u'状态{0:联通,1:电信,2:移动,4:其它,5:国际}')
     main_card = models.SmallIntegerField(default=0, verbose_name=u'SIM卡类型{0:拔插卡,1:贴片卡}')
     sim_used_flow = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'sim卡已用总流量(MB)')
     sim_cycle_used_flow = models.DecimalField(default=0, max_digits=10, decimal_places=2,

+ 89 - 0
Object/EIoTClubObject.py

@@ -0,0 +1,89 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : EIoTClubObject.py
+@Time    : 2023/7/18 10:49
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import json
+import random
+import time
+
+import requests
+
+from Ansjer.config import DX_TECH_URL, DX_TECH_SECRET, LOGGER, DX_TECH_APP_KEY
+from Object.UnicomObject import UnicomObjeect
+from Object.WXTechObject import WXTechObject
+
+
+class EIoTClubObject:
+
+    def __init__(self):
+        self.headers = {'content-type': 'application/json'}
+
+    @staticmethod
+    def get_system_params():
+        """
+        请求接口必传系统参数
+        """
+        nonce = ''.join(str(random.choice(range(1, 10))) for _ in range(5))
+        return {
+            'appkey': DX_TECH_APP_KEY,
+            'nonce': int(nonce),
+            'timestamp': int(time.time()),
+        }
+
+    @staticmethod
+    def get_request_params(**params):
+        """
+        将业务参数与系统参数合并后进行加签得到请求参数体
+        """
+        iot_obj = WXTechObject()
+
+        # 获取请求系统参数
+        data = EIoTClubObject().get_system_params()
+        # 系统参数与业务参数合并
+        params = dict(data, **params)
+        # 合并参数后进行升序加密得到sign
+        sign = iot_obj.getSign(DX_TECH_SECRET, **params)
+        params['sign'] = sign
+        params = json.dumps(params)
+        LOGGER.info('*****鼎芯API请求数据:{}'.format(params))
+        return params
+
+    def dx_service_api(self, url, **params):
+        """
+        @param url 请求地址
+        @param 业务必填参数
+        鼎芯业务API 统一封装加签请求
+        """
+        # 系统参数合并业务参数并加签得到请求参数
+        rq_body = self.get_request_params(**params)
+        response = requests.post(url, data=rq_body, headers=self.headers)
+        assert response.status_code == 200
+        return UnicomObjeect().get_text_dict(response)
+
+    @staticmethod
+    def get_cards_info(api_version, **params):
+        """
+        根据卡号,获取单卡信息及流量使用信息
+        @param api_version: api版本号
+        @param params: iccid、operator
+        @return: 卡信息
+        """
+        url = DX_TECH_URL + f'/api/{api_version}/card/getCardsInfo'
+        params['operator'] = 5  # 国际
+        return EIoTClubObject().dx_service_api(url, **params)
+
+    @staticmethod
+    def query_order_package_list(api_version, **params):
+        """
+        查询iccid可订购套餐列表
+        @param api_version: api版本号
+        @param params: iccid、operator
+        @return: 卡信息
+        """
+        url = DX_TECH_URL + f'/api/{api_version}/package/listOrderPackageByIccid'
+        params['operator'] = 5  # 国际
+        return EIoTClubObject().dx_service_api(url, **params)