Forráskód Böngészése

新增序列号出厂自带无线套餐功能

zhangdongming 1 éve
szülő
commit
16f752c466

+ 43 - 1
AdminController/UnicomManageController.py

@@ -21,7 +21,7 @@ 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, \
-    ExchangeCode, UnicomFlowPush, SysMsgModel, UnicomComboExperienceHistory, LogModel
+    ExchangeCode, UnicomFlowPush, SysMsgModel, UnicomComboExperienceHistory, LogModel, SerialNumberPackage
 from Object.Enums.WXOperatorEnum import WXOperatorEnum
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
@@ -98,6 +98,8 @@ class UnicomManageControllerView(View):
                 return self.get_flow_combo_list(request_dict, response)
             elif operation == 'downloadCDK':  # 下载兑换码
                 return self.package_cdk_export_excel(response)
+            elif operation == 'uploadSerialNumberFile':  # 上传序列号文件绑定4G套餐
+                return self.upload_file(tko.user, request, request_dict, response)
             else:
                 return response.json(404)
 
@@ -968,3 +970,43 @@ class UnicomManageControllerView(View):
         combo_qs = combo_qs.values('id', 'combo_name').order_by('-created_time')
         flow_combo_list = list(combo_qs)
         return response.json(0, flow_combo_list)
+
+    @classmethod
+    def upload_file(cls, user, request, request_dict, response):
+        """
+        上传序列号文件绑定套餐id
+        @param user: 当前操作用户
+        @param request: file txt
+        @param request_dict: package_id 4G套餐id
+        @param response: 响应对象
+        @return: 成功数以及异常序列号列表
+        """
+        package_id = request_dict.get('packageId', None)
+        file = request.FILES['file']
+        serial_list = []
+        error_list = []
+        if not package_id:
+            return response.json(444)
+        n_time = int(time.time())
+        package_id = int(package_id)
+        sn_list = []
+        for line in file:
+            serial_number = line.decode().strip()[0:9]
+            try:
+                sn_qs = SerialNumberPackage.objects.filter(serial_number=serial_number)
+                if sn_qs:
+                    error_list.append({'serialNumber': serial_number, 'msg': '此序列号已绑定套餐'})
+                    continue
+                if serial_number in serial_list:
+                    error_list.append({'serialNumber': serial_number, 'msg': 'txt存在重复序列号'})
+                    continue
+                data = {'status': 1, 'serial_number': serial_number, 'package_id': package_id,
+                        'created_time': n_time, 'updated_time': n_time, 'created_by': user, 'updated_by': user}
+                serial_number_p = SerialNumberPackage(**data)
+                serial_list.append(serial_number)
+                sn_list.append(serial_number_p)
+            except Exception as e:
+                error_list.append({'serialNumber': serial_number, 'msg': repr(e)})
+        if sn_list:
+            SerialNumberPackage.objects.bulk_create(sn_list)
+        return response.json(0, {'total': len(serial_list), 'errData': error_list})

+ 94 - 1
Controller/UnicomCombo/WXTechController.py

@@ -14,7 +14,7 @@ from django.views import View
 from Ansjer.config import LOGGER
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import UnicomDeviceInfo, Order_Model, UnicomComboExperienceHistory, UnicomCombo, ExchangeCode, \
-    LogModel
+    LogModel, SerialNumberPackage
 from Object.Enums.WXOperatorEnum import WXOperatorEnum
 from Object.Enums.WXStartTypeEnum import WXStartTypeEnum
 from Object.ResponseObject import ResponseObject
@@ -68,6 +68,10 @@ class WXTechController(View):
                 return self.create_order_package(user_id, request_dict, response)
             elif operation == 'exchangePackage':
                 return self.wx_exchange_package(request_dict, response, request, user_id)
+            elif operation == 'getPackageBySerialNumber':
+                return self.get_package_by_serial_number(request_dict, response, request, user_id)
+            elif operation == 'create4GFlowPackage':
+                return self.create_4G_flow_package(request_dict, response, request, user_id)
 
         @classmethod
         def wx_package_refund(cls, request_dict, response):
@@ -355,3 +359,92 @@ class WXTechController(View):
                 LOGGER.info('*****WXTechController.save_log:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                 return False
+
+        @classmethod
+        def get_package_by_serial_number(cls, request_dict, response, request, user_id):
+            """
+            根据序列号获取无限流量套餐信息
+            """
+            try:
+                serial_number = request_dict.get('serialNumber', None)
+                if not serial_number:
+                    return response.json(444)
+                serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
+                data = {}
+                if not serial_package_qs:
+                    return response.json(0, data)
+                serial_package = serial_package_qs.first()
+                package_id = serial_package.package_id
+                package_info_qs = UnicomCombo.objects.filter(id=package_id).values('combo_name')
+                if not package_info_qs.exists():
+                    return response.json(0, data)
+                result = {'comboName': package_info_qs[0]['combo_name']}
+                return response.json(110, result)
+            except Exception as e:
+                LOGGER.info('*****WXTechController.get_package_by_serial_number:errLine:{}, errMsg:{}'
+                            .format(e.__traceback__.tb_lineno, repr(e)))
+                return response.json(503)
+
+        @classmethod
+        def create_4G_flow_package(cls, request_dict, response, request, user_id):
+            """
+            创建4G流量套餐(出厂序列号绑定套餐)
+            """
+            ip = CommonService.get_ip_address(request)
+            serial_number = ''
+            try:
+                serial_number = request_dict.get('serialNumber')
+                if not serial_number:
+                    return response.json(0)
+                device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
+                    .values('iccid', 'card_type')
+                if not device_info_qs.exists():
+                    return response.json(173)  # 设备信息不存在
+
+                serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
+                if not serial_package_qs:
+                    return response.json(10064)
+
+                combo_id = serial_package_qs.first().package_id
+                # 获取餐套餐信息
+                package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
+                    .values('package_id', 'combo_name')
+                if not package_info_qs.exists():
+                    return response.json(173)
+                # 得到五兴电信运营商套餐编码
+                package_code = package_info_qs[0]['package_id']
+                combo_name = package_info_qs[0]['combo_name']
+                iccid = device_info_qs[0]['iccid']
+
+                n_time = int(time.time())
+                # 兑换码套餐类型
+                card_type = device_info_qs[0]['card_type']
+                if card_type == 0:  # 订购联通流量套餐
+                    result = cls.exchange_unicom_package(serial_number, iccid,
+                                                         user_id, combo_id)
+                    serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
+                    if result:
+                        cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
+                        return response.json(10071)
+                elif card_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)
+                        serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
+                        cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
+                        return response.json(10071)
+
+                cls.save_log(ip, 10064, '无效卡类型{}领取{}失败{}'.format(serial_number, combo_name, user_id))
+                return response.json(10064)
+            except Exception as e:
+                LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
+                            .format(e.__traceback__.tb_lineno, repr(e)))
+                cls.save_log(ip, 500, f'{serial_number}领取流量套餐异常')
+                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 4 - 2
Object/ResponseObject.py

@@ -142,7 +142,8 @@ class ResponseObject(object):
             10068: 'This device does not support redemption, please contact customer service',
             10069: 'If the traffic is abnormal, check the data plan or contact customer service',
             10070: 'This device sharing limit has been reached',
-            503: 'The operation failed, please try again later'
+            503: 'The operation failed, please try again later',
+            10071: 'The successful collection can be viewed in Settings - 4G-My package'
         }
         data_cn = {
             0: '成功',
@@ -271,7 +272,8 @@ class ResponseObject(object):
             10068: '兑换失败,请联系客服',
             10069: '流量异常,请查看流量套餐情况或联系客服',
             10070: '此设备分享已达上限',
-            503: '操作失败,请稍后重试'
+            503: '操作失败,请稍后重试',
+            10071: '\t领取成功\n可在设置-4G-我的套餐中查看'
         }
 
         msg = data_cn if self.lang == 'cn' or self.lang == 'zh-Hans' or self.lang == 'zh-Hant' else data_en