浏览代码

定制客户后台接口、APP扫码工具接口

linhaohong 1 年之前
父节点
当前提交
fd85bea19e

+ 62 - 0
AdminController/DeviceManagementController.py

@@ -98,6 +98,8 @@ class DeviceManagement(View):
                 return self.get_app_name_list(response)
             elif operation == 'callAddAppDeviceType':  # 可选服添加app设备类型数据并上传图标
                 return self.call_add_app_device_type(request_dict, response, request)
+            elif operation == 'getCustomerDeviceList':  # 查询扫码添加设备列表
+                return self.get_customer_device_list(request_dict, response)
             else:
                 return response.json(444, 'operation')
 
@@ -1130,3 +1132,63 @@ class DeviceManagement(View):
         except Exception as e:
             LOGGER.error(f'查询设备信息异常: errLine: {e.__traceback__.tb_lineno}, errMsg: {repr(e)}')
             return response.json(5)
+
+    @staticmethod
+    def get_customer_device_list(request_dict, response):
+        """
+        查询扫码添加设备列表
+        :param request_dict:
+        :param response:
+        :return:
+        """
+        order_number = request_dict.get('orderNumber')
+        name = request_dict.get('name')
+        email = request_dict.get('email')
+        page = int(request_dict.get('pageNo', 1))
+        page_size = int(request_dict.get('pageSize', 10))
+
+        try:
+            # 构建查询条件
+            custom_customer_qs = CustomCustomerOrderInfo.objects.all()
+
+            if order_number:
+                custom_customer_qs = custom_customer_qs.filter(order_number__icontains=order_number)
+            if name:
+                custom_customer_qs = custom_customer_qs.filter(name__icontains=name)
+            if email:
+                custom_customer_qs = custom_customer_qs.filter(email__icontains=email)
+
+            # 获取所需的ID和数量
+            c_id_list = custom_customer_qs.values_list("id", flat=True)
+            total_quantity = custom_customer_qs.aggregate(total_quantity=Sum('quantity'))['total_quantity']
+
+            # 查询设备列表
+            customer_device_qs = CustomCustomerDevice.objects.filter(c_id__in=c_id_list).order_by('-created_time')
+
+            # 分页处理
+            paginator = Paginator(customer_device_qs, page_size)
+            customer_device_page = paginator.get_page(page)
+
+            # 构建设备列表
+            customer_device_list = []
+            for device in customer_device_page.object_list:
+                customer_device_list.append({
+                    'id': device.id,
+                    'serialNumber': device.serial_number,
+                    'uid': device.uid,
+                    'deviceType': device.type,
+                    'fullCode': device.full_code,
+                    'addTime': device.created_time,
+                })
+
+            # 构造返回数据
+            data = {
+                'total': paginator.count,
+                'orderDeviceQuantity': total_quantity or 0,  # 防止为None
+                'list': customer_device_list,  # 当前页的记录列表
+            }
+
+            return response.json(0, data)
+
+        except Exception as e:
+            return response.json(500, f'error_line:{e.__traceback__.tb_lineno}, error_msg:{repr(e)}')

+ 101 - 1
AdminController/UserManageController.py

@@ -3,6 +3,7 @@ import time
 import oss2
 import requests
 from django.contrib.auth.hashers import make_password, check_password  # 对密码加密模块
+from django.core.paginator import Paginator
 from django.db import transaction
 from django.db.models import Q
 from django.utils.decorators import method_decorator
@@ -14,7 +15,7 @@ from Ansjer.config import SERVER_DOMAIN, OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECR
     AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGION, DETECT_PUSH_DOMAINS
 from Controller.CheckUserData import DataValid, RandomStr
 from Model.models import Device_User, Role, UserExModel, CountryModel, MenuModel, FeedBackModel, StatResModel, \
-    SysMassModel, App_Info, SysMsgModel, DeviceSuperPassword, CustomizedPush, DeviceTypeModel
+    SysMassModel, App_Info, SysMsgModel, DeviceSuperPassword, CustomizedPush, DeviceTypeModel, CustomCustomerOrderInfo
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.ApschedulerObject import ApschedulerObject
 from Object.RedisObject import RedisObject
@@ -315,6 +316,10 @@ class UserManagement(View):
                 return self.addOrEditCustomizedPush(request, request_dict, response)
             elif operation == 'delCustomizedPush':  # 删除定制推送
                 return self.delCustomizedPush(request_dict, response)
+            if operation == 'getCustomCustomerList':  # 查詢定制客户信息
+                return self.get_custom_customer_list(request_dict, response)
+            elif operation == 'addCustomCustomer':  # 添加定制客户信息接口
+                return self.add_custom_customer(request_dict, response)
             else:
                 return response.json(414)
 
@@ -1070,3 +1075,98 @@ class UserManagement(View):
             return response.json(0, {'list': device_type_list})
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_custom_customer_list(request_dict, response):
+        """
+        查询定制客户信息
+        :param request_dict:
+        :param response:
+        :return:
+        """
+        order_number = request_dict.get('orderNumber', None)
+        name = request_dict.get('name', None)
+        email = request_dict.get('email', None)
+        page = request_dict.get('pageNo', 1)
+        page_size = request_dict.get('pageSize', 10)
+        try:
+            # 初始化查询集
+            custom_customer_qs = CustomCustomerOrderInfo.objects.all()
+
+            if order_number:
+                custom_customer_qs = custom_customer_qs.filter(order_number__icontains=order_number)
+            if name:
+                custom_customer_qs = custom_customer_qs.filter(name__icontains=name)
+            if email:
+                custom_customer_qs = custom_customer_qs.filter(email__icontains=email)
+
+            paginator = Paginator(custom_customer_qs.order_by('id'), page_size)
+            customers = paginator.page(page)
+
+            # 批量查询所有相关的国家信息
+            country_ids = custom_customer_qs.values_list('country_id', flat=True).distinct()
+            country_qs = CountryModel.objects.filter(id__in=country_ids)
+            country_map = {country.id: country.country_name for country in country_qs}
+
+            customer_list = []
+            for customer in customers.object_list:
+                country_name = country_map.get(customer.country_id, '')
+                customer_list.append({
+                    'cId': customer.id,
+                    'orderNumber': customer.order_number,
+                    'name': customer.name,
+                    'email': customer.email,
+                    'countryName': country_name,
+                    'quantity': customer.quantity,
+                    'createdTime': customer.created_time,
+                })
+
+            # 返回分页结果
+            data = {
+                'total': paginator.count,
+                'list': list(customer_list),  # 当前页的记录列表
+            }
+
+            return response.json(0, data)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def add_custom_customer(request_dict, response):
+        """
+        添加定制客户生产编号信息
+        :param request_dict: 请求字典
+        :param response: 响应对象
+        :return: 响应对象
+        """
+        order_number = request_dict.get('orderNumber', None)
+        name = request_dict.get('name', None)
+        quantity = int(request_dict.get('quantity', 0))
+        email = request_dict.get('email', None)
+        country_code = request_dict.get('countryCode', "en")
+
+        if not all([order_number, name, email, quantity]):
+            return response.json(444)
+
+        custom_customer_qs = CustomCustomerOrderInfo.objects.filter(order_number=order_number)
+        if custom_customer_qs.exists():
+            return response.json(174)
+
+        try:
+            country_code = country_code.upper()
+            country_qs = CountryModel.objects.filter(country_code=country_code)
+            country_id = 0
+            if country_qs.exists():
+                country_id = country_qs.first().id
+            CustomCustomerOrderInfo.objects.create(
+                order_number=order_number,
+                name=name,
+                email=email,
+                country_id=country_id,
+                quantity=quantity,
+                created_time=int(time.time()),
+                updated_time=int(time.time())
+            )
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 3 - 0
Ansjer/urls.py

@@ -25,6 +25,7 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     DeviceLogController, CouponController, AiController, ShadowController, AppAccountManagement, InitController, \
     WeatherControl, InAppPurchaseController, DeviceCommonController
 from Controller.Cron import CronTaskController
+from Controller.CustomCustomer import CustomCustomerController
 from Controller.MessagePush import EquipmentMessagePush
 from Controller.Surveys import CloudStorageController
 from Controller.UserDevice import UserSubscriptionController
@@ -376,6 +377,8 @@ urlpatterns = [
     re_path(r'^basic/serialNo/(?P<operation>.*)', SerialNumberCheckController.SerialNumberView.as_view()),
     re_path('inAppPurchase/(?P<operation>.*)', InAppPurchaseController.InAppPurchaseView.as_view()),
     re_path('deviceCommon/(?P<operation>.*)$', DeviceCommonController.DeviceCommonView.as_view()),
+    re_path('customCustomer/(?P<operation>.*)$', CustomCustomerController.CustomCustomerView.as_view()),
+
 
     # 后台界面接口 -----------------------------------------------------
     # 用户登录信息等

+ 156 - 0
Controller/CustomCustomer/CustomCustomerController.py

@@ -0,0 +1,156 @@
+import time
+
+from django.core.paginator import Paginator
+from django.views import View
+
+from Model.models import CustomCustomerOrderInfo, CustomCustomerDevice
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+class CustomCustomerView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        request_dict = request.GET
+        return self.validation(request, request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        request_dict = request.POST
+        return self.validation(request, request_dict, operation)
+
+    def validation(self, request, request_dict, operation):
+        language = request_dict.get('language', 'cn')
+        response = ResponseObject(language)
+        if operation == 'getCustomCustomer':  # APP查詢定制客户信息
+            return self.get_custom_customer(request_dict, response)
+        elif operation == 'addCustomerDevice':  # 定制客户设备扫码添加接口
+            return self.add_customer_device(request_dict, response)
+        elif operation == 'getCustomerDeviceCount':  # 查询定制客户已扫码添加设备数量接口
+            return self.get_customer_device_count(request_dict, response)
+        else:
+            return response.json(414)
+
+    @staticmethod
+    def get_custom_customer(request_dict, response):
+        """
+        APP查询定制客户信息
+        :param request_dict:
+        :param response:
+        :return:
+        """
+        order_number = request_dict.get('orderNumber', None)
+        if not order_number:
+            return response.json(444)
+        try:
+            custom_customer = CustomCustomerOrderInfo.objects.filter(order_number=order_number).first()
+            if not custom_customer:
+                return response.json(173)
+            device_count = CustomCustomerDevice.objects.filter(c_id=custom_customer.id).count()
+            custom_customer_data = {
+                'cId': custom_customer.id,
+                'quantity': custom_customer.quantity,
+                'existsDeviceCount': device_count,
+                'unexistsDeviceCount': custom_customer.quantity - device_count
+            }
+            return response.json(0, custom_customer_data)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    def add_customer_device(self, request_dict, response):
+        """
+        定制客户设备扫码添加接口
+        :param request_dict:
+        :param response:
+        :return:
+        """
+        # 获取并验证请求中的必要参数
+        c_id = request_dict.get('cId')
+        full_code = request_dict.get('QRcode', '').strip()
+
+        if not c_id or not full_code:
+            return response.json(444, "cId、QRcode")
+
+        # 验证客户信息是否存在
+        custom_customer = CustomCustomerOrderInfo.objects.filter(id=c_id).first()
+        if not custom_customer:
+            return response.json(173)
+
+        custom_customer_device_qs = CustomCustomerDevice.objects.filter(full_code=full_code)
+        if custom_customer_device_qs.exists():
+            return response.json(174)
+        # 创建新设备记录
+        try:
+            # 检查full_code的格式并提取相关字段
+            uid, serial_number, device_type = self.process_full_code(full_code)
+
+            CustomCustomerDevice.objects.create(
+                c_id=c_id,
+                serial_number=serial_number,
+                uid=uid,
+                full_code=full_code,
+                type=device_type,
+                created_time=int(time.time()),
+                updated_time=int(time.time())
+            )
+            device_count = CustomCustomerDevice.objects.filter(c_id=c_id).count()
+            return response.json(0, {
+                'existsDeviceCount': device_count,
+                'unexistsDeviceCount': custom_customer.quantity - device_count
+            })
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def process_full_code(full_code):
+        """ 处理full_code, 返回uid和serial_number """
+        serial_number = ""
+        uid = ""
+        device_type = 0
+        if len(full_code) == 14:
+            serial_number = full_code[:9]
+            device_type = int(full_code[-4:], 16)
+        elif len(full_code) == 20:
+            uid = full_code
+        return uid, serial_number, device_type
+
+    @staticmethod
+    def get_customer_device_count(request_dict, response):
+        """
+        查询定制客户已扫码添加设备数量
+        :param request_dict:
+        :param response:
+        :return:
+        """
+        order_number = request_dict.get('orderNumber', None)
+        name = request_dict.get('name', None)
+
+        try:
+            if not order_number and not name:
+                # 如果没有提供 order_number 和 name,返回所有设备的总数
+                device_count = CustomCustomerDevice.objects.count()
+            else:
+                # 初始查询集
+                customer_orders_qs = CustomCustomerOrderInfo.objects.all()
+
+                # 根据 order_number 或 name 过滤
+                if order_number:
+                    customer_orders_qs = customer_orders_qs.filter(order_number=order_number)
+                if name:
+                    customer_orders_qs = customer_orders_qs.filter(name=name)
+
+                # 获取 c_id 列表
+                c_ids = customer_orders_qs.values_list('id', flat=True)
+
+                # 如果没有匹配的订单,返回设备数量为 0
+                if not c_ids:
+                    device_count = 0
+                else:
+                    # 根据 c_id 列表查询设备数量
+                    device_count = CustomCustomerDevice.objects.filter(c_id__in=c_ids).count()
+
+            return response.json(0, {'deviceCount': device_count})
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 32 - 1
Model/models.py

@@ -4986,4 +4986,35 @@ class PushLog(models.Model):
     class Meta:
         db_table = 'push_log'
         verbose_name = '推送日志'
-        app_label = 'PushModel'
+        app_label = 'PushModel'
+
+
+class CustomCustomerOrderInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    order_number = models.CharField(default='', db_index=True, max_length=32, verbose_name=u'生产编号')
+    name = models.EmailField(max_length=64, db_index=True, verbose_name=u'用户名', default='', blank=True)
+    email = models.EmailField(max_length=64, verbose_name=u'邮箱', default='', blank=True)
+    country_id = models.IntegerField(blank=True, default=0, verbose_name='国家')
+    quantity = models.IntegerField(default=0, verbose_name='数量')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'custom_customer_order_info'
+        verbose_name = '定制客户信息'
+
+
+class CustomCustomerDevice(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    c_id = models.IntegerField(default=0, verbose_name=u'关联定制客户id')
+    serial_number = models.CharField(blank=True, max_length=9, default='', verbose_name='关联序列号')
+    uid = models.CharField(blank=True, max_length=32, default='', verbose_name='关联uid')
+    type = models.IntegerField(default=0, blank=True, verbose_name=u'设备类型')
+    full_code = models.EmailField(max_length=64, db_index=True, verbose_name=u'完整编码(app扫的完整数据)', default='', blank=True)
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'custom_customer_device'
+        verbose_name = '定制客户设备'
+