Bladeren bron

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

zhangdongming 2 jaren geleden
bovenliggende
commit
ff3c331afc

+ 23 - 13
AdminController/UnicomManageController.py

@@ -8,13 +8,14 @@ import hashlib
 import json
 import json
 import time
 import time
 import uuid
 import uuid
-from Ansjer.config import CONFIG_INFO
+
 import openpyxl
 import openpyxl
 import requests
 import requests
 from django.db import transaction, connection
 from django.db import transaction, connection
 from django.http import HttpResponse
 from django.http import HttpResponse
 from django.views.generic.base import View
 from django.views.generic.base import View
 
 
+from Ansjer.config import CONFIG_INFO
 from Ansjer.config import LOGGER
 from Ansjer.config import LOGGER
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, UnicomComboOrderInfo, Device_User, Order_Model, \
 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})
             return response.json(0, {'list': list_data, 'total': total})
         except Exception as e:
         except Exception as e:
             print(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
     @staticmethod
     def query_sql_4g():
     def query_sql_4g():
@@ -390,7 +391,7 @@ class UnicomManageControllerView(View):
                     UnicomCombo.objects.create(**re_data).pay_type.set(pay_type)
                     UnicomCombo.objects.create(**re_data).pay_type.set(pay_type)
                 return response.json(0)
                 return response.json(0)
             except Exception as e:
             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
     @staticmethod
     def get_unicom_info(request_dict, response):
     def get_unicom_info(request_dict, response):
@@ -446,7 +447,7 @@ class UnicomManageControllerView(View):
             return response.json(0, {'list': combo_list, 'total': total})
             return response.json(0, {'list': combo_list, 'total': total})
         except Exception as e:
         except Exception as e:
             print(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
     @classmethod
     def get_pay_type(cls, response):
     def get_pay_type(cls, response):
@@ -554,7 +555,7 @@ class UnicomManageControllerView(View):
             return response.json(0, {'list': list_data})
             return response.json(0, {'list': list_data})
         except Exception as e:
         except Exception as e:
             print(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
     @classmethod
     def get_flow_packages(cls, request_dict, response):
     def get_flow_packages(cls, request_dict, response):
@@ -615,7 +616,7 @@ class UnicomManageControllerView(View):
                 return response.json(0)
                 return response.json(0)
         except Exception as e:
         except Exception as e:
             print(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
     @classmethod
     def get_iccid_info(cls, request_dict, response):
     def get_iccid_info(cls, request_dict, response):
@@ -633,7 +634,7 @@ class UnicomManageControllerView(View):
             return response.json(0, res_dict['data']['status'])
             return response.json(0, res_dict['data']['status'])
         except Exception as e:
         except Exception as e:
             print(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
     @classmethod
     def package_cdk_export_excel(cls, response):
     def package_cdk_export_excel(cls, response):
@@ -668,7 +669,7 @@ class UnicomManageControllerView(View):
         except Exception as e:
         except Exception as e:
             LOGGER.info('*****UnicomManageController.package_cdk_export_excel:errLine:{}, errMsg:{}'
             LOGGER.info('*****UnicomManageController.package_cdk_export_excel:errLine:{}, errMsg:{}'
                         .format(e.__traceback__.tb_lineno, repr(e)))
                         .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
     @staticmethod
     def fix_string_length(code_no):
     def fix_string_length(code_no):
@@ -697,7 +698,7 @@ class UnicomManageControllerView(View):
             combo = combo_qs.first()
             combo = combo_qs.first()
             exchange_code_list = []
             exchange_code_list = []
             now_time = int(time.time())
             now_time = int(time.time())
-            if combo.combo_type == 3:
+            if combo.combo_type == 3:  # 五兴电信
                 for i in range(int(quantity)):
                 for i in range(int(quantity)):
                     # 10位兑换码 后面两位为标识代表五兴电信
                     # 10位兑换码 后面两位为标识代表五兴电信
                     code = cls.generate_code() + 'WD'
                     code = cls.generate_code() + 'WD'
@@ -706,14 +707,23 @@ class UnicomManageControllerView(View):
                                                            expire_time=0,
                                                            expire_time=0,
                                                            created_time=now_time,
                                                            created_time=now_time,
                                                            updated_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(0)
+            return response.json(178)
         except Exception as e:
         except Exception as e:
             LOGGER.info('*****UnicomManageController.create_package_cdk:errLine:{}, errMsg:{}'
             LOGGER.info('*****UnicomManageController.create_package_cdk:errLine:{}, errMsg:{}'
                         .format(e.__traceback__.tb_lineno, repr(e)))
                         .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
     @classmethod
     def generate_code(cls):
     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'
 WX_TECH_APP_KEY = 'PHNSIzLG9Ciyla3aiOuBuN17U0qk5mM4'
 # 五兴接口密钥
 # 五兴接口密钥
 TWX_TECH_SECRET = '9477ace7e28f4d3fabae63a786d53d81'
 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:
             if not unicom_device_info_qs[0].user_id:
                 # 生成4G免费订单
                 # 生成4G免费订单
                 UnicomComboView.experience_order_4G(unicom_device_info_qs[0].iccid,
                 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
             return True
         except Exception as e:
         except Exception as e:
             logging.info('创建体验4G订单异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(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, \
 from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, Order_Model, Store_Meal, AiStoreMeal, \
     UnicomComboOrderInfo, UnicomComboExperienceHistory, UnicomDeviceStatusChangePush, SysMsgModel, UnicomFlowPush, \
     UnicomComboOrderInfo, UnicomComboExperienceHistory, UnicomDeviceStatusChangePush, SysMsgModel, UnicomFlowPush, \
     LogModel
     LogModel
+from Object.EIoTClubObject import EIoTClubObject
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -384,13 +385,6 @@ class UnicomComboView(View):
                 # 待完善代码 根据uid与用户id验证系统设备mdcmd
                 # 待完善代码 根据uid与用户id验证系统设备mdcmd
                 unicom_device_qs = UnicomDeviceInfo.objects.filter(iccid=iccid)
                 unicom_device_qs = UnicomDeviceInfo.objects.filter(iccid=iccid)
                 if unicom_device_qs.exists():
                 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:
                     if unicom_device_qs.first().serial_no != serial_no:
                         unicom_device_qs.update(main_card=sim, updated_time=n_time, 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',
                         cls.create_operation_log('unicom/api/device-bind',
@@ -403,7 +397,12 @@ class UnicomComboView(View):
                 unicom_obj = UnicomObjeect()
                 unicom_obj = UnicomObjeect()
                 params = {'iccid': iccid, 'serial_no': serial_no, 'updated_time': n_time,
                 params = {'iccid': iccid, 'serial_no': serial_no, 'updated_time': n_time,
                           'created_time': n_time, 'main_card': sim}
                           '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['card_type'] = 1
                     params['status'] = 2
                     params['status'] = 2
                     UnicomDeviceInfo.objects.create(**params)
                     UnicomDeviceInfo.objects.create(**params)
@@ -429,6 +428,21 @@ class UnicomComboView(View):
             logger.info('--->设备调用4G注册接口异常:{}'.format(ex))
             logger.info('--->设备调用4G注册接口异常:{}'.format(ex))
             return response.json(177, repr(e))
             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
     @classmethod
     def check_iccid(cls, iccid):
     def check_iccid(cls, iccid):
         """
         """

+ 46 - 24
Controller/UnicomCombo/WXTechController.py

@@ -97,7 +97,7 @@ class WXTechController(View):
             except Exception as e:
             except Exception as e:
                 LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
                 LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                             .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
         @classmethod
         def get_cards_info(cls, request_dict, response):
         def get_cards_info(cls, request_dict, response):
@@ -116,7 +116,7 @@ class WXTechController(View):
             except Exception as e:
             except Exception as e:
                 LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
                 LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                             .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
         @classmethod
         def get_experience_package(cls, request_dict, response):
         def get_experience_package(cls, request_dict, response):
@@ -148,7 +148,7 @@ class WXTechController(View):
             except Exception as e:
             except Exception as e:
                 LOGGER.info('*****WXTechController.get_experience_package:errLine:{}, errMsg:{}'
                 LOGGER.info('*****WXTechController.get_experience_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                             .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
         @classmethod
         def create_order_package(cls, request_dict, response):
         def create_order_package(cls, request_dict, response):
@@ -189,7 +189,7 @@ class WXTechController(View):
             except Exception as e:
             except Exception as e:
                 LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
                 LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                             .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
         @classmethod
         def created_order(cls, serial_no, user_id, trade_no, combo_id=None, pay_type=10):
         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'],
                           'store_meal_name': combo_info_vo['combo_name'],
                           'trade_no': trade_no}
                           'trade_no': trade_no}
             Order_Model.objects.create(**order_dict)
             Order_Model.objects.create(**order_dict)
-            return True
+            return order_id
 
 
         @classmethod
         @classmethod
         def delete_card_package(cls, request_dict, response):
         def delete_card_package(cls, request_dict, response):
@@ -250,7 +250,7 @@ class WXTechController(View):
             except Exception as e:
             except Exception as e:
                 LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
                 LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                             .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
         @classmethod
         def wx_exchange_package(cls, request_dict, response, request, user_id):
         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):
                 if not (code.isalnum() and len(code) == 10):
                     return response.json(10040)  # 兑换码格式错误
                     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')
                     .values('iccid')
                 if not device_info_qs.exists():
                 if not device_info_qs.exists():
                     return response.json(173)  # 设备信息不存在
                     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():
                 if not exchange_code_qs.exists():
                     return response.json(10040)  # 兑换码无效
                     return response.json(10040)  # 兑换码无效
                 combo_id = exchange_code_qs[0]['package_id']
                 combo_id = exchange_code_qs[0]['package_id']
@@ -285,26 +284,49 @@ class WXTechController(View):
                     return response.json(173)
                     return response.json(173)
                 package_code = package_info_qs[0]['package_id']
                 package_code = package_info_qs[0]['package_id']
                 iccid = device_info_qs[0]['iccid']
                 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))
                 cls.save_log(ip, 10040, '兑换失败{},{}'.format(serial_number, code))
                 return response.json(10040)
                 return response.json(10040)
             except Exception as e:
             except Exception as e:
                 LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
                 LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                             .format(e.__traceback__.tb_lineno, repr(e)))
                 cls.save_log(ip, 500, '兑换内部错误')
                 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
         @staticmethod
         def save_log(ip, code, operation):
         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')
     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')
     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:已使用}')
     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')
     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:贴片卡}')
     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_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,
     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)