Procházet zdrojové kódy

Merge branch 'master' of http://git.zzliaoyuan.com:4000/wushaodong/ly_baoxiu_admin

lijiangwei před 4 roky
rodič
revize
b22dec4068

+ 2 - 2
apps/WechatApplet/models.py

@@ -90,7 +90,7 @@ class WechatApplet(models.Model):
         filename = WeChat.getWXAppCode(self.getAccessToken(),page, company_no)
         return filename
 
-    def getDeviceCode(self, device_id):
+    def getDeviceCode(self, device_id, company_no):
         page = 'pages/index/index'
-        filename = WeChat.getDeviceCode(self.getAccessToken(),page, device_id)
+        filename = WeChat.getDeviceCode(self.getAccessToken(),page, device_id, company_no)
         return filename

+ 1 - 0
apps/tenant/device/filters.py

@@ -9,6 +9,7 @@ class DeviceFilter(django_filters.FilterSet):
     name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
     device_no = django_filters.CharFilter(field_name='device_no', lookup_expr='icontains')
     device_model = django_filters.CharFilter(field_name='device_model', lookup_expr='icontains')
+    status = django_filters.CharFilter(field_name='status',)
 
     class Meta:
         model = DeviceModel

+ 10 - 0
apps/tenant/device/models.py

@@ -5,6 +5,13 @@ from apps.tenant.models import Tenant
 
 # Create your models here.
 class DeviceModel(models.Model):
+    FINE = 1
+    BAD = 2
+    STATUS_CHOICES = (
+        (FINE, '正常'),
+        (BAD, '异常'),
+    )
+
     name = models.CharField(max_length=50,verbose_name=u'名称')
     device_no = models.CharField(max_length=50, verbose_name=u'编号',null=True)
     device_model = models.CharField(max_length=100,verbose_name=u'设备型号',null=True)
@@ -15,6 +22,9 @@ class DeviceModel(models.Model):
                                     editable=False)
     create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
     wxapp_img = models.CharField(verbose_name=u'设备微信二维码', max_length=250, null=True)
+    repair_count = models.IntegerField(verbose_name='维修次数', default=0)
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'状态',
+                                              default=FINE)
 
     class Meta:
         db_table = "device"

+ 2 - 1
apps/tenant/device/serializers.py

@@ -7,6 +7,7 @@ from .models import *
 
 class DeviceSerializer(serializers.ModelSerializer):
     create_user_text = serializers.CharField(source='create_user.employee.name', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
 
     class Meta:
         model = DeviceModel
@@ -19,7 +20,7 @@ class DeviceSerializer(serializers.ModelSerializer):
 
         id = instance.id
         applet = WechatApplet.objects.filter(authorizer_appid=settings.WEAPP['appid']).first()
-        filename = applet.getDeviceCode(id)
+        filename = applet.getDeviceCode(id, instance.tenant.company_no)
         instance.wxapp_img = "{0}{1}".format(settings.MEDIA_URL,filename)
         instance.save()
 

+ 4 - 0
apps/tenant/inspection_order/models.py

@@ -81,6 +81,10 @@ class InspectionOrder(models.Model):
         for image in images:
             repair_order.images.add(image.id)
         repair_order.save()
+        if repair_order.device:
+            repair_order.device.repair_count += 1
+            repair_order.device.status = DeviceModel.BAD
+            repair_order.device.save()
 
         self.status = InspectionOrder.HAS_REPAIR
         self.repair_order = repair_order

+ 3 - 3
apps/tenant/operation_help/filters.py

@@ -1,11 +1,11 @@
 # coding=utf-8
 
 import django_filters
-from .models import Poster
+from .models import OperationHelp
 
-class PosterFilter(django_filters.FilterSet):
+class OperationHelpFilter(django_filters.FilterSet):
     title = django_filters.CharFilter(field_name='title', lookup_expr='icontains')
 
     class Meta:
-        model = Poster
+        model = OperationHelp
         fields = '__all__'

+ 80 - 0
apps/tenant/operation_help/models.py

@@ -1,6 +1,9 @@
 from django.db import models
 from django.conf import settings
+from PIL import Image
+
 from apps.tenant.models import Tenant
+from utils.file_operation import UploadFile, DeleteFile
 
 class OperationHelp(models.Model):
 
@@ -12,7 +15,84 @@ class OperationHelp(models.Model):
     enable = models.BooleanField(verbose_name=u"在用", default=True)
     tenant = models.ForeignKey(Tenant, verbose_name=u'企业', editable=False, on_delete=models.PROTECT, null=True)
 
+
     class Meta:
         db_table = 'operation_help'
         ordering = ['-id', 'tenant']
         verbose_name = u'运维帮助'
+
+class OperationHelpImg(models.Model):
+    image = models.CharField(verbose_name=u'图片路径', max_length=250)
+    width = models.IntegerField(verbose_name=u"图片宽度")
+    height = models.IntegerField(verbose_name=u"图片高度")
+
+
+    class Meta:
+        db_table = 'operation_help_img'
+        ordering = ['-id']
+        verbose_name = u'运维帮助图片'
+
+    def _add_img(self, file, user_id):
+        width = None
+        height = None
+
+        path = "operation_help_img/"
+        filename = UploadFile(file, path, user_id)
+        fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
+
+        try:
+            img = Image.open(fullname)
+            width, height = img.size
+            # 缩略图压缩宽或高最大200
+            if width > 1440:
+                img = img.resize((1440, int((height / width) * 1440)), Image.ANTIALIAS)
+                img.save(fullname)
+                width, height = img.size
+        except:
+            pass
+
+        self.image = "%s%s" % (settings.MEDIA_URL, filename)
+        self.width = width
+        self.height = height
+        self.save()
+
+    def del_images(self):
+        image = self.image
+        # self.delete()
+        DeleteFile(image)
+
+class OperationHelpRadio(models.Model):
+    radio_path = models.CharField(verbose_name=u'视频路径', max_length=250)
+    radio_size = models.FloatField(verbose_name="视频大小",blank=True, default=0)
+    radio_time = models.FloatField(verbose_name="视频时长",blank=True, default=0)
+
+    class Meta:
+        db_table = 'operation_help_radio'
+        ordering = ['-id']
+        verbose_name = u'运维帮助视频'
+
+    def _add_radio(self, file, user_id):
+
+
+        path = "operation_help_radio/"
+        filename = UploadFile(file, path, user_id)
+        fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
+
+        # try:
+        #     img = Image.open(fullname)
+        #     width, height = img.size
+        #     # 缩略图压缩宽或高最大200
+        #     if width > 1440:
+        #         img = img.resize((1440, int((height / width) * 1440)), Image.ANTIALIAS)
+        #         img.save(fullname)
+        #         width, height = img.size
+        # except:
+        #     pass
+
+        self.radio_path = "%s%s" % (settings.MEDIA_URL, filename)
+        self.save()
+
+    def del_radio(self):
+        radio = self.radio
+        # self.delete()
+        DeleteFile(radio)

+ 13 - 4
apps/tenant/operation_help/serializer.py

@@ -1,9 +1,8 @@
 from rest_framework import serializers
-from .models import Poster
+from .models import OperationHelp
 from django.conf import settings
 
-class PosterSerializer(serializers.ModelSerializer):
-    location_text = serializers.CharField(source='get_location_display', read_only=True)
+class OperationHelpSerializer(serializers.ModelSerializer):
     enable_text = serializers.SerializerMethodField()
     create_user_name = serializers.CharField(source='create_user.employee.name', read_only=True)
     tenant_name = serializers.CharField(source='tenant.company_name', read_only=True)
@@ -14,5 +13,15 @@ class PosterSerializer(serializers.ModelSerializer):
         return '否'
 
     class Meta:
-        model = Poster
+        model = OperationHelp
         fields = '__all__'
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.context['request'].user
+        validated_data['tenant'] = self.context['request'].user.employee.tenant
+        instance = super(OperationHelpSerializer, self).create(validated_data)
+
+        return instance
+
+
+

+ 2 - 2
apps/tenant/operation_help/urls.py

@@ -1,11 +1,11 @@
 from rest_framework.routers import SimpleRouter
 from django.conf.urls import url
-from .views import PosterViewSet
+from .views import OperationHelpViewSet
 
 urlpatterns = [
 
 ]
 
 router = SimpleRouter()
-router.register(r'', PosterViewSet)
+router.register(r'', OperationHelpViewSet)
 urlpatterns += router.urls

+ 37 - 52
apps/tenant/operation_help/views.py

@@ -3,67 +3,52 @@
 from utils.custom_modelviewset import CustomModelViewSet
 from rest_framework.decorators import action
 import json
-import traceback
-from .models import Poster
+
+from .models import OperationHelp,OperationHelpImg,OperationHelpRadio
 from utils.permission import IsAdministratorUser
-from .serializer import PosterSerializer
+from .serializer import OperationHelpSerializer
+from apps.tenant import tenant_log
 from apps.log.models import BizLog
-from .filters import PosterFilter
-from django.db import transaction
-from utils.exceptions import CustomError
+from .filters import OperationHelpFilter
 from utils import response_ok, response_error
+from django.db import transaction
 
-
-class PosterViewSet(CustomModelViewSet):
+class OperationHelpViewSet(CustomModelViewSet):
     permission_classes = [IsAdministratorUser, ]
-    queryset = Poster.objects.filter()
-    serializer_class = PosterSerializer
+    queryset = OperationHelp.objects.filter()
+    serializer_class = OperationHelpSerializer
 
     def filter_queryset(self, queryset):
         queryset = queryset.filter(tenant=self.request.user.employee.tenant)
-        f = PosterFilter(self.request.GET, queryset=queryset)
+        f = OperationHelpFilter(self.request.GET, queryset=queryset)
         return f.qs
 
-    def create(self, request, *args, **kwargs):
-        data = json.loads(request.POST.get('data'))
-        banner_img = request.FILES.get('banner_img')
-        try:
-            with transaction.atomic():
-                data['create_user'] = request.user
-                tenant = request.user.employee.tenant
-                posters = Poster.objects.filter(tenant=tenant, enable=True).count()
-                if posters >= 2:
-                    raise CustomError(u'只能添加2个在用的轮播!')
-                data['tenant'] = tenant
-                poster = Poster.objects.create(**data)
-                poster._add_img(banner_img,request.user)
-                BizLog.objects.addnew(tenant, request.user, BizLog.INSERT, u'添加轮播信息', data)
-            return response_ok()
-        except CustomError as e:
-            return response_error(e.get_error_msg())
-        except Exception as e:
-            return response_error(str(e))
+    def perform_create(self, serializer):
+        super(OperationHelpViewSet,self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        tenant_log(self.request.user.employee, BizLog.INSERT, u'添加运维帮助[%s],id=%d' % (instance.name, instance.id),
+                   validated_data)
+
+    def perform_update(self, serializer):
+        super(OperationHelpViewSet,self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        tenant_log(self.request.user.employee, BizLog.INSERT, u'修改运维帮助[%s],id=%d' % (instance.name, instance.id),
+                   validated_data)
 
-    @action(methods=['post'], detail=True)
-    def update_poster(self, request, pk):
-        data = json.loads(request.POST.get('data'))
-        # data = {'title': '644', 'content': '发斯蒂芬44', 'location': '1', 'enable': '1'}
-        banner_img = request.FILES.get('banner_img')
-        try:
-            if data['enable']:
-                tenant = request.user.employee.tenant
-                posters = Poster.objects.filter(tenant=tenant, enable=True).exclude(id=pk).count()
-                if posters >= 2:
-                    raise CustomError(u'只能添加2个在用的轮播!')
-            with transaction.atomic():
-                Poster.objects.filter(id=pk).update(**data)
-                poster = self.get_object()
-                if banner_img:
-                    poster.del_images()
-                    poster._add_img(banner_img,request.user)
-        except CustomError as e:
-            return response_error(e.get_error_msg())
-        except Exception as e:
-            return response_error(str(e))
-        return response_ok()
+    @action(methods=['post'], detail=False)
+    def upload_image(self, request):
+        file = self.request.FILES.get('file')
+        img = OperationHelpImg.objects._add_img(file,request.user)
+        if img:
+            return response_ok(img.image)
+        return response_error('上传失败,请重新上传!')
 
+    @action(methods=['post'], detail=False)
+    def upload_radio(self, request):
+        file = self.request.FILES.get('file')
+        radio_path = OperationHelpRadio.objects._add_img(file, request.user)
+        if radio_path:
+            return response_ok(radio_path)
+        return response_error('上传失败,请重新上传!')

+ 7 - 13
apps/tenant/repair_order/models.py

@@ -133,6 +133,10 @@ class RepairOrder(models.Model):
         self.save()
         self.user.employee.baoxiu_count += 1
         self.user.employee.save()
+        if self.device:
+            self.device.repair_count += 1
+            self.device.status = DeviceModel.BAD
+            self.device.save()
         RepairOrderRecord.objects.create(repair_order=self, status=settings.CHECKED, user=user)
         tenant_log(user.employee, BizLog.INSERT, u'审核报修工单[%s],id=%d' % (self.no, self.id))
 
@@ -152,23 +156,13 @@ class RepairOrder(models.Model):
             raise CustomError('该报修单已作废!')
         self.status = settings.INVALID
         self.save()
+        if self.device:
+            self.device.status = DeviceModel.FINE
+            self.device.save()
         # 记录操作
         RepairOrderRecord.objects.create(repair_order=self, status=settings.INVALID, user=user)
         tenant_log(user.employee, BizLog.UPDATE, u'作废报修工单[%s],id=%d' % (self.no, self.id))
 
-    def finish_order(self, user, notes, images):
-        # 完工
-        self.status = settings.FINISH
-        self.save()
-
-        # 记录操作
-        repair_order_record = RepairOrderRecord.objects.create(repair_order=self, status=settings.FINISH, user=user,
-                                                               notes=notes)
-        for image in images:
-            repair_order_record.images.add(image)
-        repair_order_record.save()
-
-
 class RepairOrderRecord(models.Model):
     repair_order = models.ForeignKey(RepairOrder, verbose_name='报修工单', on_delete=models.PROTECT,
                                      related_name='repair_order_record')

+ 1 - 0
apps/tenant/urls.py

@@ -20,6 +20,7 @@ urlpatterns = [
     url(r'^device/', include('apps.tenant.device.urls')),
     url(r'^notices/', include('apps.tenant.notices.urls')),
     url(r'^poster/', include('apps.tenant.poster.urls')),
+    url(r'^operation_help/', include('apps.tenant.operation_help.urls')),
 ]
 
 

+ 1 - 1
apps/wxapp/repair_order/serializers.py

@@ -61,7 +61,7 @@ class RepairOrderListSerializer(serializers.ModelSerializer):
 class RepairOrderSerializer(serializers.ModelSerializer):
     class Meta:
         model = RepairOrder
-        fields = ('id', 'fault_des', 'tel', 'name', 'repair_type','device_name','device_address',)
+        fields = ('id', 'fault_des', 'tel', 'name', 'device', 'repair_type','device_name','device_address',)
 
     def create(self, validated_data):
         if 'file' in self.initial_data:

+ 4 - 1
apps/wxapp/repair_order/views.py

@@ -9,7 +9,7 @@ from utils import response_ok, response_error
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
 from utils.permission import isLogin, IsEmployee
-from apps.tenant.repair_order.models import RepairOrder, RepairOrderRecord, RepairOrderComment, RepairOrderFinish
+from apps.tenant.repair_order.models import RepairOrder, RepairOrderRecord, RepairOrderComment, RepairOrderFinish, DeviceModel
 from apps.tenant.repair_order.filters import RepairOrderFilter
 from apps.upload.models import Upload
 from apps.log.models import BizLog
@@ -270,6 +270,9 @@ class RepairOrderViewSet(CustomModelViewSet):
                 # 更新工单状态为完工
                 instance.status = settings.FINISH
                 instance.save()
+                if instance.device:
+                    instance.device.status = DeviceModel.FINE
+                    instance.device.save()
                 # 写入完工表
                 repair_order_finish = RepairOrderFinish.objects.create(repair_order_id=pk,
                                                                        fault_cause_id=fault_cause_id,

+ 54 - 30
apps/wxapp/views.py

@@ -6,11 +6,11 @@ from django.db import transaction
 from rest_framework.views import APIView
 from rest_framework import generics
 import datetime
-from django.db.models import Sum,Count
-from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
+from django.db.models import Sum, Count
+from rest_framework_jwt.views import ObtainJSONWebToken, VerifyJSONWebToken, RefreshJSONWebToken
 from rest_framework.serializers import ValidationError
 from utils import response_ok, response_error
-from apps.tenant.option.serializers import OptionSerializer,Option
+from apps.tenant.option.serializers import OptionSerializer, Option
 from django.utils import timezone
 from apps.tenant.notices.models import Notices
 from apps.tenant.notices.serializers import NoticesWXSerializer
@@ -19,7 +19,7 @@ from utils.permission import isLogin, IsTenantUser
 from utils.wx.WXBizDataCrypt import WXBizDataCrypt
 from apps.tenant.poster.serializer import PosterSerializer, Poster
 from apps.tenant.device.models import DeviceModel
-from apps.tenant.repair_order.models import RepairOrder,RepairOrderComment
+from apps.tenant.repair_order.models import RepairOrder, RepairOrderComment
 from .serializers import *
 
 class CustomerRefreshTokenView(RefreshJSONWebToken):
@@ -99,10 +99,10 @@ class HomeStatisticsView(APIView):
 
     def get(self, request):
         statistics = {
-            'total':0, #总报修
-            'wait':0, #待维修
-            'working':0, #维修中
-            'complete':0, #已完工
+            'total': 0,  # 总报修
+            'wait': 0,  # 待维修
+            'working': 0,  # 维修中
+            'complete': 0,  # 已完工
         }
         if request.user and request.user.is_authenticated:
             tenant = request.user.employee.tenant
@@ -110,26 +110,28 @@ class HomeStatisticsView(APIView):
             statistics['total'] = rows.filter(status__gte=RepairOrder.CHECKED).count()
             statistics['wait'] = rows.filter(status=RepairOrder.CHECKED).count()
             statistics['working'] = rows.filter(status=RepairOrder.DISPATCH).count()
-            statistics['complete'] = rows.filter(status__in=[RepairOrder.FINISH,RepairOrder.APPRAISE,]).count()
+            statistics['complete'] = rows.filter(status__in=[RepairOrder.FINISH, RepairOrder.APPRAISE, ]).count()
             return response_ok(statistics)
         else:
             return response_ok(statistics)
 
+
 class StatisticsRepairView(APIView):
     '''小程序统计数据'''
     permission_classes = [IsTenantUser, ]
+
     def get(self, request):
-        days = int(request.GET.get('days')) # 7 30 365
-        data = []# 报修数据
+        days = int(request.GET.get('days'))  # 7 30 365
+        data = []  # 报修数据
         tenant = request.user.employee.tenant
         now = timezone.now()
-        rows = RepairOrder.objects.filter(tenant=tenant,status__gte=RepairOrder.CHECKED)
+        rows = RepairOrder.objects.filter(tenant=tenant, status__gte=RepairOrder.CHECKED)
         if days < 31:
             for d in range(days):
                 date = (now + datetime.timedelta(days=-d)).strftime('%Y-%m-%d')
                 item = {
-                    'title':date[5:],
-                    'data':rows.filter(create_time__gte=date,create_time__lte=date+' 23:59:59').count(),
+                    'title': date[5:],
+                    'data': rows.filter(create_time__gte=date, create_time__lte=date + ' 23:59:59').count(),
                 }
                 data.append(item)
             data = data[::-1]
@@ -168,7 +170,7 @@ class StatisticsRepairView(APIView):
                 month = int(year_month[1])
                 item = {
                     'title': year_months,
-                    'data':rows.filter(create_time__year=year, create_time__month=month).count(),
+                    'data': rows.filter(create_time__year=year, create_time__month=month).count(),
                 }
                 data.append(item)
         return response_ok(data)
@@ -176,21 +178,22 @@ class StatisticsRepairView(APIView):
 class StatisticsEvaluateView(APIView):
     '''小程序评价统计数据'''
     permission_classes = [IsTenantUser, ]
+
     def get(self, request):
-        days = int(request.GET.get('days')) # 7 30 365
-        data = []# 评价数据
+        days = int(request.GET.get('days'))  # 7 30 365
+        data = []  # 评价数据
         tenant = request.user.employee.tenant
         now = timezone.now()
         date = (now + datetime.timedelta(days=-days)).strftime('%Y-%m-%d')
         # 分组统计分析
-        rows = RepairOrderComment.objects.filter(repair_order__tenant=tenant,create_time__gte=date,) \
+        rows = RepairOrderComment.objects.filter(repair_order__tenant=tenant, create_time__gte=date, ) \
             .values('repair_user_id') \
-            .annotate(starts=Sum('start'),count=Count('id')) \
+            .annotate(starts=Sum('start'), count=Count('id')) \
             .values('repair_user__employee__name', 'starts', 'count')
         for row in rows:
             item = {
-                'title':row['repair_user__employee__name'],
-                'data':round(float(row['starts']) / float(row['count']),2),
+                'title': row['repair_user__employee__name'],
+                'data': round(float(row['starts']) / float(row['count']), 2),
             }
             data.append(item)
         data.sort(key=lambda d: d['data'], reverse=True)
@@ -222,17 +225,22 @@ class PosterView(generics.ListAPIView):
 
 class DictView(APIView):
     permission_classes = [isLogin, ]
+
     def get(self, request):
         tenant = request.user.employee.tenant
         ret = {
-            'repair_type': OptionSerializer(Option.objects.filter(delete=False,type=Option.REPAIRS_TYPE, enable=True, tenant=tenant), many=True).data,
-            'fault_cause': OptionSerializer(Option.objects.filter(delete=False,type=Option.FAULT_CAUSE, enable=True, tenant=tenant), many=True).data,
+            'repair_type': OptionSerializer(
+                Option.objects.filter(delete=False, type=Option.REPAIRS_TYPE, enable=True, tenant=tenant),
+                many=True).data,
+            'fault_cause': OptionSerializer(
+                Option.objects.filter(delete=False, type=Option.FAULT_CAUSE, enable=True, tenant=tenant),
+                many=True).data,
         }
         return response_ok(ret)
 
 
 class NoticesView(generics.ListAPIView):
-    queryset = Notices.objects.filter(type=Notices.NOTICE,end_time__gte=timezone.now().date())
+    queryset = Notices.objects.filter(type=Notices.NOTICE, end_time__gte=timezone.now().date())
     serializer_class = NoticesWXSerializer
 
     def filter_queryset(self, queryset):
@@ -258,7 +266,7 @@ class NoticesDetailView(generics.RetrieveAPIView):
         return response_ok(NoticesWXSerializer(self.get_object()).data)
 
 class MessageView(generics.ListAPIView):
-    queryset = Notices.objects.filter(type=Notices.MESSAGE,end_time__gte=timezone.now().date())
+    queryset = Notices.objects.filter(type=Notices.MESSAGE, end_time__gte=timezone.now().date())
     serializer_class = NoticesWXSerializer
 
     def filter_queryset(self, queryset):
@@ -271,6 +279,7 @@ class MessageView(generics.ListAPIView):
         f = NoticesFilter(self.request.GET, queryset=queryset)
         return f.qs
 
+
 class MessageListView(generics.ListAPIView):
     permission_classes = [IsTenantUser, ]
     queryset = Notices.objects.filter(type=Notices.MESSAGE)
@@ -281,12 +290,27 @@ class MessageListView(generics.ListAPIView):
         f = NoticesFilter(self.request.GET, queryset=queryset)
         return f.qs
 
+
 class DeviceView(APIView):
     permission_classes = [isLogin, ]
+
     def get(self, request):
         param = request.GET.get('param')
+        device_id = request.GET.get('device_id')
         data = []
         rows = DeviceModel.objects.filter(tenant=request.user.employee.tenant)
+        if device_id:
+            item = rows.filter(id=device_id).first()
+            if item:
+                data = {
+                    'id': item.id,
+                    'name': item.name,
+                    'address': '{}{}'.format(item.branch, item.address),
+                }
+                return response_ok(data)
+            else:
+                return response_error('设备信息错误,请重新查询!')
+
         if param:
             rows = rows.filter(Q(name=param) | Q(device_no=param) | Q(device_model=param))
         else:
@@ -294,11 +318,11 @@ class DeviceView(APIView):
         for item in rows:
             build_dict = {
                 'id': item.id,
-                'name':item.name,
-                'device_no':item.device_no,
-                'device_model':item.device_model,
-                'branch':item.branch,
-                'address':item.address,
+                'name': item.name,
+                'device_no': item.device_no,
+                'device_model': item.device_model,
+                'branch': item.branch,
+                'address': item.address,
             }
             data.append(build_dict)
 

+ 9 - 0
uis/tenant/device/index.html

@@ -89,6 +89,13 @@
                                 <input type="text" name="name" autocomplete="off" class="layui-input"
                                        placeholder="设备名称"/>
                             </div>
+                            <div class="seach_items">
+                                <select name="status" style="width: 40px;">
+                                    <option value="">请选择状态</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">异常</option>
+                                </select>
+                            </div>
                         </form>
                         <div style="clear: both;"></div>
                     </div>
@@ -131,6 +138,8 @@
                 , {field: 'device_model', title: '型号', width: 200}
                 , {field: 'branch', title: '大地点', width: 150}
                 , {field: 'address', title: '小地点', width: 200}
+                , {field: 'status_text', title: '状态', width: 100}
+                , {field: 'repair_count', title: '维修次数', width: 100}
                 , {field: 'create_user_text', title: '添加人', width: 100}
                 , {field: 'create_time', title: '添加时间', width: 200}
                 , {width: 150, align: 'center', fixed: 'right', toolbar: '#device-operate-bar'}

+ 2 - 2
utils/wx/wechat.py

@@ -247,10 +247,10 @@ class WeChat(object):
         return filename
 
     @staticmethod
-    def getDeviceCode(access_token, page, device_id):
+    def getDeviceCode(access_token, page, device_id, company_no):
         '''获取设备二维码'''
         url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={}'.format(access_token)
-        data = {"scene": "device_id={}".format(device_id),
+        data = {"scene": "company_no={}&device_id={}".format(company_no, device_id),
                 "width": 1280,
                 "line_color": {"r": 43, "g": 162, "b": 69},  # 自定义颜色
                 "is_hyaline": True}