Browse Source

百度大模型,Instavision

locky 6 days ago
parent
commit
0c0c7afe22
3 changed files with 432 additions and 7 deletions
  1. 295 5
      AdminController/DeviceManagementController.py
  2. 108 2
      Controller/SerialNumberController.py
  3. 29 0
      Model/models.py

+ 295 - 5
AdminController/DeviceManagementController.py

@@ -6,24 +6,26 @@ import operator
 import os
 import threading
 import time
-
+import csv
 import oss2
 import requests
+from obs import ObsClient
 from django.core.paginator import Paginator
 from django.db import transaction
 from django.db.models import Q, F, Sum, OuterRef, Min, Subquery
 from django.forms.models import model_to_dict
 from django.views.generic.base import View
 
-from Ansjer.config import LOGGER, SERIAL_DOMAIN_NAME, \
-    CONFIG_INFO, CONFIG_TEST, CONFIG_CN, CONFIG_US, CONFIG_EUR
+from Ansjer.config import LOGGER, SERIAL_DOMAIN_NAME, HUAWEICLOUD_AK, HUAWEICLOUD_SK, HUAWEICLOUD_OBS_SERVER, \
+    HUAWEICLOUD_BAIDU_BIG_MODEL_LICENSE_BUKET,CONFIG_INFO, CONFIG_TEST, CONFIG_CN, CONFIG_US, CONFIG_EUR
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
     AWS_SES_ACCESS_REGION
 from Ansjer.config import SERVER_DOMAIN_TEST, SERVER_DOMAIN_CN, SERVER_DOMAIN_US, SERVER_DOMAIN_EUR
 from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, UidUserModel, ExperienceAiModel, AiService, \
     AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, UIDCompanySerialModel, UidPushModel, \
-    CustomCustomerOrderInfo, CustomCustomerDevice, DeviceVersionInfo, VoicePromptModel, DeviceAlgorithmExplain
+    CustomCustomerOrderInfo, CustomCustomerDevice, DeviceVersionInfo, VoicePromptModel, DeviceAlgorithmExplain, BaiduBigModelLicense, \
+    Instavision
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.RedisObject import RedisObject
@@ -137,6 +139,29 @@ class DeviceManagement(View):
                 return self.del_device_voice(request_dict, response)
             elif operation == 'deviceTypeList':
                 return self.device_type_list(response)
+
+            # 百度大模型
+            elif operation == 'getBaiduBigModelLicense':  # 查询大模型许可证
+                return self.get_baidu_big_model_license(request_dict, response)
+            elif operation == 'addBaiduBigModelLicense':  # 添加大模型许可证
+                return self.add_baidu_big_model_license(request, response)
+            elif operation == 'editBaiduBigModelLicense':  # 编辑大模型许可证
+                return self.edit_baidu_big_model_license(request, request_dict, response)
+            elif operation == 'delBaiduBigModelLicense':   # 删除大模型许可证
+                return self.del_baidu_big_model_license(request_dict, response)
+
+            # Instavision即时视觉
+            elif operation == 'getInstavision':  # 查询即时视觉列表
+                return self.get_instavision(request_dict, response)
+            elif operation == 'addInstavision':  # 添加即时视觉
+                return self.add_instavision(request, response)
+            elif operation == 'editInstavision':  # 编辑即时视觉
+                return self.edit_instavision(request_dict, response)
+            elif operation == 'delInstavision':   # 删除即时视觉
+                return self.del_instavision(request_dict, response)
+
+            elif operation == 'devicePowerDisplay':
+                return self.device_power_display(request_dict, response)
             else:
                 return response.json(444, 'operation')
 
@@ -2079,4 +2104,269 @@ class DeviceManagement(View):
             return response.json(0, list(device_type_qs))
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_baidu_big_model_license(request_dict, response):
+        """查询百度大模型许可证列表"""
+        page_no = request_dict.get('pageNo')
+        page_size = request_dict.get('pageSize')
+        serial = request_dict.get('serial', '')
+        license_name = request_dict.get('licenseName', '')
+        use_status = request_dict.get('useStatus')
+
+        if not all([page_no, page_size]):
+            return response.json(444)
+
+        try:
+            query = BaiduBigModelLicense.objects.all()
+            if serial:
+                query = query.filter(serial__contains=serial)
+            if license_name:
+                query = query.filter(license_name__contains=license_name)
+            if use_status:
+                query = query.filter(use_status=use_status)
+
+            total = query.count()
+            licenses = query.order_by('-id')[
+                (int(page_no)-1)*int(page_size):int(page_no)*int(page_size)
+            ].values('id', 'serial', 'license_name', 'use_status', 'created_time', 'updated_time')
+
+            return response.json(0, {
+                'list': list(licenses),
+                'total': total
+            })
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def add_baidu_big_model_license(request, response):
+        """添加百度大模型许可证"""
+        file = request.FILES.get('file', None)
+        if not file:
+            return response.json(444)
+        try:
+            license_name = str(file)
+            now_time = int(time.time())
+
+            # 上传文件到华为云OBS
+            obs_client = ObsClient(
+                access_key_id=HUAWEICLOUD_AK,
+                secret_access_key=HUAWEICLOUD_SK,
+                server=HUAWEICLOUD_OBS_SERVER
+            )
+            resp = obs_client.putObject(
+                bucketName=HUAWEICLOUD_BAIDU_BIG_MODEL_LICENSE_BUKET,
+                objectKey=license_name,
+                content=file
+            )
+            assert resp.status < 300
+
+            # 更新或创建数据
+            license_qs = BaiduBigModelLicense.objects.filter(license_name=license_name)
+            if license_qs.exists():
+                license_qs.update(updated_time=now_time)
+            else:
+                BaiduBigModelLicense.objects.create(
+                    license_name=license_name,
+                    created_time=now_time,
+                    updated_time=now_time
+                )
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def edit_baidu_big_model_license(request, request_dict, response):
+        """编辑百度大模型许可证"""
+        license_id = request_dict.get('id')
+        serial = request_dict.get('serial')
+        use_status = request_dict.get('useStatus')
+
+        if not license_id:
+            return response.json(444)
+
+        try:
+            update_data = {
+                'updated_time': int(time.time())
+            }
+            if serial:
+                update_data['serial'] = serial
+            if use_status is not None:
+                update_data['use_status'] = int(use_status)
+
+            BaiduBigModelLicense.objects.filter(id=license_id).update(**update_data)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def del_baidu_big_model_license(request_dict, response):
+        """删除百度大模型许可证"""
+        license_id = request_dict.get('id')
+
+        if not license_id:
+            return response.json(444)
+
+        try:
+            # 先查询出license_name
+            baidu_license = BaiduBigModelLicense.objects.filter(id=license_id).first()
+            if not baidu_license:
+                return response.json(444)
+
+            license_name = baidu_license.license_name
+
+            # 删除数据库记录
+            BaiduBigModelLicense.objects.filter(id=license_id).delete()
+
+            # 删除华为云上的文件
+            obs_client = ObsClient(
+                access_key_id=HUAWEICLOUD_AK,
+                secret_access_key=HUAWEICLOUD_SK,
+                server=HUAWEICLOUD_OBS_SERVER
+            )
+            obs_client.deleteObject(
+                bucketName=HUAWEICLOUD_BAIDU_BIG_MODEL_LICENSE_BUKET,
+                objectKey=license_name
+            )
+
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_instavision(request_dict, response):
+        """查询即时视觉列表"""
+        page_no = request_dict.get('pageNo')
+        page_size = request_dict.get('pageSize')
+        device_id = request_dict.get('deviceId', '')
+        mac = request_dict.get('mac', '')
+        access_key = request_dict.get('accessKey', '')
+        use_status = request_dict.get('useStatus')
+
+        if not all([page_no, page_size]):
+            return response.json(444)
+
+        try:
+            query = Instavision.objects.all()
+            if device_id:
+                query = query.filter(device_id__contains=device_id)
+            if mac:
+                query = query.filter(mac__contains=mac)
+            if access_key:
+                query = query.filter(access_key__contains=access_key)
+            if use_status is not None:
+                query = query.filter(use_status=use_status)
+
+            total = query.count()
+            instavisions = query.order_by('-id')[
+                (int(page_no)-1)*int(page_size):int(page_no)*int(page_size)
+            ].values('id', 'mac', 'device_id', 'access_key', 'use_status', 'created_time', 'updated_time')
+
+            return response.json(0, {
+                'list': list(instavisions),
+                'total': total
+            })
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def add_instavision(request, response):
+        """添加即时视觉
+        仅支持CSV批量导入
+        """
+        file = request.FILES.get('file', None)
+        if not file:
+            return response.json(444, '请上传CSV文件')
+
+        try:
+            # 读取CSV文件内容
+            csv_content = io.StringIO(file.read().decode('utf-8'))
+            csv_reader = csv.DictReader(csv_content)
+
+            now_time = int(time.time())
+
+            # 获取所有已存在的device_id
+            existing_device_ids = set(Instavision.objects.values_list('device_id', flat=True))
+
+            # 准备批量创建的对象列表
+            instavision_objects = []
+
+            for row in csv_reader:
+                # 获取Device Id和Access Key列的数据
+                device_id = row.get('Device Id', '')
+                access_key = row.get('Access Key', '')
+
+                if not device_id or not access_key:
+                    continue
+
+                # 检查是否已存在相同的device_id
+                if device_id in existing_device_ids:
+                    continue
+
+                # 添加到待创建列表
+                instavision_objects.append(Instavision(
+                    device_id=device_id,
+                    access_key=access_key,
+                    created_time=now_time,
+                    updated_time=now_time
+                ))
+
+                # 将此device_id添加到已存在集合中,防止CSV中有重复
+                existing_device_ids.add(device_id)
+
+            # 使用bulk_create批量创建记录
+            if instavision_objects:
+                Instavision.objects.bulk_create(instavision_objects)
+
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def edit_instavision(request_dict, response):
+        """编辑即时视觉"""
+        instavision_id = request_dict.get('id')
+        device_id = request_dict.get('deviceId')
+        access_key = request_dict.get('accessKey')
+        mac = request_dict.get('mac')
+        use_status = request_dict.get('useStatus')
+
+        if not instavision_id:
+            return response.json(444)
+
+        try:
+            update_data = {
+                'updated_time': int(time.time())
+            }
+            if device_id:
+                # 检查是否与其他记录的device_id冲突
+                if Instavision.objects.exclude(id=instavision_id).filter(device_id=device_id).exists():
+                    return response.json(444, '设备ID已存在')
+                update_data['device_id'] = device_id
+            if access_key:
+                update_data['access_key'] = access_key
+            if mac:
+                update_data['mac'] = mac
+            if use_status is not None:
+                update_data['use_status'] = int(use_status)
+
+            Instavision.objects.filter(id=instavision_id).update(**update_data)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def del_instavision(request_dict, response):
+        """删除即时视觉"""
+        instavision_id = request_dict.get('id')
+
+        if not instavision_id:
+            return response.json(444)
+
+        try:
+            # 删除数据库记录
+            Instavision.objects.filter(id=instavision_id).delete()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 108 - 2
Controller/SerialNumberController.py

@@ -12,14 +12,14 @@ from django.views import View
 from Ansjer.config import CRCKey, CONFIG_INFO, CONFIG_US, CONFIG_EUR, \
     CONFIG_CN, USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST, SERVER_DOMAIN_US, REGION_ID_LIST, SERVER_DOMAIN_TEST, \
     SERVER_DOMAIN_LIST, SERVER_DOMAIN_CN, SERVER_DOMAIN_EUR, RESET_REGION_ID_SERIAL_REDIS_LIST, LOGGER, CONFIG_TEST, \
-    SERVER_DOMAIN
+    SERVER_DOMAIN, HUAWEICLOUD_AK, HUAWEICLOUD_SK, HUAWEICLOUD_OBS_SERVER, HUAWEICLOUD_BAIDU_BIG_MODEL_LICENSE_BUKET
 from Controller.CheckUserData import DataValid
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
     AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User, SerialUnbindUID, \
-    DeviceNetInfo
+    DeviceNetInfo, BaiduBigModelLicense, Instavision
 from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
@@ -78,6 +78,10 @@ class SerialNumberView(View):
             return self.get_iot_core_by_serial_number(request_dict, response)
         elif operation == 'saveUserNetInfo':
             return self.save_user_net_info(request_dict, response)
+        elif operation == 'getBaiduBigModelLicenseUrl':
+            return self.get_baidu_big_model_license_url(request_dict, response)
+        elif operation == 'getInstavision':
+            return self.get_instavision(request_dict, response)
         else:
             return response.json(414)
 
@@ -1116,3 +1120,105 @@ class SerialNumberView(View):
             uid_set_qs.update(nickname=nickname)
         else:
             UidSetModel.objects.create(uid=uid, nickname=nickname)
+
+    @staticmethod
+    def get_baidu_big_model_license_url(request_dict, response):
+        """
+        获取百度大模型许可证下载链接
+        @param request_dict: 请求参数
+        @param response: 响应对象
+        @request_dict serial_number: 序列号
+        @return: response
+        """
+        serial = request_dict.get('serial', None)
+        if not serial:
+            return response.json(444)
+        try:
+            # 同个序列号返回相同license
+            baidu_big_model_license_qs = BaiduBigModelLicense.objects.filter(serial=serial).values('license_name')
+            if baidu_big_model_license_qs.exists():
+                license_name = baidu_big_model_license_qs[0]['license_name']
+            else:
+                # 查询未被使用的license,使用事务和行锁避免并发问题
+                with transaction.atomic():
+                    baidu_big_model_license_qs = BaiduBigModelLicense.objects.filter(
+                        serial='', use_status=0
+                    ).select_for_update().order_by('id').first()
+                    if not baidu_big_model_license_qs:
+                        return response.json(173)
+                    license_name = baidu_big_model_license_qs.license_name
+                    # 更新数据为已使用
+                    now_time = int(time.time())
+                    baidu_big_model_license_qs.serial = serial
+                    baidu_big_model_license_qs.use_status = 1
+                    baidu_big_model_license_qs.updated_time = now_time
+                    baidu_big_model_license_qs.save()
+
+            # 生成华为云OBS临时下载链接
+            from obs import ObsClient
+            obs_client = ObsClient(
+                access_key_id=HUAWEICLOUD_AK,
+                secret_access_key=HUAWEICLOUD_SK,
+                server=HUAWEICLOUD_OBS_SERVER
+            )
+            download_url = obs_client.createSignedUrl(
+                method='GET',
+                bucketName=HUAWEICLOUD_BAIDU_BIG_MODEL_LICENSE_BUKET,
+                objectKey=license_name,
+                expires=3600  # 有效期1小时
+            )
+
+            res = {
+                'license_url': download_url.signedUrl
+            }
+
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_instavision(request_dict, response):
+        """
+        获取instavision数据
+        @param request_dict: 请求参数
+        @param response: 响应对象
+        @request_dict mac: 设备mac地址
+        @return: response
+        """
+        mac = request_dict.get('mac', None)
+        if not mac:
+            return response.json(444)
+        try:
+            # 查询mac是否已存在数据
+            instavision_qs = Instavision.objects.filter(mac=mac, use_status=1).values('device_id', 'access_key')
+            if instavision_qs.exists():
+                res = {
+                    'device_id': instavision_qs[0]['device_id'],
+                    'access_key': instavision_qs[0]['access_key'],
+                }
+            else:
+                # 使用事务和select_for_update来处理并发问题
+                with transaction.atomic():
+                    # 使用select_for_update加锁,防止并发时多个请求获取到同一条记录
+                    instavision_qs = Instavision.objects.select_for_update().filter(use_status=0).first()
+
+                    if not instavision_qs:
+                        return response.json(444, '没有可用的即时视觉数据')
+
+                    device_id = instavision_qs.device_id
+                    access_key = instavision_qs.access_key
+
+                    # 更新该条数据的mac、use_status和updated_time
+                    instavision_qs.mac = mac
+                    instavision_qs.use_status = 1  # 标记为已使用
+                    instavision_qs.updated_time = int(time.time())
+                    instavision_qs.save()
+
+                    res = {
+                        'device_id': device_id,
+                        'access_key': access_key,
+                    }
+
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 29 - 0
Model/models.py

@@ -5587,6 +5587,35 @@ class AbnormalEventCode(models.Model):
         app_label = 'PushModel'
 
 
+class BaiduBigModelLicense(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    serial = models.CharField(default='', max_length=9, verbose_name='序列号')
+    license_name = models.CharField(default='', max_length=32, verbose_name='许可证名称')
+    # 使用状态,0: 未使用, 1: 已使用
+    use_status = models.PositiveSmallIntegerField(default=0, verbose_name='使用状态')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'baidu_big_model_license'
+        verbose_name = '百度大模型许可证'
+
+
+class Instavision(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    mac = models.CharField(max_length=32, unique=True, null=True, blank=True, verbose_name='设备mac地址')
+    device_id = models.CharField(default='', max_length=32, verbose_name='设备id')
+    access_key = models.CharField(default='', max_length=32, verbose_name='访问密钥')
+    # 使用状态,0: 未使用, 1: 已使用
+    use_status = models.PositiveSmallIntegerField(default=0, verbose_name='使用状态')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'instavision'
+        verbose_name = '即时视觉'
+
+
 class DictCategory(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
     code = models.CharField(max_length=50, unique=True, verbose_name="类别编码")