Explorar o código

新增后台生成兑换码接口

zhangdongming %!s(int64=2) %!d(string=hai) anos
pai
achega
c737bfa1f0
Modificáronse 1 ficheiros con 104 adicións e 2 borrados
  1. 104 2
      AdminController/UnicomManageController.py

+ 104 - 2
AdminController/UnicomManageController.py

@@ -4,17 +4,23 @@
 # @Email   : Guanhailogn@asj6.wecom.work
 # @File    : UnicomManageController.py
 # @Software: PyCharm
+import hashlib
 import time
+import uuid
 
+import openpyxl
 from django.db import transaction, connection
+from django.http import HttpResponse
 from django.views.generic.base import View
 
+from Ansjer.config import LOGGER
 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, \
+    ExchangeCode
 from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
 from Object.UnicomObject import UnicomObjeect
 from Service.CommonService import CommonService
-from Object.TokenObject import TokenObject
 
 
 class UnicomManageControllerView(View):
@@ -37,6 +43,8 @@ class UnicomManageControllerView(View):
         # 获取套餐类型
         elif operation == 'combo/type':
             return self.get_unicom_combo_type(response)
+        elif operation == 'downloadCDK':  # 下载兑换码
+            return self.package_cdk_export_excel(response)
         else:
             tko = TokenObject(
                 request.META.get('HTTP_AUTHORIZATION'),
@@ -68,6 +76,8 @@ class UnicomManageControllerView(View):
                 return self.query_4G_user_order(request_dict, response)
             elif operation == 'sim-info':
                 return self.get_iccid_info(request_dict, response)
+            elif operation == 'batchGenerateCDK':  # 批量生成兑换码
+                return self.create_package_cdk(request_dict, response)
             else:
                 return response.json(404)
 
@@ -533,3 +543,95 @@ class UnicomManageControllerView(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    @classmethod
+    def package_cdk_export_excel(cls, response):
+        """
+        流量包兑换码导出excel
+        """
+        try:
+            # 创建一个新的excel文档
+            wb = openpyxl.Workbook()
+            # 获取默认的工作表
+            sheet = wb.active
+            sheet.title = '周视国内流量年卡兑换码'
+            sheet.column_dimensions['A'].width = 15
+            sheet.column_dimensions['B'].width = 20
+            exchange_code = ExchangeCode.objects.filter(status=False, is_down=False)
+            if not exchange_code.exists():
+                return response.json(173)
+            # 将兑换码写入到excel表
+            for i, vo in enumerate(list(exchange_code)):
+                code_no = cls.fix_string_length(str(vo.id))
+                sheet.cell(row=i + 1, column=1, value=code_no)
+                sheet.cell(row=i + 1, column=2, value=vo.code)
+            filename = '国内流量年卡兑换码-{}.xlsx'.format(exchange_code.count())
+            # 创建一个http响应
+            res = HttpResponse(content_type='application/vnd.ms-excel')
+            # 设置响应头,告诉浏览器文件要下载而不是直接打开
+            res['Content-Disposition'] = 'attachment; filename={}'.format(filename)
+            # 将excel文档保存到http响应中
+            wb.save(res)
+            exchange_code.update(is_down=True, updated_time=int(time.time()))
+            return res
+        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))
+
+    @staticmethod
+    def fix_string_length(code_no):
+        """
+        将兑换码编号生成固定6位长度
+        """
+        if len(code_no) < 6:
+            return 'NO.' + code_no.rjust(6, '0')
+        else:
+            return 'NO.' + code_no
+
+    @classmethod
+    def create_package_cdk(cls, request_dict, response):
+        """
+        批量生成兑换码
+        """
+        try:
+            LOGGER.info('*****UnicomManageController.create_package_cdk,params:{}'.format(request_dict))
+            quantity = request_dict.get('quantity', None)
+            package_id = request_dict.get('packageId', None)
+            if not all([quantity, package_id]):
+                return response.json(444)
+            combo_qs = UnicomCombo.objects.filter(id=int(package_id))
+            if not combo_qs.exists():
+                return response.json(173)
+            combo = combo_qs.first()
+            exchange_code_list = []
+            now_time = int(time.time())
+            if combo.combo_type == 3:
+                for i in range(int(quantity)):
+                    # 10位兑换码 后面两位为标识代表五兴电信
+                    code = cls.generate_code() + 'WD'
+                    exchange_code_list.append(ExchangeCode(code=code, status=False, is_down=0,
+                                                           package_type=1, 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)
+        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))
+
+    @classmethod
+    def generate_code(cls):
+        # 生成uuid并移除-
+        uuid_str = str(uuid.uuid4()).replace('-', '')
+        now_time = int(time.time())
+        uuid_str += str(now_time)
+        # 使用SHA1算法生成哈希值
+        sha1 = hashlib.sha1(uuid_str.encode('utf-8'))
+        # 取哈希值的前8位,并将其转换为大写字母
+        code = sha1.hexdigest()[:8].upper()
+        return code