Browse Source

新增算法小店API

zhangdongming 3 years ago
parent
commit
549054411a

+ 15 - 0
Ansjer/server_urls/algorithm_shop_url.py

@@ -0,0 +1,15 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : algorithm_shop_url.py
+@Time    : 2022/8/26 14:38
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from django.urls import re_path
+
+from Controller.AlgorithmShop import AlgorithmShopController
+
+urlpatterns = [
+    re_path(r'^api/(?P<operation>.*)$', AlgorithmShopController.AlgorithmShopView.as_view()),
+]

+ 2 - 0
Ansjer/urls.py

@@ -353,6 +353,8 @@ urlpatterns = [
     url(r'^loocam/', include("Ansjer.server_urls.loocam_url")),
     # 联通4G套餐模块
     url(r'^unicom/', include("Ansjer.server_urls.unicom_url")),
+    # 算法小店
+    url(r'^algorithm-shop/', include("Ansjer.server_urls.algorithm_shop_url")),
 
     # 传感器网关
     re_path('sensorGateway/(?P<operation>.*)', SensorGatewayController.SensorGateway.as_view()),

+ 182 - 0
Controller/AlgorithmShop/AlgorithmShopController.py

@@ -0,0 +1,182 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : AlgorithmShopController.py
+@Time    : 2022/8/24 20:02
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import logging
+
+from django.views.generic.base import View
+
+from Model.models import DeviceAlgorithmExplain, DeviceAlgorithmBanner, DeviceUidAlgorithmType
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+logger = logging.getLogger('info')
+
+
+class AlgorithmShopView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+        lang = request_dict.get('lang', token.lang)
+        response = ResponseObject(lang)
+        if token.code != 0:
+            return response.json(token.code)
+        if operation == 'list':
+            return self.algorithm_list(request_dict, response)
+        elif operation == 'banner-list':
+            return self.get_algorithm_banner(response)
+        elif operation == 'uid-details':
+            return self.get_algorithm_details(request_dict, response)
+        elif operation == 'save':
+            return self.algorithm_setting_save(request_dict, response)
+
+    @classmethod
+    def get_algorithm_banner(cls, response):
+        """
+        获取算法小店banner
+        """
+        banner_qs = DeviceAlgorithmBanner.objects.all()
+        banner_vs = banner_qs.order_by('sort') \
+            .values('algorithm_type__type', 'algorithm_type__id', 'image_url')
+        banner_list = []
+        if not banner_vs.exists():
+            return response.json(0, banner_list)
+        for item in banner_vs:
+            banner_list.append({
+                'typeId': item['algorithm_type__id'],
+                'type': item['algorithm_type__type'],
+                'imageUrl': item['image_url'],
+            })
+        return response.json(0, banner_list)
+
+    @classmethod
+    def algorithm_list(cls, request_dict, response):
+        """
+        获取算法小店列表
+        """
+        try:
+            lang = request_dict.get('lang', 'en')
+            uid = request_dict.get('uid', None)
+            algorithm_qs = DeviceAlgorithmExplain.objects.filter(lang=lang).order_by('algorithm_type__sort') \
+                .values('algorithm_type__id', 'algorithm_type__type',
+                        'algorithm_type__icon_url',
+                        'title', 'subtitle', 'algorithm_type__image_url',
+                        'algorithm_type__basic_function')
+            algorithm_list = []
+            if not algorithm_qs.exists():
+                return response.json(0, algorithm_list)
+            for item in algorithm_qs:
+                setting = ''
+                if uid:
+                    setting = cls.get_uid_algorithm_info(item['algorithm_type__id'], uid)
+                    setting = setting if setting else {'status': 0, 'function': {}}
+                algorithm_list.append({
+                    'typeId': item['algorithm_type__id'],
+                    'type': item['algorithm_type__type'],
+                    'iconUrl': item['algorithm_type__icon_url'],
+                    'imageUrl': item['algorithm_type__image_url'],
+                    'title': item['title'],
+                    'subtitle': item['subtitle'],
+                    'setting': setting,
+                    'basicFunction': item['algorithm_type__basic_function']
+                })
+            return response.json(0, algorithm_list)
+        except Exception as e:
+            print('查询算法小店列表异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(177, repr(e))
+
+    @classmethod
+    def get_algorithm_details(cls, request_dict, response):
+        """
+        获取算法小店类型详情
+        """
+        try:
+            lang = request_dict.get('lang', 'en')
+            type_id = request_dict.get('typeId', None)
+            if not type_id:
+                return response.json(444, 'typeId not null')
+            type_id = int(type_id)
+            uid = request_dict.get('uid', None)
+            explain_qs = DeviceAlgorithmExplain.objects.filter(lang=lang).filter(algorithm_type__id=type_id) \
+                .values('algorithm_type__id', 'algorithm_type__type',
+                        'algorithm_type__down_count',
+                        'algorithm_type__details_img_url',
+                        'algorithm_type__icon_url',
+                        'title', 'subtitle', 'introduction',
+                        'install_explain', 'risk_warning',
+                        'algorithm_type__basic_function')
+            if not explain_qs.exists():
+                return response.json(0, {})
+            item = explain_qs.first()
+            algorithm_dict = {
+                'typeId': item['algorithm_type__id'],
+                'type': item['algorithm_type__type'],
+                'downCount': item['algorithm_type__down_count'],
+                'detailsImgUrl': item['algorithm_type__details_img_url'],
+                'iconUrl': item['algorithm_type__icon_url'],
+                'title': item['title'],
+                'subtitle': item['subtitle'],
+                'introduction': item['introduction'],
+                'installExplain': item['install_explain'],
+                'riskWarning': item['risk_warning'],
+                'basicFunction': item['algorithm_type__basic_function'],
+            }
+            if uid:
+                setting = cls.get_uid_algorithm_info(item['algorithm_type__id'], uid)
+                algorithm_dict['setting'] = setting if setting else {'status': 0, 'function': {}}
+            return response.json(0, algorithm_dict)
+        except Exception as e:
+            print('查询算法详情异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(177, repr(e))
+
+    @staticmethod
+    def get_uid_algorithm_info(type_id, uid):
+        """
+        获取当前设备使用算法状态信息
+        @param type_id: 算法类型ID
+        @param uid: 设备唯一标识
+        @return: dict
+        """
+        uid_algorithm_qs = DeviceUidAlgorithmType.objects.filter(algorithm_type_id=type_id, device_uid=uid) \
+            .values('status', 'function')
+        if not uid_algorithm_qs.exists():
+            return None
+        return uid_algorithm_qs.first()
+
+    @classmethod
+    def algorithm_setting_save(cls, request_dict, response):
+        """
+        算法设置保存
+        """
+        try:
+            type_id = request_dict.get('typeId', None)
+            uid = request_dict.get('uid', None)
+            status = request_dict.get('status', None)
+            setting_json = request_dict.get('function')
+            if not all([type_id, uid, status, setting_json]):
+                return response.json(444)
+            status = int(status)
+            type_id = int(type_id)
+            uid_algorithm_qs = DeviceUidAlgorithmType.objects.filter(algorithm_type_id=type_id, device_uid=uid)
+            if not uid_algorithm_qs.exists():
+                param = {'algorithm_type_id': int(type_id), 'uid': uid, 'function': setting_json, 'status': status}
+                DeviceUidAlgorithmType.objects.create(**param)
+                return response.json(0)
+            uid_algorithm_qs.update(status=status, function=setting_json)
+            return response.json(0)
+        except Exception as e:
+            print('保存算法设置异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(177, repr(e))

+ 86 - 2
Model/models.py

@@ -1184,7 +1184,7 @@ class UidSetModel(models.Model):
     is_human = models.IntegerField(default=0, verbose_name='是否支持人形追踪。0:不支持,1:支持')
     is_custom_voice = models.IntegerField(default=0, verbose_name='是否支持自定义语音。0:不支持,1:支持')
     double_wifi = models.IntegerField(default=0, verbose_name='是否支持双频wifi。0:不支持,1:支持')
-    isSupportFourPoint = models.SmallIntegerField(default=0, verbose_name='是否支持预置点')    # 0:不支持, 1:支持
+    isSupportFourPoint = models.SmallIntegerField(default=0, verbose_name='是否支持预置点')  # 0:不支持, 1:支持
     mobile_4g = models.IntegerField(default=0, verbose_name='是否支持4g。0:不支持,1:支持')
     is_ptz = models.IntegerField(default=0, verbose_name='是否支持云台。0:不支持,1:支持')
     is_vod = models.IntegerField(default=0, verbose_name='是否支持云存储。0:不支持,1:支持')
@@ -1714,12 +1714,28 @@ class AppBundle(models.Model):
         verbose_name_plural = verbose_name
 
 
+class AppVersionNumber(models.Model):
+    id = models.AutoField(primary_key=True)
+    app_bundle = models.ForeignKey(AppBundle, to_field='id', default='', on_delete=models.DO_NOTHING,
+                                   verbose_name='关联APP版本表')
+    version_number = models.CharField(max_length=32, verbose_name='版本号', default='')
+
+    class Meta:
+        db_table = 'app_version_number'
+        verbose_name = 'APP版本号表'
+        verbose_name_plural = verbose_name
+
+
 class AppDeviceType(models.Model):
     id = models.AutoField(primary_key=True)
-    model = models.SmallIntegerField(default=0, verbose_name='设备类型')  # 1:DVR, 2:IPC
+    # 1:DVR, 2:IPC
+    model = models.SmallIntegerField(default=0, verbose_name='设备类型')
     type = models.IntegerField(default=0, verbose_name='设备型号')
     icon = models.CharField(default='', max_length=200, verbose_name='图标文件路径')
 
+    app_version_number = models.ForeignKey(AppVersionNumber, to_field='id', default='', on_delete=models.DO_NOTHING,
+                                           verbose_name='关联APP版本号表id')
+
     class Meta:
         db_table = 'app_device_type'
         verbose_name = 'APP设备类型表'
@@ -2803,3 +2819,71 @@ class UnicomFlowPush(models.Model):
         verbose_name = '联通流量用量推送'
         verbose_name_plural = verbose_name
         app_label = "PushModel"
+
+
+class DeviceAlgorithmType(models.Model):
+    id = models.AutoField(primary_key=True)
+    # 0:移动侦测,1:人形检测,2:挥手识别,3:人脸检测,4:异声感知,5:车辆检测,6:宠物检测,7:绊线入侵,8:车辆检测,9:离岗检测,10:徘徊检测
+    type = models.SmallIntegerField(default=0, verbose_name='算法类型')
+    memory = models.CharField(max_length=32, default='', verbose_name='所需内存')
+    down_count = models.IntegerField(default=0, verbose_name='下载次数')
+    sort = models.IntegerField(default=0, verbose_name=u'排序,越小越靠前')
+    basic_function = models.TextField(blank=True, default='', verbose_name=u'基础功能(json格式)')
+    image_url = models.CharField(max_length=255, default='', verbose_name='图片地址')
+    details_img_url = models.CharField(max_length=255, default='', verbose_name='详情图')
+    icon_url = models.CharField(max_length=255, default='', verbose_name='图标地址')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'device_algorithm_type'
+        verbose_name = '设备算法类型'
+        verbose_name_plural = verbose_name
+
+
+class DeviceAlgorithmBanner(models.Model):
+    id = models.AutoField(primary_key=True)
+    algorithm_type = models.ForeignKey(DeviceAlgorithmType, to_field='id', default='', on_delete=models.CASCADE,
+                                       verbose_name=u'关联算法类型')
+    image_url = models.CharField(max_length=255, default='', verbose_name='横幅图')
+    sort = models.IntegerField(default=0, verbose_name=u'排序,越小越靠前')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'device_algorithm_banner'
+        verbose_name = '设备算法横幅广告'
+        verbose_name_plural = verbose_name
+
+
+class DeviceAlgorithmExplain(models.Model):
+    id = models.AutoField(primary_key=True)
+    algorithm_type = models.ForeignKey(DeviceAlgorithmType, to_field='id', default='', on_delete=models.CASCADE,
+                                       verbose_name=u'关联算法类型')
+    title = models.CharField(max_length=32, default='', verbose_name='标题')
+    subtitle = models.CharField(max_length=100, default='', verbose_name='副标题')
+    introduction = models.TextField(blank=True, default='', verbose_name='功能介绍')
+    install_explain = models.TextField(blank=True, default='', verbose_name=u'安装说明')
+    risk_warning = models.TextField(blank=True, default='', verbose_name=u'风险提示')
+    lang = models.CharField(default='', max_length=20, db_index=True, verbose_name='语言/国家')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'device_algorithm_explain'
+        verbose_name = '设备算法详情'
+        verbose_name_plural = verbose_name
+
+
+class DeviceUidAlgorithmType(models.Model):
+    id = models.AutoField(primary_key=True)
+    status = models.SmallIntegerField(default=0, verbose_name=u'状态{0:关闭,1:开启}')
+    memory = models.CharField(max_length=32, default='', verbose_name='设备内存')
+    function = models.TextField(blank=True, default='', verbose_name='功能设置')
+    device_uid = models.CharField(max_length=32, db_index=True, default='', verbose_name='设备uid')
+    algorithm_type = models.ForeignKey(DeviceAlgorithmType, to_field='id', default='', on_delete=models.CASCADE,
+                                       verbose_name=u'关联算法类型')
+
+    class Meta:
+        db_table = 'device_uid_algorithm_type'
+        verbose_name = '设备uid关联算法类型'
+        verbose_name_plural = verbose_name