浏览代码

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

lijiangwei 4 年之前
父节点
当前提交
b22dec4068

+ 2 - 2
apps/WechatApplet/models.py

@@ -90,7 +90,7 @@ class WechatApplet(models.Model):
         filename = WeChat.getWXAppCode(self.getAccessToken(),page, company_no)
         filename = WeChat.getWXAppCode(self.getAccessToken(),page, company_no)
         return filename
         return filename
 
 
-    def getDeviceCode(self, device_id):
+    def getDeviceCode(self, device_id, company_no):
         page = 'pages/index/index'
         page = 'pages/index/index'
-        filename = WeChat.getDeviceCode(self.getAccessToken(),page, device_id)
+        filename = WeChat.getDeviceCode(self.getAccessToken(),page, device_id, company_no)
         return filename
         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')
     name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
     device_no = django_filters.CharFilter(field_name='device_no', 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')
     device_model = django_filters.CharFilter(field_name='device_model', lookup_expr='icontains')
+    status = django_filters.CharFilter(field_name='status',)
 
 
     class Meta:
     class Meta:
         model = DeviceModel
         model = DeviceModel

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

@@ -5,6 +5,13 @@ from apps.tenant.models import Tenant
 
 
 # Create your models here.
 # Create your models here.
 class DeviceModel(models.Model):
 class DeviceModel(models.Model):
+    FINE = 1
+    BAD = 2
+    STATUS_CHOICES = (
+        (FINE, '正常'),
+        (BAD, '异常'),
+    )
+
     name = models.CharField(max_length=50,verbose_name=u'名称')
     name = models.CharField(max_length=50,verbose_name=u'名称')
     device_no = models.CharField(max_length=50, verbose_name=u'编号',null=True)
     device_no = models.CharField(max_length=50, verbose_name=u'编号',null=True)
     device_model = models.CharField(max_length=100,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)
                                     editable=False)
     create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
     create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
     wxapp_img = models.CharField(verbose_name=u'设备微信二维码', max_length=250, null=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:
     class Meta:
         db_table = "device"
         db_table = "device"

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

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

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

@@ -81,6 +81,10 @@ class InspectionOrder(models.Model):
         for image in images:
         for image in images:
             repair_order.images.add(image.id)
             repair_order.images.add(image.id)
         repair_order.save()
         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.status = InspectionOrder.HAS_REPAIR
         self.repair_order = repair_order
         self.repair_order = repair_order

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

@@ -1,11 +1,11 @@
 # coding=utf-8
 # coding=utf-8
 
 
 import django_filters
 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')
     title = django_filters.CharFilter(field_name='title', lookup_expr='icontains')
 
 
     class Meta:
     class Meta:
-        model = Poster
+        model = OperationHelp
         fields = '__all__'
         fields = '__all__'

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

@@ -1,6 +1,9 @@
 from django.db import models
 from django.db import models
 from django.conf import settings
 from django.conf import settings
+from PIL import Image
+
 from apps.tenant.models import Tenant
 from apps.tenant.models import Tenant
+from utils.file_operation import UploadFile, DeleteFile
 
 
 class OperationHelp(models.Model):
 class OperationHelp(models.Model):
 
 
@@ -12,7 +15,84 @@ class OperationHelp(models.Model):
     enable = models.BooleanField(verbose_name=u"在用", default=True)
     enable = models.BooleanField(verbose_name=u"在用", default=True)
     tenant = models.ForeignKey(Tenant, verbose_name=u'企业', editable=False, on_delete=models.PROTECT, null=True)
     tenant = models.ForeignKey(Tenant, verbose_name=u'企业', editable=False, on_delete=models.PROTECT, null=True)
 
 
+
     class Meta:
     class Meta:
         db_table = 'operation_help'
         db_table = 'operation_help'
         ordering = ['-id', 'tenant']
         ordering = ['-id', 'tenant']
         verbose_name = u'运维帮助'
         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 rest_framework import serializers
-from .models import Poster
+from .models import OperationHelp
 from django.conf import settings
 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()
     enable_text = serializers.SerializerMethodField()
     create_user_name = serializers.CharField(source='create_user.employee.name', read_only=True)
     create_user_name = serializers.CharField(source='create_user.employee.name', read_only=True)
     tenant_name = serializers.CharField(source='tenant.company_name', read_only=True)
     tenant_name = serializers.CharField(source='tenant.company_name', read_only=True)
@@ -14,5 +13,15 @@ class PosterSerializer(serializers.ModelSerializer):
         return '否'
         return '否'
 
 
     class Meta:
     class Meta:
-        model = Poster
+        model = OperationHelp
         fields = '__all__'
         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 rest_framework.routers import SimpleRouter
 from django.conf.urls import url
 from django.conf.urls import url
-from .views import PosterViewSet
+from .views import OperationHelpViewSet
 
 
 urlpatterns = [
 urlpatterns = [
 
 
 ]
 ]
 
 
 router = SimpleRouter()
 router = SimpleRouter()
-router.register(r'', PosterViewSet)
+router.register(r'', OperationHelpViewSet)
 urlpatterns += router.urls
 urlpatterns += router.urls

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

@@ -3,67 +3,52 @@
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.custom_modelviewset import CustomModelViewSet
 from rest_framework.decorators import action
 from rest_framework.decorators import action
 import json
 import json
-import traceback
-from .models import Poster
+
+from .models import OperationHelp,OperationHelpImg,OperationHelpRadio
 from utils.permission import IsAdministratorUser
 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 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 utils import response_ok, response_error
+from django.db import transaction
 
 
-
-class PosterViewSet(CustomModelViewSet):
+class OperationHelpViewSet(CustomModelViewSet):
     permission_classes = [IsAdministratorUser, ]
     permission_classes = [IsAdministratorUser, ]
-    queryset = Poster.objects.filter()
-    serializer_class = PosterSerializer
+    queryset = OperationHelp.objects.filter()
+    serializer_class = OperationHelpSerializer
 
 
     def filter_queryset(self, queryset):
     def filter_queryset(self, queryset):
         queryset = queryset.filter(tenant=self.request.user.employee.tenant)
         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
         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.save()
         self.user.employee.baoxiu_count += 1
         self.user.employee.baoxiu_count += 1
         self.user.employee.save()
         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)
         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))
         tenant_log(user.employee, BizLog.INSERT, u'审核报修工单[%s],id=%d' % (self.no, self.id))
 
 
@@ -152,23 +156,13 @@ class RepairOrder(models.Model):
             raise CustomError('该报修单已作废!')
             raise CustomError('该报修单已作废!')
         self.status = settings.INVALID
         self.status = settings.INVALID
         self.save()
         self.save()
+        if self.device:
+            self.device.status = DeviceModel.FINE
+            self.device.save()
         # 记录操作
         # 记录操作
         RepairOrderRecord.objects.create(repair_order=self, status=settings.INVALID, user=user)
         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))
         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):
 class RepairOrderRecord(models.Model):
     repair_order = models.ForeignKey(RepairOrder, verbose_name='报修工单', on_delete=models.PROTECT,
     repair_order = models.ForeignKey(RepairOrder, verbose_name='报修工单', on_delete=models.PROTECT,
                                      related_name='repair_order_record')
                                      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'^device/', include('apps.tenant.device.urls')),
     url(r'^notices/', include('apps.tenant.notices.urls')),
     url(r'^notices/', include('apps.tenant.notices.urls')),
     url(r'^poster/', include('apps.tenant.poster.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 RepairOrderSerializer(serializers.ModelSerializer):
     class Meta:
     class Meta:
         model = RepairOrder
         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):
     def create(self, validated_data):
         if 'file' in self.initial_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.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
 from utils.exceptions import CustomError
 from utils.permission import isLogin, IsEmployee
 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.tenant.repair_order.filters import RepairOrderFilter
 from apps.upload.models import Upload
 from apps.upload.models import Upload
 from apps.log.models import BizLog
 from apps.log.models import BizLog
@@ -270,6 +270,9 @@ class RepairOrderViewSet(CustomModelViewSet):
                 # 更新工单状态为完工
                 # 更新工单状态为完工
                 instance.status = settings.FINISH
                 instance.status = settings.FINISH
                 instance.save()
                 instance.save()
+                if instance.device:
+                    instance.device.status = DeviceModel.FINE
+                    instance.device.save()
                 # 写入完工表
                 # 写入完工表
                 repair_order_finish = RepairOrderFinish.objects.create(repair_order_id=pk,
                 repair_order_finish = RepairOrderFinish.objects.create(repair_order_id=pk,
                                                                        fault_cause_id=fault_cause_id,
                                                                        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.views import APIView
 from rest_framework import generics
 from rest_framework import generics
 import datetime
 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 rest_framework.serializers import ValidationError
 from utils import response_ok, response_error
 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 django.utils import timezone
 from apps.tenant.notices.models import Notices
 from apps.tenant.notices.models import Notices
 from apps.tenant.notices.serializers import NoticesWXSerializer
 from apps.tenant.notices.serializers import NoticesWXSerializer
@@ -19,7 +19,7 @@ from utils.permission import isLogin, IsTenantUser
 from utils.wx.WXBizDataCrypt import WXBizDataCrypt
 from utils.wx.WXBizDataCrypt import WXBizDataCrypt
 from apps.tenant.poster.serializer import PosterSerializer, Poster
 from apps.tenant.poster.serializer import PosterSerializer, Poster
 from apps.tenant.device.models import DeviceModel
 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 *
 from .serializers import *
 
 
 class CustomerRefreshTokenView(RefreshJSONWebToken):
 class CustomerRefreshTokenView(RefreshJSONWebToken):
@@ -99,10 +99,10 @@ class HomeStatisticsView(APIView):
 
 
     def get(self, request):
     def get(self, request):
         statistics = {
         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:
         if request.user and request.user.is_authenticated:
             tenant = request.user.employee.tenant
             tenant = request.user.employee.tenant
@@ -110,26 +110,28 @@ class HomeStatisticsView(APIView):
             statistics['total'] = rows.filter(status__gte=RepairOrder.CHECKED).count()
             statistics['total'] = rows.filter(status__gte=RepairOrder.CHECKED).count()
             statistics['wait'] = rows.filter(status=RepairOrder.CHECKED).count()
             statistics['wait'] = rows.filter(status=RepairOrder.CHECKED).count()
             statistics['working'] = rows.filter(status=RepairOrder.DISPATCH).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)
             return response_ok(statistics)
         else:
         else:
             return response_ok(statistics)
             return response_ok(statistics)
 
 
+
 class StatisticsRepairView(APIView):
 class StatisticsRepairView(APIView):
     '''小程序统计数据'''
     '''小程序统计数据'''
     permission_classes = [IsTenantUser, ]
     permission_classes = [IsTenantUser, ]
+
     def get(self, request):
     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
         tenant = request.user.employee.tenant
         now = timezone.now()
         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:
         if days < 31:
             for d in range(days):
             for d in range(days):
                 date = (now + datetime.timedelta(days=-d)).strftime('%Y-%m-%d')
                 date = (now + datetime.timedelta(days=-d)).strftime('%Y-%m-%d')
                 item = {
                 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.append(item)
             data = data[::-1]
             data = data[::-1]
@@ -168,7 +170,7 @@ class StatisticsRepairView(APIView):
                 month = int(year_month[1])
                 month = int(year_month[1])
                 item = {
                 item = {
                     'title': year_months,
                     '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)
                 data.append(item)
         return response_ok(data)
         return response_ok(data)
@@ -176,21 +178,22 @@ class StatisticsRepairView(APIView):
 class StatisticsEvaluateView(APIView):
 class StatisticsEvaluateView(APIView):
     '''小程序评价统计数据'''
     '''小程序评价统计数据'''
     permission_classes = [IsTenantUser, ]
     permission_classes = [IsTenantUser, ]
+
     def get(self, request):
     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
         tenant = request.user.employee.tenant
         now = timezone.now()
         now = timezone.now()
         date = (now + datetime.timedelta(days=-days)).strftime('%Y-%m-%d')
         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') \
             .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')
             .values('repair_user__employee__name', 'starts', 'count')
         for row in rows:
         for row in rows:
             item = {
             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.append(item)
         data.sort(key=lambda d: d['data'], reverse=True)
         data.sort(key=lambda d: d['data'], reverse=True)
@@ -222,17 +225,22 @@ class PosterView(generics.ListAPIView):
 
 
 class DictView(APIView):
 class DictView(APIView):
     permission_classes = [isLogin, ]
     permission_classes = [isLogin, ]
+
     def get(self, request):
     def get(self, request):
         tenant = request.user.employee.tenant
         tenant = request.user.employee.tenant
         ret = {
         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)
         return response_ok(ret)
 
 
 
 
 class NoticesView(generics.ListAPIView):
 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
     serializer_class = NoticesWXSerializer
 
 
     def filter_queryset(self, queryset):
     def filter_queryset(self, queryset):
@@ -258,7 +266,7 @@ class NoticesDetailView(generics.RetrieveAPIView):
         return response_ok(NoticesWXSerializer(self.get_object()).data)
         return response_ok(NoticesWXSerializer(self.get_object()).data)
 
 
 class MessageView(generics.ListAPIView):
 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
     serializer_class = NoticesWXSerializer
 
 
     def filter_queryset(self, queryset):
     def filter_queryset(self, queryset):
@@ -271,6 +279,7 @@ class MessageView(generics.ListAPIView):
         f = NoticesFilter(self.request.GET, queryset=queryset)
         f = NoticesFilter(self.request.GET, queryset=queryset)
         return f.qs
         return f.qs
 
 
+
 class MessageListView(generics.ListAPIView):
 class MessageListView(generics.ListAPIView):
     permission_classes = [IsTenantUser, ]
     permission_classes = [IsTenantUser, ]
     queryset = Notices.objects.filter(type=Notices.MESSAGE)
     queryset = Notices.objects.filter(type=Notices.MESSAGE)
@@ -281,12 +290,27 @@ class MessageListView(generics.ListAPIView):
         f = NoticesFilter(self.request.GET, queryset=queryset)
         f = NoticesFilter(self.request.GET, queryset=queryset)
         return f.qs
         return f.qs
 
 
+
 class DeviceView(APIView):
 class DeviceView(APIView):
     permission_classes = [isLogin, ]
     permission_classes = [isLogin, ]
+
     def get(self, request):
     def get(self, request):
         param = request.GET.get('param')
         param = request.GET.get('param')
+        device_id = request.GET.get('device_id')
         data = []
         data = []
         rows = DeviceModel.objects.filter(tenant=request.user.employee.tenant)
         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:
         if param:
             rows = rows.filter(Q(name=param) | Q(device_no=param) | Q(device_model=param))
             rows = rows.filter(Q(name=param) | Q(device_no=param) | Q(device_model=param))
         else:
         else:
@@ -294,11 +318,11 @@ class DeviceView(APIView):
         for item in rows:
         for item in rows:
             build_dict = {
             build_dict = {
                 'id': item.id,
                 '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)
             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"
                                 <input type="text" name="name" autocomplete="off" class="layui-input"
                                        placeholder="设备名称"/>
                                        placeholder="设备名称"/>
                             </div>
                             </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>
                         </form>
                         <div style="clear: both;"></div>
                         <div style="clear: both;"></div>
                     </div>
                     </div>
@@ -131,6 +138,8 @@
                 , {field: 'device_model', title: '型号', width: 200}
                 , {field: 'device_model', title: '型号', width: 200}
                 , {field: 'branch', title: '大地点', width: 150}
                 , {field: 'branch', title: '大地点', width: 150}
                 , {field: 'address', title: '小地点', width: 200}
                 , {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_user_text', title: '添加人', width: 100}
                 , {field: 'create_time', title: '添加时间', width: 200}
                 , {field: 'create_time', title: '添加时间', width: 200}
                 , {width: 150, align: 'center', fixed: 'right', toolbar: '#device-operate-bar'}
                 , {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
         return filename
 
 
     @staticmethod
     @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)
         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,
                 "width": 1280,
                 "line_color": {"r": 43, "g": 162, "b": 69},  # 自定义颜色
                 "line_color": {"r": 43, "g": 162, "b": 69},  # 自定义颜色
                 "is_hyaline": True}
                 "is_hyaline": True}