浏览代码

百度大模型,Instavision

locky 1 周之前
父节点
当前提交
0c0c7afe22
共有 3 个文件被更改,包括 432 次插入7 次删除
  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 os
 import threading
 import threading
 import time
 import time
-
+import csv
 import oss2
 import oss2
 import requests
 import requests
+from obs import ObsClient
 from django.core.paginator import Paginator
 from django.core.paginator import Paginator
 from django.db import transaction
 from django.db import transaction
 from django.db.models import Q, F, Sum, OuterRef, Min, Subquery
 from django.db.models import Q, F, Sum, OuterRef, Min, Subquery
 from django.forms.models import model_to_dict
 from django.forms.models import model_to_dict
 from django.views.generic.base import View
 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, \
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
     AWS_SES_ACCESS_REGION
     AWS_SES_ACCESS_REGION
 from Ansjer.config import SERVER_DOMAIN_TEST, SERVER_DOMAIN_CN, SERVER_DOMAIN_US, SERVER_DOMAIN_EUR
 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, \
 from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, UidUserModel, ExperienceAiModel, AiService, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, UidUserModel, ExperienceAiModel, AiService, \
     AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, UIDCompanySerialModel, UidPushModel, \
     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.AWS.AmazonS3Util import AmazonS3Util
 from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
@@ -137,6 +139,29 @@ class DeviceManagement(View):
                 return self.del_device_voice(request_dict, response)
                 return self.del_device_voice(request_dict, response)
             elif operation == 'deviceTypeList':
             elif operation == 'deviceTypeList':
                 return self.device_type_list(response)
                 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:
             else:
                 return response.json(444, 'operation')
                 return response.json(444, 'operation')
 
 
@@ -2079,4 +2104,269 @@ class DeviceManagement(View):
             return response.json(0, list(device_type_qs))
             return response.json(0, list(device_type_qs))
         except Exception as e:
         except Exception as e:
             print(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, \
 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, \
     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_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.CheckUserData import DataValid
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
     AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User, SerialUnbindUID, \
     AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User, SerialUnbindUID, \
-    DeviceNetInfo
+    DeviceNetInfo, BaiduBigModelLicense, Instavision
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -78,6 +78,10 @@ class SerialNumberView(View):
             return self.get_iot_core_by_serial_number(request_dict, response)
             return self.get_iot_core_by_serial_number(request_dict, response)
         elif operation == 'saveUserNetInfo':
         elif operation == 'saveUserNetInfo':
             return self.save_user_net_info(request_dict, response)
             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:
         else:
             return response.json(414)
             return response.json(414)
 
 
@@ -1116,3 +1120,105 @@ class SerialNumberView(View):
             uid_set_qs.update(nickname=nickname)
             uid_set_qs.update(nickname=nickname)
         else:
         else:
             UidSetModel.objects.create(uid=uid, nickname=nickname)
             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'
         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):
 class DictCategory(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
     id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
     code = models.CharField(max_length=50, unique=True, verbose_name="类别编码")
     code = models.CharField(max_length=50, unique=True, verbose_name="类别编码")