wushaodong 4 gadi atpakaļ
vecāks
revīzija
1297cc5f91
42 mainītis faili ar 574 papildinājumiem un 1147 dzēšanām
  1. 0 0
      apps/tenant/area/__init__.py
  2. 0 21
      apps/tenant/area/filters.py
  3. 0 0
      apps/tenant/area/migrations/__init__.py
  4. 0 47
      apps/tenant/area/models.py
  5. 0 41
      apps/tenant/area/serializers.py
  6. 0 16
      apps/tenant/area/urls.py
  7. 0 97
      apps/tenant/area/views.py
  8. 0 0
      apps/tenant/building/__init__.py
  9. 0 11
      apps/tenant/building/filters.py
  10. 0 0
      apps/tenant/building/migrations/__init__.py
  11. 0 27
      apps/tenant/building/models.py
  12. 0 11
      apps/tenant/building/resources.py
  13. 0 29
      apps/tenant/building/serializer.py
  14. 0 12
      apps/tenant/building/urls.py
  15. 0 109
      apps/tenant/building/views.py
  16. 3 3
      apps/tenant/device/views.py
  17. 0 2
      apps/tenant/employee/models.py
  18. 2 9
      apps/tenant/employee/views.py
  19. 0 0
      apps/tenant/equipment/__init__.py
  20. 0 15
      apps/tenant/equipment/filters.py
  21. 0 0
      apps/tenant/equipment/migrations/__init__.py
  22. 0 22
      apps/tenant/equipment/models.py
  23. 0 35
      apps/tenant/equipment/serializers.py
  24. 0 12
      apps/tenant/equipment/urls.py
  25. 0 62
      apps/tenant/equipment/views.py
  26. 2 2
      apps/tenant/notices/views.py
  27. 0 0
      apps/tenant/permissions/__init__.py
  28. 0 62
      apps/tenant/permissions/consts.py
  29. 0 70
      apps/tenant/permissions/serializers.py
  30. 0 15
      apps/tenant/permissions/urls.py
  31. 0 89
      apps/tenant/permissions/views.py
  32. 45 26
      apps/tenant/poster/views.py
  33. 1 4
      apps/tenant/urls.py
  34. 8 6
      apps/wxapp/repair_order/views.py
  35. 5 4
      apps/wxapp/views.py
  36. 0 3
      ly_baoxiu_admin/settings.py
  37. 85 0
      uis/tenant/banner/detail.html
  38. 230 0
      uis/tenant/banner/edit.html
  39. 185 0
      uis/tenant/banner/index.html
  40. 8 5
      uis/tenant/index.html
  41. 0 140
      uis/tenant/statistics/commission_index.html
  42. 0 140
      uis/tenant/statistics/page_index.html

+ 0 - 0
apps/tenant/area/__init__.py


+ 0 - 21
apps/tenant/area/filters.py

@@ -1,21 +0,0 @@
-# coding=utf-8
-
-import django_filters
-from .models import Area, Department
-
-
-class AreaFilter(django_filters.FilterSet):
-    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
-    tenant = django_filters.CharFilter(field_name='tenant_id')
-
-    class Meta:
-        model = Area
-        fields = '__all__'
-
-class AreaDepartmentFilter(django_filters.FilterSet):
-    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
-    area_name = django_filters.CharFilter(field_name='area__name', lookup_expr='icontains')
-
-    class Meta:
-        model = Department
-        fields = '__all__'

+ 0 - 0
apps/tenant/area/migrations/__init__.py


+ 0 - 47
apps/tenant/area/models.py

@@ -1,47 +0,0 @@
-from django.conf import settings
-from django.db import models
-
-from apps.tenant.models import Tenant
-
-
-class Area(models.Model):
-    name = models.CharField(max_length=100, verbose_name=u'区域名称')
-    tenant = models.ForeignKey(Tenant, verbose_name=u'企业', editable=False, on_delete=models.PROTECT)
-    notes = models.CharField(max_length=500, verbose_name=u"备注", null=True)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", on_delete=models.PROTECT,
-                                    editable=False)
-    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
-    sort = models.PositiveSmallIntegerField(verbose_name=u'排序', help_text=u'越小越靠前', default=0)
-    enable = models.BooleanField(verbose_name=u"在用", default=True)
-    delete = models.BooleanField(verbose_name=u"删除", default=False, editable=False)
-
-    class Meta:
-        db_table = 'area'
-        verbose_name = u'区域信息'
-        ordering = ['-id',  'sort', ]
-        default_permissions = ()
-        permissions = [
-            ('browse_area', u'查看'),
-            ('add_area', u'添加'),
-            ('delete_area', u'删除')
-        ]
-
-
-class Department(models.Model):
-    name = models.CharField(max_length=100, verbose_name=u'部门名称')
-    area = models.ForeignKey(Area, verbose_name=u'所属区域',  on_delete=models.PROTECT)
-    notes = models.CharField(max_length=500, verbose_name=u"备注", null=True)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", on_delete=models.PROTECT,
-                                    editable=False)
-    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
-    sort = models.PositiveSmallIntegerField(verbose_name=u'排序', help_text=u'越小越靠前', default=0)
-    enable = models.BooleanField(verbose_name=u"在用", default=True)
-    delete = models.BooleanField(verbose_name=u"删除", default=False, editable=False)
-
-    class Meta:
-        db_table = 'area_department'
-        verbose_name = u'区域部门'
-        ordering = ['-id', 'sort', ]
-        default_permissions = ()
-        permissions = [
-        ]

+ 0 - 41
apps/tenant/area/serializers.py

@@ -1,41 +0,0 @@
-# coding=utf-8
-
-from rest_framework import serializers
-from .models import Area,Department
-
-
-class AreaSerializer(serializers.ModelSerializer):
-    enable_text = serializers.SerializerMethodField()
-
-    def get_enable_text(self,obj):
-        if obj.enable:
-            return '是'
-        return '否'
-
-    class Meta:
-        model = Area
-        fields = '__all__'
-
-    def create(self, validated_data):
-        validated_data['tenant'] = self.context['request'].user.employee.tenant
-        validated_data['create_user'] = self.context['request'].user
-        instance = super(AreaSerializer, self).create(validated_data)
-        return instance
-
-class AreaDepartmentSerializer(serializers.ModelSerializer):
-    area_name = serializers.CharField(source='area.name', read_only=True)
-    enable_text = serializers.SerializerMethodField()
-
-    def get_enable_text(self,obj):
-        if obj.enable:
-            return '是'
-        return '否'
-
-    class Meta:
-        model = Department
-        fields = '__all__'
-
-    def create(self, validated_data):
-        validated_data['create_user'] = self.context['request'].user
-        instance = super(AreaDepartmentSerializer, self).create(validated_data)
-        return instance

+ 0 - 16
apps/tenant/area/urls.py

@@ -1,16 +0,0 @@
-# coding=utf-8
-
-
-from django.conf.urls import url, include
-from rest_framework.routers import SimpleRouter
-
-from .views import AreaViewSet, AreaDepartmentViewSet, DictView
-
-urlpatterns = [
-    url(r'dict/$', DictView.as_view()),
-]
-
-router = SimpleRouter()
-router.register(r'area', AreaViewSet)
-router.register(r'department', AreaDepartmentViewSet)
-urlpatterns += router.urls

+ 0 - 97
apps/tenant/area/views.py

@@ -1,97 +0,0 @@
-# coding=utf-8
-from django.db import transaction
-from rest_framework.views import APIView
-from utils import response_ok
-from utils.custom_modelviewset import CustomModelViewSet
-from utils.exceptions import CustomError
-from utils.permission import IsTenantUser, permission_required
-from apps.tenant import tenant_log
-from apps.log.models import BizLog
-from .serializers import AreaSerializer, AreaDepartmentSerializer
-from .models import Area, Department
-from .filters import AreaFilter, AreaDepartmentFilter
-
-class DictView(APIView):
-    permission_classes = [IsTenantUser, ]
-
-    def get(self, request):
-        tenant = request.user.employee.tenant
-        ret = {
-            'area': AreaSerializer(Area.objects.filter(delete=False, enable=True, tenant=tenant), many=True).data,
-            'department': AreaDepartmentSerializer(Department.objects.filter(delete=False, enable=True, area__tenant=tenant), many=True).data
-        }
-        return response_ok(ret)
-
-
-class AreaViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
-    queryset = Area.objects.filter(delete=False)
-    serializer_class = AreaSerializer
-
-    @permission_required('area.browse_area')
-    def filter_queryset(self, queryset):
-        queryset = queryset.filter(tenant=self.request.user.employee.tenant)
-        f = AreaFilter(self.request.GET, queryset=queryset)
-        return f.qs
-
-    @permission_required('area.add_area')
-    def perform_create(self, serializer):
-        super(AreaViewSet, 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)
-
-    @permission_required('area.add_area')
-    def perform_update(self, serializer):
-        super(AreaViewSet, self).perform_update(serializer)
-        instance = serializer.instance
-        validated_data = serializer.validated_data
-        tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改区域[%s],id=%d' % (instance.name, instance.id),
-                   validated_data)
-
-    @permission_required('area.delete_area')
-    def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            instance.delete = True
-            instance.save()
-            tenant_log(self.request.user.employee, BizLog.DELETE, u'删除区域[%s],id=%d' % (instance.name, instance.id))
-        return response_ok()
-
-
-class AreaDepartmentViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
-    queryset = Department.objects.filter(delete=False,area__delete=False)
-    serializer_class = AreaDepartmentSerializer
-
-    @permission_required('area.browse_area')
-    def filter_queryset(self, queryset):
-        queryset = queryset.filter(area__tenant=self.request.user.employee.tenant)
-        f = AreaDepartmentFilter(self.request.GET, queryset=queryset)
-        return f.qs
-
-    @permission_required('area.add_area')
-    def perform_create(self, serializer):
-        super(AreaDepartmentViewSet, 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)
-
-    @permission_required('area.add_area')
-    def perform_update(self, serializer):
-        super(AreaDepartmentViewSet, self).perform_update(serializer)
-        instance = serializer.instance
-        validated_data = serializer.validated_data
-        tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改区域部门[%s],id=%d' % (instance.name, instance.id),
-                   validated_data)
-
-    @permission_required('area.delete_area')
-    def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            instance.delete = True
-            instance.save()
-            tenant_log(self.request.user.employee, BizLog.DELETE, u'删除区域[%s]部门[%s],id=%d' % (instance.area.name,instance.name, instance.id))
-        return response_ok()

+ 0 - 0
apps/tenant/building/__init__.py


+ 0 - 11
apps/tenant/building/filters.py

@@ -1,11 +0,0 @@
-# coding=utf-8
-
-import django_filters
-from .models import Building
-
-class BuildingFilter(django_filters.FilterSet):
-    building = django_filters.CharFilter(field_name='building', lookup_expr='icontains')
-
-    class Meta:
-        model = Building
-        fields = '__all__'

+ 0 - 0
apps/tenant/building/migrations/__init__.py


+ 0 - 27
apps/tenant/building/models.py

@@ -1,27 +0,0 @@
-from django.db import models
-from utils.exceptions import CustomError
-from apps.tenant.area.models import Area
-from django.conf import settings
-
-class Building(models.Model):
-    building = models.CharField(verbose_name=u'楼宇', max_length=100)
-    floor = models.CharField(verbose_name=u'楼层',max_length=100)
-    location = models.CharField(verbose_name='地点', max_length=100)
-    area = models.ForeignKey(Area, verbose_name=u'区域信息', on_delete=models.PROTECT, editable=False)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", on_delete=models.PROTECT,
-                                    editable=False)
-    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
-
-    class Meta:
-        db_table = 'building'
-        ordering = ['-id']
-        verbose_name = u'建筑信息'
-        default_permissions = ()
-        permissions = [
-            ('browse_building', u'查看'),
-            ('add_building', u'添加'),
-            ('delete_building', u'删除'),
-        ]
-
-    def get_full_name(self):
-        return self.area.name+'-' +self.building + self.floor + self.location

+ 0 - 11
apps/tenant/building/resources.py

@@ -1,11 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from apps.base import ExcelImporter
-
-class BuildingImporter(ExcelImporter):
-    fields = {
-        u'区域': (True, ExcelImporter.formatUnicode),
-        u'楼宇': (True, ExcelImporter.formatUnicode),
-        u'楼层': (True, ExcelImporter.formatUnicode),
-        u'地点': (True, ExcelImporter.formatUnicode),
-    }

+ 0 - 29
apps/tenant/building/serializer.py

@@ -1,29 +0,0 @@
-from rest_framework import serializers
-from .models import Building
-
-
-class BuildingDetailSerializer(serializers.ModelSerializer):
-    area_name = serializers.CharField(source='area.name', read_only=True)
-
-    class Meta:
-        model = Building
-        fields = ('id', 'area_name', 'building', 'floor', 'location')
-
-
-class BuildingSerializer(serializers.ModelSerializer):
-    area_name = serializers.CharField(source='area.name', read_only=True)
-
-    class Meta:
-        model = Building
-        fields = '__all__'
-
-    def create(self, validated_data):
-        validated_data['area_id'] = self.context['request'].data['area']
-        validated_data['create_user'] = self.context['request'].user
-        instance = super(BuildingSerializer, self).create(validated_data)
-        return instance
-
-    def update(self, instance, validated_data):
-        validated_data['area_id'] = self.context['request'].data['area']
-        instance = super(BuildingSerializer, self).update(instance, validated_data)
-        return instance

+ 0 - 12
apps/tenant/building/urls.py

@@ -1,12 +0,0 @@
-from rest_framework.routers import SimpleRouter
-from django.conf.urls import url
-from .views import BuildingViewSet, BuildingImportView,LocationSearch
-
-urlpatterns = [
-    url(r'import/$', BuildingImportView.as_view()),
-    url(r'location/search/$', LocationSearch.as_view()),
-]
-
-router = SimpleRouter()
-router.register(r'', BuildingViewSet)
-urlpatterns += router.urls

+ 0 - 109
apps/tenant/building/views.py

@@ -1,109 +0,0 @@
-# coding=utf-8
-
-from utils.custom_modelviewset import CustomModelViewSet
-from rest_framework.views import APIView
-from django.db.models import Q
-import traceback
-from .models import Building
-from utils.permission import IsTenantUser, permission_required
-from .serializer import BuildingSerializer
-from apps.log.models import BizLog
-from apps.tenant import tenant_log
-from .filters import BuildingFilter
-from django.db import transaction
-from utils.exceptions import CustomError
-from utils import response_ok, response_error
-from .resources import BuildingImporter
-from apps.tenant.area.models import Area
-
-class LocationSearch(APIView):
-    permission_classes = [IsTenantUser, ]
-
-    def get(self, request):
-        keyword = request.GET.get('keywords')
-        tenant = request.user.employee.tenant
-        rows = Building.objects.filter(area__tenant=tenant)
-        if keyword:
-            rows = rows.filter(
-                Q(building__icontains=keyword) |
-                Q(location__icontains=keyword) |
-                Q(floor__icontains=keyword)
-            )
-        serializer = BuildingSerializer(rows, many=True)
-        return response_ok(serializer.data)
-
-class BuildingViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
-    queryset = Building.objects.filter()
-    serializer_class = BuildingSerializer
-
-    @permission_required('building.browse_building')
-    def filter_queryset(self, queryset):
-        queryset = queryset.filter(area__tenant=self.request.user.employee.tenant)
-        f = BuildingFilter(self.request.GET, queryset=queryset)
-        return f.qs
-
-    @permission_required('building.add_building')
-    def perform_create(self, serializer):
-        super(BuildingViewSet, 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.building, instance.id),
-                   validated_data)
-
-    @permission_required('building.add_building')
-    def perform_update(self, serializer):
-        super(BuildingViewSet, self).perform_update(serializer)
-        instance = serializer.instance
-        validated_data = serializer.validated_data
-        tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改建筑信息[%s],id=%d' % (instance.building, instance.id),
-                   validated_data)
-
-    @permission_required('building.delete_building')
-    def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            if instance.area.tenant != request.user.employee.tenant:
-                raise CustomError(u'禁止跨企业操作!')
-            super(BuildingViewSet,self).destroy(self, request, *args, **kwargs)
-            tenant_log(self.request.user.employee, BizLog.DELETE, u'删除建筑信息[%s],id=%d' % (instance.building, instance.id))
-        return response_ok()
-
-class BuildingImportView(APIView):
-    permission_classes = [IsTenantUser, ]
-
-    def post(self, request):
-        if not request.user.has_perm('building.add_building'):
-            raise CustomError(u"您没有[建筑信息-添加]权限,无法执行该操作,请联系管理员分配权限!")
-        file = request.FILES.get('excel_file')
-        try:
-            line = 2
-            importer = BuildingImporter()
-            excel_rows = importer.getExcelData(file)
-            with transaction.atomic():
-                for excel_row in excel_rows:
-                    try:
-                        row = importer.validRow(excel_row)
-                        area_name = row[u'区域']
-                        area = Area.objects.filter(tenant=request.user.employee.tenant,name=area_name).first()
-                        if not area :
-                            raise CustomError(u'第%d行区域名称不正确:%s' % (line, area_name))
-                        data = {}
-                        data['area'] = area
-                        data['building'] = row[u'楼宇']
-                        data['floor'] = row[u'楼层']
-                        data['location'] = row[u'地点']
-                        data['create_user'] = request.user
-                        Building.objects.create(**data)
-                    except CustomError as e:
-                        raise CustomError(u'第%d行:%s' % (line, e.get_error_msg()))
-                    except Exception as e:
-                        raise CustomError(u'第%d行:%s' % (line, str(e)))
-                    line += 1
-                tenant_log(self.request.user.employee, BizLog.IMPORT, u"导入建筑信息[%s]条" % (line-2))
-        except CustomError as e:
-            return response_error(e.get_error_msg())
-        except Exception as e:
-            traceback.print_exc()
-            return response_error(u'导入失败!')
-        return response_ok()

+ 3 - 3
apps/tenant/device/views.py

@@ -4,7 +4,7 @@ from django.db import transaction
 import traceback
 import traceback
 from .serializers import DeviceSerializer
 from .serializers import DeviceSerializer
 from utils.exceptions import CustomError
 from utils.exceptions import CustomError
-from utils.permission import IsTenantUser
+from utils.permission import IsAdministratorUser
 from .filters import DeviceFilter, DeviceModel
 from .filters import DeviceFilter, DeviceModel
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.custom_modelviewset import CustomModelViewSet
 from apps.log.models import BizLog
 from apps.log.models import BizLog
@@ -14,7 +14,7 @@ from .resources import DeviceImporter
 
 
 # Create your views here.
 # Create your views here.
 class DeviceViewSet(CustomModelViewSet):
 class DeviceViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser]
+    permission_classes = [IsAdministratorUser]
     queryset = DeviceModel.objects.all()
     queryset = DeviceModel.objects.all()
     serializer_class = DeviceSerializer
     serializer_class = DeviceSerializer
 
 
@@ -46,7 +46,7 @@ class DeviceViewSet(CustomModelViewSet):
         super(DeviceViewSet, self).perform_destroy(instance)
         super(DeviceViewSet, self).perform_destroy(instance)
 
 
 class DeviceImportView(APIView):
 class DeviceImportView(APIView):
-    permission_classes = [IsTenantUser, ]
+    permission_classes = [IsAdministratorUser, ]
 
 
     def post(self, request):
     def post(self, request):
         file = request.FILES.get('excel_file')
         file = request.FILES.get('excel_file')

+ 0 - 2
apps/tenant/employee/models.py

@@ -4,8 +4,6 @@ from django.db import models
 from django.conf import settings
 from django.conf import settings
 from apps.account.models import User
 from apps.account.models import User
 from apps.tenant.models import Tenant
 from apps.tenant.models import Tenant
-from apps.tenant.area.models import Department
-from apps.tenant.option.models import Option
 from utils.exceptions import CustomError
 from utils.exceptions import CustomError
 from django.db import transaction
 from django.db import transaction
 
 

+ 2 - 9
apps/tenant/employee/views.py

@@ -3,15 +3,12 @@ from rest_framework.views import APIView
 from django.db import transaction
 from django.db import transaction
 from utils import response_ok, response_error
 from utils import response_ok, response_error
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.custom_modelviewset import CustomModelViewSet
-from utils.permission import IsTenantUser, permission_required
+from utils.permission import IsTenantUser, IsAdministratorUser
 from apps.tenant.employee.models import Employee
 from apps.tenant.employee.models import Employee
 from apps.tenant import tenant_log
 from apps.tenant import tenant_log
 from apps.log.models import BizLog
 from apps.log.models import BizLog
 from apps.tenant.employee.filters import EmployeeFilter
 from apps.tenant.employee.filters import EmployeeFilter
 from .serializers import EmployeeSerializer
 from .serializers import EmployeeSerializer
-from apps.tenant.option.serializers import OptionSerializer,Option
-from apps.tenant.area.models import Area,Department
-from apps.tenant.area.serializers import AreaSerializer,AreaDepartmentSerializer
 from rest_framework.decorators import action
 from rest_framework.decorators import action
 from utils.exceptions import CustomError
 from utils.exceptions import CustomError
 
 
@@ -47,17 +44,15 @@ class VisitorView(CustomModelViewSet):
         return response_ok()
         return response_ok()
 
 
 class EmployeeViewSet(CustomModelViewSet):
 class EmployeeViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser]
+    permission_classes = [IsAdministratorUser]
     queryset = Employee.objects.filter()
     queryset = Employee.objects.filter()
     serializer_class = EmployeeSerializer
     serializer_class = EmployeeSerializer
 
 
-    @permission_required('employee.browse_employee')
     def filter_queryset(self, queryset):
     def filter_queryset(self, queryset):
         queryset = queryset.filter(tenant=self.request.user.employee.tenant, type__lt=Employee.REPAIR)
         queryset = queryset.filter(tenant=self.request.user.employee.tenant, type__lt=Employee.REPAIR)
         f = EmployeeFilter(self.request.GET, queryset=queryset)
         f = EmployeeFilter(self.request.GET, queryset=queryset)
         return f.qs
         return f.qs
 
 
-    @permission_required('employee.add_employee')
     def perform_create(self, serializer):
     def perform_create(self, serializer):
         super(EmployeeViewSet, self).perform_create(serializer)
         super(EmployeeViewSet, self).perform_create(serializer)
         instance = serializer.instance
         instance = serializer.instance
@@ -65,7 +60,6 @@ class EmployeeViewSet(CustomModelViewSet):
         tenant_log(self.request.user.employee, BizLog.INSERT, u'添加人员[%s],id=%d' % (instance.name, instance.id),
         tenant_log(self.request.user.employee, BizLog.INSERT, u'添加人员[%s],id=%d' % (instance.name, instance.id),
                    validated_data)
                    validated_data)
 
 
-    @permission_required('employee.add_employee')
     def perform_update(self, serializer):
     def perform_update(self, serializer):
         super(EmployeeViewSet, self).perform_update(serializer)
         super(EmployeeViewSet, self).perform_update(serializer)
         instance = serializer.instance
         instance = serializer.instance
@@ -73,7 +67,6 @@ class EmployeeViewSet(CustomModelViewSet):
         tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改人员[%s],id=%d' % (instance.name, instance.id),
         tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改人员[%s],id=%d' % (instance.name, instance.id),
                    validated_data)
                    validated_data)
 
 
-    @permission_required('employee.delete_employee')
     def destroy(self, request, *args, **kwargs):
     def destroy(self, request, *args, **kwargs):
         with transaction.atomic():
         with transaction.atomic():
             instance = self.get_object()
             instance = self.get_object()

+ 0 - 0
apps/tenant/equipment/__init__.py


+ 0 - 15
apps/tenant/equipment/filters.py

@@ -1,15 +0,0 @@
-# coding=utf-8
-
-import django_filters
-
-from .models import Equipment
-
-
-class EquipmentFilter(django_filters.FilterSet):
-    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
-    type = django_filters.CharFilter(field_name='type__name', lookup_expr='icontains')
-    supplier = django_filters.CharFilter(field_name='supplier__name', lookup_expr='icontains')
-
-    class Meta:
-        model = Equipment
-        fields = '__all__'

+ 0 - 0
apps/tenant/equipment/migrations/__init__.py


+ 0 - 22
apps/tenant/equipment/models.py

@@ -1,22 +0,0 @@
-
-from django.db import models
-from apps.tenant.option.models import Option
-from apps.tenant.building.models import Building
-
-class Equipment(models.Model):
-    name = models.CharField(verbose_name=u'设备名称', max_length=100)
-    quality_date = models.DateField(verbose_name=u'质保到期', null=True)
-    location = models.ForeignKey(Building, verbose_name=u'设备位置', on_delete=models.PROTECT, null=True)
-    type = models.ForeignKey(Option, verbose_name=u'设备分类', on_delete=models.PROTECT, null=True, related_name='type_option')
-    supplier = models.ForeignKey(Option, verbose_name=u'设备供应商', on_delete=models.PROTECT, null=True, related_name='supplier_option')
-
-    class Meta:
-        db_table = 'equipment'
-        verbose_name = u'设备信息'
-        ordering = ['-id', ]
-        default_permissions = ()
-        permissions = [
-            ('browse_equipment', u'查看'),
-            ('add_equipment', u'添加'),
-            ('delete_equipment', u'删除')
-        ]

+ 0 - 35
apps/tenant/equipment/serializers.py

@@ -1,35 +0,0 @@
-# coding=utf-8
-
-import json
-from rest_framework import serializers
-from .models import Equipment
-
-from utils.exceptions import CustomError
-from apps.account.models import User
-
-
-class EquipmentSerializer(serializers.ModelSerializer):
-    type_text = serializers.CharField(source='type.name', read_only=True)
-    supplier_text = serializers.CharField(source='supplier.name', read_only=True)
-    location_text = serializers.SerializerMethodField()
-
-    def get_location_text(self, obj):
-        return obj.location.get_full_name()
-
-    class Meta:
-        model = Equipment
-        fields = '__all__'
-
-    def create(self, validated_data):
-        validated_data['location_id'] = self.context['request'].data['location']
-        validated_data['type_id'] = self.context['request'].data['type']
-        validated_data['supplier_id'] = self.context['request'].data['supplier']
-        instance = super(EquipmentSerializer, self).create(validated_data)
-        return instance
-
-    def update(self,instance, validated_data):
-        validated_data['location_id'] = self.context['request'].data['location']
-        validated_data['type_id'] = self.context['request'].data['type']
-        validated_data['supplier_id'] = self.context['request'].data['supplier']
-        instance = super(EquipmentSerializer, self).update(instance, validated_data)
-        return instance

+ 0 - 12
apps/tenant/equipment/urls.py

@@ -1,12 +0,0 @@
-# coding=utf-8
-from django.conf.urls import url
-from rest_framework.routers import SimpleRouter
-from .views import EquipmentViewSet,DictView
-
-urlpatterns = [
-    url(r'dict/$', DictView.as_view()),
-]
-
-router = SimpleRouter()
-router.register(r'', EquipmentViewSet)
-urlpatterns += router.urls

+ 0 - 62
apps/tenant/equipment/views.py

@@ -1,62 +0,0 @@
-# coding=utf-8
-from django.db import transaction
-from rest_framework.views import APIView
-from utils import response_ok
-from utils.custom_modelviewset import CustomModelViewSet
-from utils.permission import IsTenantUser, permission_required
-from .models import Equipment
-from .serializers import EquipmentSerializer
-from .filters import EquipmentFilter
-from apps.tenant import tenant_log
-from apps.log.models import BizLog
-from utils.exceptions import CustomError
-from apps.tenant.option.serializers import OptionSerializer,Option
-
-class DictView(APIView):
-    permission_classes = [IsTenantUser, ]
-
-    def get(self, request):
-        tenant=request.user.employee.tenant
-        ret = {
-            'types': OptionSerializer(Option.objects.filter(delete=False,type=Option.EQUIPMENT_TYPE, enable=True, tenant=tenant), many=True).data,
-            'suppliers': OptionSerializer(Option.objects.filter(delete=False,type=Option.EQUIPMENT_SUPPLIER, enable=True, tenant=tenant), many=True).data,
-        }
-        return response_ok(ret)
-
-class EquipmentViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
-    queryset = Equipment.objects.all()
-    serializer_class = EquipmentSerializer
-
-    @permission_required('equipment.browse_equipment')
-    def filter_queryset(self, queryset):
-        queryset = queryset.filter(type__tenant=self.request.user.employee.tenant)
-        f = EquipmentFilter(self.request.GET, queryset=queryset)
-        return f.qs
-
-    @permission_required('equipment.add_equipment')
-    def perform_create(self, serializer):
-        super(EquipmentViewSet, 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)
-
-    @permission_required('equipment.add_equipment')
-    def perform_update(self, serializer):
-        super(EquipmentViewSet, self).perform_update(serializer)
-        instance = serializer.instance
-        validated_data = serializer.validated_data
-        tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改设备[%s],id=%d' % (instance.name, instance.id),
-                   validated_data)
-
-    @permission_required('equipment.delete_equipment')
-    def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            with transaction.atomic():
-                instance = self.get_object()
-                if instance.type.tenant != request.user.employee.tenant:
-                    raise CustomError(u'禁止跨企业操作!')
-                super(EquipmentViewSet, self).destroy(self, request, *args, **kwargs)
-            tenant_log(self.request.user.employee, BizLog.DELETE, u'删除设备[%s],id=%d' % (instance.name, instance.id))
-        return response_ok()

+ 2 - 2
apps/tenant/notices/views.py

@@ -4,7 +4,7 @@ from django.db import transaction
 from utils import response_ok
 from utils import response_ok
 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 IsTenantUser
+from utils.permission import IsAdministratorUser
 from apps.tenant import tenant_log
 from apps.tenant import tenant_log
 from apps.log.models import BizLog
 from apps.log.models import BizLog
 from .serializers import NoticesSerializer
 from .serializers import NoticesSerializer
@@ -13,7 +13,7 @@ from .filters import NoticesFilter
 
 
 
 
 class NoticesViewSet(CustomModelViewSet):
 class NoticesViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
+    permission_classes = [IsAdministratorUser, ]
     serializer_class = NoticesSerializer
     serializer_class = NoticesSerializer
     queryset = Notices.objects.filter()
     queryset = Notices.objects.filter()
 
 

+ 0 - 0
apps/tenant/permissions/__init__.py


+ 0 - 62
apps/tenant/permissions/consts.py

@@ -1,62 +0,0 @@
-# coding=utf-8
-
-CONTENT_TYPE_SORTING = (
-    # 系统设置
-    'area-area',  # 区域设置
-    'building-building',  # 建筑信息
-    'equipment-equipment',  # 设备信息
-    'employee-employee',  # 员工管理
-    'option-option',  # 系统选项
-    'config-config',  # 基础设置
-    'account-user',  # 权限管理
-    'repair_order-repairorder',  # 报修管理
-    'inspection_order-inspectionorder',  # 巡检管理
-)
-
-MENU_TO_MODEL = (
-    (
-        u'系统设置', (
-            'area-area',
-            'building-building',
-            'equipment-equipment',
-            'employee-employee',
-            'option-option',
-            'config-config',
-            'account-user',
-        )
-    ),
-    (
-        u'报修管理', (
-            'repair_order-repairorder',
-        )
-    ),
-    (
-        u'巡检管理', (
-            'inspection_order-inspectionorder',
-        )
-    ),
-)
-
-class PermissionMenu(object):
-
-    def __init__(self):
-        self.sort = CONTENT_TYPE_SORTING
-        self.menus = MENU_TO_MODEL
-
-    def get_index(self, app_label, model):
-        try:
-            return self.sort.index('{}-{}'.format(app_label, model))
-        except:
-            return 9999
-
-    def sort_perms(self, perms):
-        perms = perms.order_by('content_type__model', 'id')
-        perms = sorted(perms, key=lambda n: self.get_index(n.content_type.app_label, n.content_type.model))
-        return perms
-
-    def get_menuname_of_contenttype(self, app_label, model):
-        for menu in self.menus:
-            val = '{}-{}'.format(app_label, model)
-            if val in menu[1]:
-                return menu[0]
-        return u'未分类'

+ 0 - 70
apps/tenant/permissions/serializers.py

@@ -1,70 +0,0 @@
-# coding=utf-8
-
-import json
-from django.contrib.auth.models import Group, Permission
-from rest_framework import serializers
-
-from utils.exceptions import CustomError
-
-
-class PermissionSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = Permission
-        fields = ('id', 'name', )
-
-
-class GroupSerializer(serializers.ModelSerializer):
-    employees = serializers.SerializerMethodField()
-    permissions = PermissionSerializer(many=True, read_only=True)
-
-    def get_employees(self, obj):
-        users = obj.user_set.all()
-        data = []
-        for user in users:
-            data.append(user.employee.name)
-        return data
-
-    class Meta:
-        model = Group
-        fields = ('id', 'display_name', 'employees', 'permissions', 'name')
-
-    def create(self, validated_data):
-        user = self.context['request'].user
-        validated_data['tenant'] = user.employee.tenant
-        validated_data['create_user'] = user
-        validated_data['name'] = validated_data['name'] + '@' + str(validated_data['tenant'].id)
-        group = Group.objects.filter(name=validated_data['name']).first()
-        if group:
-            raise CustomError(u'名称为[%s]的权限组已存在' % validated_data['display_name'])
-
-        permissions = self.context['request'].data.get('permissions', None)
-        if permissions:
-            permissions = json.loads(permissions)
-        else:
-            permissions = []
-        instance = super(GroupSerializer, self).create(validated_data)
-        instance.permissions.set(permissions)
-        return instance
-
-    def update(self, instance, validated_data):
-        validated_data['name'] = validated_data['name'] + '@' + str(instance.tenant_id)
-        group = Group.objects.filter(name=validated_data['name']).exclude(id=instance.id).first()
-        if group:
-            raise CustomError(u'名称为[%s]的权限组已存在' % validated_data['display_name'])
-        permissions = self.context['request'].data.get('permissions', None)
-        if permissions:
-            permissions = json.loads(permissions)
-        else:
-            permissions = []
-        instance = super(GroupSerializer, self).update(instance, validated_data)
-        instance.permissions.set(permissions)
-        return instance
-
-
-class GroupDictSerializer(serializers.ModelSerializer):
-    value = serializers.CharField(source='id', read_only=True)
-    name = serializers.CharField(source='display_name', read_only=True)
-
-    class Meta:
-        model = Group
-        fields = ('value', 'name', )

+ 0 - 15
apps/tenant/permissions/urls.py

@@ -1,15 +0,0 @@
-# coding=utf-8
-
-from django.conf.urls import url, include
-from rest_framework.routers import SimpleRouter
-
-from .views import *
-
-urlpatterns = [
-    url(r'^all/$', PermissionsListView.as_view()),
-    url(r'^dict/$', PermissionDictView.as_view()),
-]
-
-router = SimpleRouter()
-router.register(r'', GroupsViewSet)
-urlpatterns += router.urls

+ 0 - 89
apps/tenant/permissions/views.py

@@ -1,89 +0,0 @@
-# coding=utf-8
-
-from django.db import transaction, IntegrityError
-from django.db.models import F,ProtectedError
-from rest_framework.views import APIView
-from collections import OrderedDict
-from utils import response_ok
-from utils.permission import IsTenantUser, permission_required
-from utils.custom_modelviewset import CustomModelViewSet
-from utils.exceptions import CustomError
-from apps.log.models import BizLog
-from apps.tenant import tenant_log
-from django.contrib.auth.models import Group, Permission
-from apps.account.filters import GroupFilter
-from .serializers import GroupSerializer, GroupDictSerializer
-from .consts import PermissionMenu
-
-
-class GroupsViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
-    queryset = Group.objects.filter()
-    serializer_class = GroupSerializer
-
-    @permission_required('account.browse_group')
-    def filter_queryset(self, queryset):
-        queryset = queryset.filter(tenant=self.request.user.employee.tenant)
-        f = GroupFilter(self.request.GET, queryset=queryset)
-        return f.qs
-
-    @permission_required('account.add_group')
-    def perform_create(self, serializer):
-        super(GroupsViewSet, 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)
-
-    @permission_required('account.add_group')
-    def perform_update(self, serializer):
-        super(GroupsViewSet, self).perform_update(serializer)
-        instance = serializer.instance
-        validated_data = serializer.validated_data
-        tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
-
-    @permission_required('account.delete_group')
-    def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            if instance.tenant != request.user.employee.tenant:
-                raise CustomError(u'禁止跨企业操作!')
-
-            # user_count = instance.user_set.all().count()
-            # if user_count:
-            #     raise CustomError(u'该权限组已分配给用户,禁止删除!')
-
-            tenant_log(self.request.user.employee, BizLog.DELETE, u'删除权限组[%s],id=%d' % (instance.name, instance.id))
-            instance.delete()
-        return response_ok()
-
-
-class PermissionsListView(APIView):
-    permission_classes = [IsTenantUser, ]
-
-    def get(self, request):
-        rows = Permission.objects.all().exclude(name__startswith='Can')
-        perms_menus = PermissionMenu()
-        rows = perms_menus.sort_perms(rows)
-        menus = OrderedDict()
-        for row in rows:
-            item = {'id': row.id, 'name': row.name}
-            mn = perms_menus.get_menuname_of_contenttype(row.content_type.app_label, row.content_type.model)
-            if mn in menus:
-                permissions = menus[mn]
-            else:
-                permissions = menus[mn] = OrderedDict()
-
-            if row.content_type.name in permissions:
-                if not item in permissions[row.content_type.name]:
-                    permissions[row.content_type.name].append(item)
-            else:
-                permissions[row.content_type.name] = [item, ]
-        return response_ok(menus)
-
-
-class PermissionDictView(APIView):
-    permission_classes = [IsTenantUser, ]
-    def get(self, request):
-        rows = Group.objects.filter(tenant=request.user.employee.tenant)
-        serializer = GroupDictSerializer(rows, many=True)
-        return response_ok(serializer.data)

+ 45 - 26
apps/tenant/poster/views.py

@@ -1,14 +1,13 @@
 # coding=utf-8
 # coding=utf-8
 
 
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.custom_modelviewset import CustomModelViewSet
-from rest_framework.views import APIView
-from django.db.models import Q
+from rest_framework.decorators import action
+import json
 import traceback
 import traceback
 from .models import Poster
 from .models import Poster
-from utils.permission import IsTenantUser, permission_required
+from utils.permission import IsAdministratorUser
 from .serializer import PosterSerializer
 from .serializer import PosterSerializer
 from apps.log.models import BizLog
 from apps.log.models import BizLog
-from apps.tenant import tenant_log
 from .filters import PosterFilter
 from .filters import PosterFilter
 from django.db import transaction
 from django.db import transaction
 from utils.exceptions import CustomError
 from utils.exceptions import CustomError
@@ -16,35 +15,55 @@ from utils import response_ok, response_error
 
 
 
 
 class PosterViewSet(CustomModelViewSet):
 class PosterViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
+    permission_classes = [IsAdministratorUser, ]
     queryset = Poster.objects.filter()
     queryset = Poster.objects.filter()
     serializer_class = PosterSerializer
     serializer_class = PosterSerializer
 
 
     def filter_queryset(self, queryset):
     def filter_queryset(self, queryset):
-        queryset = queryset.filter(area__tenant=self.request.user.employee.tenant)
+        queryset = queryset.filter(tenant=self.request.user.employee.tenant)
         f = PosterFilter(self.request.GET, queryset=queryset)
         f = PosterFilter(self.request.GET, queryset=queryset)
         return f.qs
         return f.qs
 
 
-    def perform_create(self, serializer):
-        super(PosterViewSet, 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.building, instance.id),
-                   validated_data)
+    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)
+                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_update(self, serializer):
-        super(PosterViewSet, self).perform_update(serializer)
-        instance = serializer.instance
-        validated_data = serializer.validated_data
-        tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改建筑信息[%s],id=%d' % (instance.building, instance.id),
-                   validated_data)
-
-    def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            if instance.area.tenant != request.user.employee.tenant:
-                raise CustomError(u'禁止跨企业操作!')
-            super(PosterViewSet,self).destroy(self, request, *args, **kwargs)
-            tenant_log(self.request.user.employee, BizLog.DELETE, u'删除建筑信息[%s],id=%d' % (instance.building, instance.id))
+    @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)
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            return response_error(str(e))
         return response_ok()
         return response_ok()
 
 

+ 1 - 4
apps/tenant/urls.py

@@ -10,18 +10,15 @@ urlpatterns = [
     url(r'^token_refresh/$', TenantRefreshTokenView.as_view()),
     url(r'^token_refresh/$', TenantRefreshTokenView.as_view()),
     url(r'^token_verify/$', TenantVerifyTokenView.as_view()),
     url(r'^token_verify/$', TenantVerifyTokenView.as_view()),
 
 
-    url(r'^area/', include('apps.tenant.area.urls')),
-    url(r'^permission/', include('apps.tenant.permissions.urls')),
     url(r'^employee/', include('apps.tenant.employee.urls')),
     url(r'^employee/', include('apps.tenant.employee.urls')),
     url(r'^option/', include('apps.tenant.option.urls')),
     url(r'^option/', include('apps.tenant.option.urls')),
     # url(r'^config/', include('apps.tenant.config.urls')),
     # url(r'^config/', include('apps.tenant.config.urls')),
-    url(r'^building/', include('apps.tenant.building.urls')),
     url(r'^repair_order/', include('apps.tenant.repair_order.urls')),
     url(r'^repair_order/', include('apps.tenant.repair_order.urls')),
     url(r'^inspection_order/', include('apps.tenant.inspection_order.urls')),
     url(r'^inspection_order/', include('apps.tenant.inspection_order.urls')),
     url(r'^wxapp/', include('apps.wxapp.urls')),
     url(r'^wxapp/', include('apps.wxapp.urls')),
-    url(r'^equipment/', include('apps.tenant.equipment.urls')),
     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')),
 ]
 ]
 
 
 
 

+ 8 - 6
apps/wxapp/repair_order/views.py

@@ -117,7 +117,7 @@ class RepairOrderViewSet(CustomModelViewSet):
         # 审核
         # 审核
         try:
         try:
             if not self.request.user.is_admin():
             if not self.request.user.is_admin():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非管理人员,禁止操作!")
             with transaction.atomic():
             with transaction.atomic():
                 user = self.request.user
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -133,7 +133,7 @@ class RepairOrderViewSet(CustomModelViewSet):
         # 挂起
         # 挂起
         try:
         try:
             if not self.request.user.is_employee():
             if not self.request.user.is_employee():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非维修师傅,禁止操作!")
             reason = request.data.get('reason')
             reason = request.data.get('reason')
             if not reason:
             if not reason:
                 raise CustomError('请填写挂起原因')
                 raise CustomError('请填写挂起原因')
@@ -152,7 +152,7 @@ class RepairOrderViewSet(CustomModelViewSet):
         # 取消挂起,继续施工
         # 取消挂起,继续施工
         try:
         try:
             if not self.request.user.is_employee():
             if not self.request.user.is_employee():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非维修师傅,禁止操作!")
             with transaction.atomic():
             with transaction.atomic():
                 user = self.request.user
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -167,6 +167,8 @@ class RepairOrderViewSet(CustomModelViewSet):
     def rob_repair(self, request, pk):
     def rob_repair(self, request, pk):
         # 抢单
         # 抢单
         try:
         try:
+            if not self.request.user.is_employee():
+                raise CustomError(u"非维修师傅,禁止操作!")
             with transaction.atomic():
             with transaction.atomic():
                 user = self.request.user
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -190,7 +192,7 @@ class RepairOrderViewSet(CustomModelViewSet):
     def finish(self, request, pk):
     def finish(self, request, pk):
         # 完工
         # 完工
         if not self.request.user.is_employee():
         if not self.request.user.is_employee():
-            raise CustomError(u"权限不足,禁止操作!")
+            raise CustomError(u"非维修师傅,禁止操作!")
         try:
         try:
             content = request.data.get('content')
             content = request.data.get('content')
             images = request.data.get('images', None)
             images = request.data.get('images', None)
@@ -236,7 +238,7 @@ class RepairOrderViewSet(CustomModelViewSet):
         # 作废
         # 作废
         try:
         try:
             if not self.request.user.is_admin():
             if not self.request.user.is_admin():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非管理人员,禁止操作!")
             with transaction.atomic():
             with transaction.atomic():
                 user = self.request.user
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -287,7 +289,7 @@ class RepairOrderViewSet(CustomModelViewSet):
     def destroy(self, request, *args, **kwargs):
     def destroy(self, request, *args, **kwargs):
         try:
         try:
             if not self.request.user.is_admin():
             if not self.request.user.is_admin():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非管理人员,禁止操作!")
             with transaction.atomic():
             with transaction.atomic():
                 instance = self.get_object()
                 instance = self.get_object()
                 instance.delete = True
                 instance.delete = True

+ 5 - 4
apps/wxapp/views.py

@@ -15,7 +15,7 @@ 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
 from apps.tenant.notices.filters import NoticesFilter
 from apps.tenant.notices.filters import NoticesFilter
-from utils.permission import isLogin
+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
@@ -117,7 +117,7 @@ class HomeStatisticsView(APIView):
 
 
 class StatisticsRepairView(APIView):
 class StatisticsRepairView(APIView):
     '''小程序统计数据'''
     '''小程序统计数据'''
-    permission_classes = [isLogin, ]
+    permission_classes = [IsTenantUser, ]
     def get(self, request):
     def get(self, request):
         days = int(request.GET.get('days')) # 7 30 365
         days = int(request.GET.get('days')) # 7 30 365
         data = []# 报修数据
         data = []# 报修数据
@@ -175,7 +175,7 @@ class StatisticsRepairView(APIView):
 
 
 class StatisticsEvaluateView(APIView):
 class StatisticsEvaluateView(APIView):
     '''小程序评价统计数据'''
     '''小程序评价统计数据'''
-    permission_classes = [isLogin, ]
+    permission_classes = [IsTenantUser, ]
     def get(self, request):
     def get(self, request):
         days = int(request.GET.get('days')) # 7 30 365
         days = int(request.GET.get('days')) # 7 30 365
         data = []# 评价数据
         data = []# 评价数据
@@ -205,9 +205,10 @@ class PosterView(generics.ListAPIView):
         is_auth = False
         is_auth = False
         if self.request.user and self.request.user.is_authenticated:
         if self.request.user and self.request.user.is_authenticated:
             is_auth = True
             is_auth = True
-        queryset = queryset.filter(tenant__isnull=True)
         if is_auth:
         if is_auth:
             queryset = queryset.filter(Q(tenant__isnull=True) | Q(tenant=self.request.user.employee.tenant))
             queryset = queryset.filter(Q(tenant__isnull=True) | Q(tenant=self.request.user.employee.tenant))
+        else:
+            queryset = queryset.filter(tenant__isnull=True)
         return queryset
         return queryset
 
 
     def list(self, request, *args, **kwargs):
     def list(self, request, *args, **kwargs):

+ 0 - 3
ly_baoxiu_admin/settings.py

@@ -50,10 +50,7 @@ INSTALLED_APPS = [
     'apps.tenant',
     'apps.tenant',
     'apps.upload',
     'apps.upload',
     'apps.tenant.option',
     'apps.tenant.option',
-    'apps.tenant.area',
     'apps.tenant.config',
     'apps.tenant.config',
-    'apps.tenant.building',
-    'apps.tenant.equipment',
     'apps.tenant.device',
     'apps.tenant.device',
     'apps.tenant.repair_order',
     'apps.tenant.repair_order',
     'apps.tenant.inspection_order',
     'apps.tenant.inspection_order',

+ 85 - 0
uis/tenant/banner/detail.html

@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>查看详情</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .tenant-li {
+            margin: 10px
+        }
+
+        img {
+            width: 40%;
+            height: 30%;
+            margin-bottom: 20px;
+        }
+        /*企业营业执照样式*/
+        .imgStyle{
+            width: 200px;
+            height: auto;
+        }
+    </style>
+</head>
+<body>
+<div class="layui-card" style="min-height: 400px; padding: 10px" id="tenant_detail"></div>
+<script id="tenant_detail_demo" type="text/html">
+    <div class="layui-tab-item layui-show">
+        <ui>
+            <li class="tenant-li layui-col-md6">
+                <h3>标题:{{ d.title }}</h3>
+            </li>
+            <li class="tenant-li layui-col-md6">
+                <h3>内容:</h3>
+                <div id="content_demo"></div>
+            </li>
+            <li class="tenant-li">
+                <h3>添加人:{{ d.create_user_name }}</h3>
+            </li>
+            <li class="tenant-li">
+                <h3>添加时间:{{ d.create_time }}</h3>
+            </li>
+            <li class="tenant-li">
+                <h3>是否在用:{{ d.enable_text }}</h3>
+            </li>
+            {{# if(d.image){ }}
+            <li class="tenant-li">
+                <h3 style="margin-bottom: 10px">轮播图:</h3>
+                <img src="{{d.image}}" class="imgStyle" />
+            </li>
+            {{# } }}
+        </ui>
+    </div>
+</script>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index',  'laytpl'], function () {
+        var $ = layui.$
+            , laytpl = layui.laytpl;
+        var data = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+
+        var getTpl = tenant_detail_demo.innerHTML
+            , tenant_detail = document.getElementById('tenant_detail');
+        laytpl(getTpl).render(data, function (html) {
+            tenant_detail.innerHTML = html;
+        });
+        var dom = document.getElementById("content_demo");
+        if(data.content && dom){
+           dom.innerHTML = data.content;
+        }
+    });
+</script>
+</body>
+</html>

+ 230 - 0
uis/tenant/banner/edit.html

@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>添加轮播图</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md6">
+            <div class="layui-card">
+
+                <div class="layui-card-body">
+                    <form class="layui-form" action="" lay-filter="component-form-element">
+                        <!-- 企业名称 -->
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>标题:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="title" lay-verify="required" placeholder="请输入标题"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>内容:</label>
+                            <div class="layui-input-block">
+                                <textarea class="layui-textarea" placeholder="请输内容" id="content_demo"></textarea>
+                            </div>
+                        </div>
+                        <div class="layui-col-lg6">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>位置:</label>
+                            <div class="layui-input-block">
+                                <select name="location" lay-verify="required" style="width: 40px;">
+                                    <option value=""></option>
+                                    <option value='1' selected>轮播</option>
+                                    <!--option value='2'>弹窗</option-->
+                                </select>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>是否在用:</label>
+                            <div class="layui-input-block">
+                                <input type="checkbox" name="enable" lay-skin="switch" lay-text="是|否" checked=""
+                                       value="1">
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>轮播图:</label>
+                            <div class="layui-input-block">
+                                <button type="button" class="layui-btn-sm" id="banner_img">上传图片</button>
+                                <br><br>
+                                <img class="layui-upload-img" id="banner_img_demo" style="max-height: 100px;">
+                            </div>
+                        </div>
+
+                        <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                                style="display: none">保存
+                        </button>
+                        <button class="layui-btn" type="button" id="upload_image" style="display: none"></button>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index', 'form', 'utils', 'upload', 'layedit'], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            ,upload = layui.upload
+            ,layedit = layui.layedit
+            , form = layui.form;
+
+        var id = layui.view.getParameterByName('id');
+
+        var editIndex = layedit.build('content_demo', {
+            height: 180,
+            tool: [
+              'strong' //加粗
+              ,'italic' //斜体
+              ,'underline' //下划线
+              ,'del' //删除线
+              ,'|' //分割线
+              ,'left' //左对齐
+              ,'center' //居中对齐
+              ,'right' //右对齐
+              ,'link' //超链接
+              ,'unlink' //清除链接
+              ,'face' //表情
+              ,'help' //帮助
+            ]
+        });
+
+        form.render(null, 'component-form-element');
+
+        if (id) {
+            var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+            form.val("component-form-element", editdata);
+            if(editdata.content){
+              layedit.setContent(editIndex, editdata.content, false);
+            }
+            $('#banner_img_demo').attr('src', editdata.image);
+        }
+        var form_data = {},
+            url = id ? '/tenant/poster/' + id + '/update_poster/' : '/tenant/poster/',
+            method = id ? 'post' : 'put',
+            banner_img = '';
+
+        upload.render({
+            elem: "#banner_img",
+            url: url,
+            auto: false,
+            field: 'banner_img',
+            bindAction: "#upload_image",
+            choose: function (obj) {
+                obj.preview(
+                    function (index, file, result) {
+                        $("#banner_img_demo").attr("src", result)
+                    }
+                )
+            },
+            data: {
+                data: function () {
+                    return JSON.stringify(form_data)
+                }
+            },
+            done: function (res) {
+                if (res.code != 0) {
+                    layer.msg(res.msg);
+                } else {
+                    layer.open({
+                        type: 1
+                        , content: '<div style="padding: 20px 100px;">保存成功</div>'
+                        , btn: '关闭'
+                        , btnAlign: 'c' //按钮居中
+                        , shade: 0 //不显示遮罩
+                        , yes: function () {
+                            parent.layer.closeAll('iframe');
+                            parent.layui.table.reload('datagrid', {});
+                        }
+                    });
+                }
+            },
+            error: function () {
+                layer.msg('保存失败');
+            }
+        });
+
+        form.on('submit(component-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+
+            if (!data.field.banner_img) {
+                data.field.banner_img = banner_img
+            } else {
+                banner_img = data.field.banner_img
+            }
+            //富文本中的内容
+            data.field.content = layedit.getContent(editIndex);
+            if(!data.field.enable){
+                data.field.enable = 0
+            }
+            if (!id) {
+                if (!data.field.banner_img) {
+                    layer.msg('请选择轮播图图片');
+                    return false;
+                }
+                form_data = data.field
+                delete form_data.banner_img
+                delete form_data.file
+                setTimeout($('#upload_image').click(), 30000)
+            } else {
+                if (data.field.banner_img) { // 修改了图片
+                    form_data = data.field
+                    delete form_data.banner_img
+                    delete form_data.file
+                    setTimeout($('#upload_image').click(), 30000)
+                } else {
+                    // 没有修改了图片
+                    form_data = data.field
+                    delete form_data.banner_img
+                    delete form_data.file
+                    admin.req({
+                        url: url
+                        , data: {data:JSON.stringify(form_data)}
+                        , type: method
+                        , done: function (res) {
+                            if (res.code != 0) {
+                                layer.msg(res.msg);
+                            } else {
+                                layer.open({
+                                    type: 1
+                                    , content: '<div style="padding: 20px 100px;">保存成功</div>'
+                                    , btn: '关闭'
+                                    , btnAlign: 'c' //按钮居中
+                                    , shade: 0 //不显示遮罩
+                                    , yes: function () {
+                                        parent.layer.closeAll('iframe');
+                                        parent.layui.table.reload('datagrid', {});
+                                    }
+                                });
+                            }
+                        }
+                    });
+                }
+            }
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 185 - 0
uis/tenant/banner/index.html

@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>轮播管理</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .LAY-btns .layui-nav {
+            padding-left: 0;
+            padding-right: 10px;
+            top: -4px;
+            margin: 0 10px;
+            border: 0;
+            background-color: #009688;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-item {
+            line-height: 30px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child {
+            top: 34px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-bar {
+            display: none;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a {
+            color: #333;
+            background-color: #fff;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {
+            background-color: #f2f2f2;
+            color: #000;
+        }
+
+        .seach_items {
+            display: inline-block;
+            margin-right: 5px;
+            margin-top: 5px;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+                    <div class="LAY-btns" style="margin-bottom: 10px;">
+                        <div style="float:left; margin-right: 5px; margin-top: 5px;">
+                            <button class="layui-btn" id="btn_add"><i class="layui-icon layui-icon-add-circle"></i>添加
+                            </button>
+
+                        </div>
+                        <div style="float:right;">
+                            <form class="layui-form" lay-filter="query-form-element">
+                                <div class="seach_items">
+                                    <input type="text" name="title" autocomplete="off" class="layui-input"
+                                           placeholder="标题"/>
+                                </div>
+                                <div class="seach_items">
+                                    <input type="text" name="create_user" autocomplete="off" class="layui-input"
+                                           placeholder="添加人"/>
+                                </div>
+                            </form>
+                        </div>
+                        <div style="clear: both;"></div>
+
+                    </div>
+                    <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
+
+                    <script type="text/html" id="datagrid-operate-bar">
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="detail">查看</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
+                        </div>
+                    </script>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js?t=1"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table', 'form', 'upload'], function () {
+        var $ = layui.$
+            , table = layui.table
+            , admin = layui.admin
+            , form = layui.form;
+
+        table.render({
+            elem: '#datagrid'
+            , url: '/tenant/poster/'
+            , cols: [[
+                {field: 'title', title: '标题', width: 100}
+                ,{field: 'content', title: '内容', width: 280}
+                ,{field: 'location_text', title: '位置', width: 100}
+                ,{field: 'create_user_name', title: '添加人', width: 100}
+                ,{field: 'create_time', title: '添加时间', width: 200}
+                ,{field: 'enable_text', title: '是否在用', width: 100}
+                , {title: "操作", width: 150, align: 'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
+        var _params;
+        form.on('submit(query-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            _params = data.field;
+            table.reload('datagrid', {
+                where: data.field
+                , page: {curr: 1}
+            });
+            layer.closeAll();
+            return false;
+        });
+        //监听工具条
+        table.on('tool(datagrid-operate)', function (obj) {
+            var data = obj.data;
+            if (obj.event === 'detail') {
+                table.editdata = data;
+                layer.open({
+                    type: 2,
+                    title: "详情",
+                    shadeClose: false,
+                    area: ['700px', '500px'],
+                    content: 'detail.html'
+                })
+            }else if (obj.event === 'edit') {
+                table.editdata = data;
+                layer.open({
+                    type: 2,
+                    title: '修改',
+                    shadeClose: false,
+                    area: ['700px', '700px'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'edit.html?id=' + data.id
+                });
+            }
+        });
+
+        $('#btn_add').on('click', function () {
+            layer.open({
+                type: 2,
+                title: '添加',
+                shadeClose: false,
+                btn: ['保存', '取消'],
+                area: ['700px', '700px'],
+                yes: function (index, dom) {
+                    layui.submitChild();
+                },
+                btn2: function (index, layero) {
+                    layer.close(index);//关闭当前按钮
+                },
+                content: 'edit.html'
+            });
+        });
+
+    });
+</script>
+</body>
+</html>
+

+ 8 - 5
uis/tenant/index.html

@@ -69,20 +69,23 @@
                         </a>
                         </a>
                         <dl class="layui-nav-child">
                         <dl class="layui-nav-child">
 
 
-                            <dd data-name="nav" data-user_type="1,2">
+                            <dd data-name="nav" data-user_type="1">
                                 <a lay-href="company/index.html">企业信息</a>
                                 <a lay-href="company/index.html">企业信息</a>
                             </dd>
                             </dd>
 
 
-                            <dd data-name="nav" data-user_type="1,2">
+                            <dd data-name="nav" data-user_type="1">
                                 <a lay-href="device/index.html">设备管理</a>
                                 <a lay-href="device/index.html">设备管理</a>
                             </dd>
                             </dd>
 
 
-                            <dd data-name="nav" data-user_type="1,2">
+                            <dd data-name="nav" data-user_type="1">
                                 <a lay-href="employee/index.html">员工管理</a>
                                 <a lay-href="employee/index.html">员工管理</a>
                             </dd>
                             </dd>
-                            <dd data-name="nav" data-user_type="1,2">
+                            <dd data-name="nav" data-user_type="1">
                                 <a lay-href="option/index.html">系统选项</a>
                                 <a lay-href="option/index.html">系统选项</a>
                             </dd>
                             </dd>
+                            <dd data-name="nav" data-user_type="1">
+                                <a lay-href="banner/index.html">首页轮播</a>
+                            </dd>
                         </dl>
                         </dl>
                     </li>
                     </li>
                     <li data-name="set" class="layui-nav-item">
                     <li data-name="set" class="layui-nav-item">
@@ -113,7 +116,7 @@
                             <cite>通知管理</cite>
                             <cite>通知管理</cite>
                         </a>
                         </a>
                         <dl class="layui-nav-child">
                         <dl class="layui-nav-child">
-                            <dd data-name="nav" data-user_type="1,2">
+                            <dd data-name="nav" data-user_type="1">
                                 <a lay-href="notices/index.html">通知管理</a>
                                 <a lay-href="notices/index.html">通知管理</a>
                             </dd>
                             </dd>
                         </dl>
                         </dl>

+ 0 - 140
uis/tenant/statistics/commission_index.html

@@ -1,140 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>人员管理</title>
-  <meta name="renderer" content="webkit">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
-  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
-  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
-  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
-    <style type="text/css">
-    .LAY-btns .layui-nav {padding-left:0;padding-right:10px;top:-4px;margin: 0 10px;border: 0;background-color: #009688;}
-    .LAY-btns .layui-nav .layui-nav-item{line-height: 30px;}
-    .LAY-btns .layui-nav .layui-nav-child{top:34px;}
-    .LAY-btns .layui-nav .layui-nav-bar{display: none;}
-    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a{color:#333;background-color:#fff;}
-    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {background-color: #f2f2f2;color: #000;}
-         .seach_items {float:right;margin-left: 10px;}
-  </style>
-
-</head>
-<body>
-
-  <div class="layui-fluid">
-    <div class="layui-card">
-        <div class="layui-card-body" pad15>
-        <div class="layui-row layui-col-space15">
-          <div class="layui-col-md12">
-            <div class="LAY-btns" style="margin-bottom: 10px;">
-                <form class="layui-form" lay-filter="query-form-element">
-                    <div class="seach_items">
-                        <button class="layui-btn" lay-submit lay-filter="query-form-element"><i class="layui-icon layui-icon-search"></i>查询</button>
-                    </div>
-                    <div class="seach_items">
-                        <input id="id_search_name" type="text"  name="name" autocomplete="off" class="layui-input" placeholder="客户姓名"/>
-                    </div>
-                    <div class="seach_items">
-                        <input id="id_date_end" type="text"  name="date_end" autocomplete="off" class="layui-input" placeholder="结束日期"/>
-                    </div>
-                    <div class="seach_items">
-                        <input id="id_date_begin" type="text"  name="date_begin" autocomplete="off" class="layui-input" placeholder="开始日期"/>
-                    </div>
-                </form>
-                <div style="clear: both;"></div>
-            </div>
-            <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
-
-          </div>
-        </div>
-        </div>
-    </div>
-  </div>
-
-  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
-  <script>
-  layui.config({
-    base: '../../../layuiadmin/' //静态资源所在路径
-  }).extend({
-    index: 'lib/index' //主入口模块
-     ,formSelects: 'formSelects-v4'
-  }).use(['index', 'table', 'form', 'formSelects', 'upload', 'laydate'], function(){
-    var $ = layui.$
-            ,table = layui.table
-            ,laydate = layui.laydate
-            ,form = layui.form;
-
-    laydate.render({
-        elem: '#id_date_begin',
-        type: 'date'
-    });
-      laydate.render({
-        elem: '#id_date_end',
-        type: 'date'
-    });
-    table.render({
-      elem: '#datagrid'
-      ,url: '/tenant/statistics/commission/'
-      ,cols: [[
-        {field:'name', title:'客户姓名',width: 150}
-       ,{field:'1', title:'整车推荐佣金',width: 150}
-       ,{field:'2', title:'商品推荐佣金',width: 150}
-       ,{field:'3', title:'推荐成功佣金',width: 150}
-       ,{field:'4', title:'推荐注册佣金', width:150}
-       //,{field:'5', title:'车型详细', width:100}
-      ]]
-        ,totalRow:true
-      ,parseData:function(res) {
-        if(res.code === 1){
-            return;
-        }
-        var cols = this.cols[0];
-        for (var i in cols) {
-            if (cols[i].field === 'name') {
-                cols[i].totalRowText = '合计';
-            }
-            if (cols[i].field === '1') {
-                cols[i].totalRowText = res.data.footer['1'];
-            }
-            if (cols[i].field === '2') {
-                cols[i].totalRowText = res.data.footer['2'];
-            }
-            if (cols[i].field === '3') {
-                cols[i].totalRowText = res.data.footer['3'];
-            }
-            if (cols[i].field === '4') {
-                cols[i].totalRowText = res.data.footer['4'];
-            }
-            if (cols[i].field === '5') {
-                cols[i].totalRowText = res.data.footer['5'];
-            }
-        }
-        return {
-          "code": res.code, //解析接口状态
-          "count": res.count, //解析数据长度
-          "data": res.data.data //解析数据列表
-        };
-      }
-      , done: function () {
-        layui.index.removeNoPermButtons()
-      }
-      ,page: true
-      ,height: 'full-108'
-    });
-    var _params;
-    form.on('submit(query-form-element)', function(data){
-      //layer.msg(JSON.stringify(data.field));
-      _params = data.field;
-      table.reload('datagrid', {
-          where: data.field
-          ,page:{curr:1}
-      });
-      layer.closeAll();
-      return false;
-    });
-  });
-  </script>
-</body>
-</html>
-

+ 0 - 140
uis/tenant/statistics/page_index.html

@@ -1,140 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>人员管理</title>
-  <meta name="renderer" content="webkit">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
-  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
-  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
-  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
-    <style type="text/css">
-    .LAY-btns .layui-nav {padding-left:0;padding-right:10px;top:-4px;margin: 0 10px;border: 0;background-color: #009688;}
-    .LAY-btns .layui-nav .layui-nav-item{line-height: 30px;}
-    .LAY-btns .layui-nav .layui-nav-child{top:34px;}
-    .LAY-btns .layui-nav .layui-nav-bar{display: none;}
-    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a{color:#333;background-color:#fff;}
-    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {background-color: #f2f2f2;color: #000;}
-         .seach_items {float:right;margin-left: 10px;}
-  </style>
-
-</head>
-<body>
-
-  <div class="layui-fluid">
-    <div class="layui-card">
-        <div class="layui-card-body" pad15>
-        <div class="layui-row layui-col-space15">
-          <div class="layui-col-md12">
-            <div class="LAY-btns" style="margin-bottom: 10px;">
-                <form class="layui-form" lay-filter="query-form-element">
-                    <div class="seach_items">
-                        <button class="layui-btn" lay-submit lay-filter="query-form-element"><i class="layui-icon layui-icon-search"></i>查询</button>
-                    </div>
-                    <div class="seach_items">
-                        <input id="id_search_name" type="text"  name="name" autocomplete="off" class="layui-input" placeholder="客户姓名"/>
-                    </div>
-                    <div class="seach_items">
-                        <input id="id_date_end" type="text"  name="date_end" autocomplete="off" class="layui-input" placeholder="结束日期"/>
-                    </div>
-                    <div class="seach_items">
-                        <input id="id_date_begin" type="text"  name="date_begin" autocomplete="off" class="layui-input" placeholder="开始日期"/>
-                    </div>
-                </form>
-                <div style="clear: both;"></div>
-            </div>
-            <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
-
-          </div>
-        </div>
-        </div>
-    </div>
-  </div>
-
-  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
-  <script>
-  layui.config({
-    base: '../../../layuiadmin/' //静态资源所在路径
-  }).extend({
-    index: 'lib/index' //主入口模块
-     ,formSelects: 'formSelects-v4'
-  }).use(['index', 'table', 'form', 'formSelects', 'upload', 'laydate'], function(){
-    var $ = layui.$
-            ,table = layui.table
-            ,laydate = layui.laydate
-            ,form = layui.form;
-
-    laydate.render({
-        elem: '#id_date_begin',
-        type: 'date'
-    });
-      laydate.render({
-        elem: '#id_date_end',
-        type: 'date'
-    });
-    table.render({
-      elem: '#datagrid'
-      ,url: '/tenant/statistics/page/'
-      ,cols: [[
-        {field:'name', title:'客户姓名',width: 150}
-       ,{field:'1', title:'商城',width: 100}
-       ,{field:'2', title:'商品详细',width: 100}
-       ,{field:'3', title:'购车',width: 100}
-       ,{field:'4', title:'车型列表', width:100}
-       ,{field:'5', title:'车型详细', width:100}
-      ]]
-        ,totalRow:true
-      ,parseData:function(res) {
-        if(res.code === 1){
-            return;
-        }
-        var cols = this.cols[0];
-        for (var i in cols) {
-            if (cols[i].field === 'name') {
-                cols[i].totalRowText = '合计';
-            }
-            if (cols[i].field === '1') {
-                cols[i].totalRowText = res.data.footer['1'];
-            }
-            if (cols[i].field === '2') {
-                cols[i].totalRowText = res.data.footer['2'];
-            }
-            if (cols[i].field === '3') {
-                cols[i].totalRowText = res.data.footer['3'];
-            }
-            if (cols[i].field === '4') {
-                cols[i].totalRowText = res.data.footer['4'];
-            }
-            if (cols[i].field === '5') {
-                cols[i].totalRowText = res.data.footer['5'];
-            }
-        }
-        return {
-          "code": res.code, //解析接口状态
-          "count": res.count, //解析数据长度
-          "data": res.data.data //解析数据列表
-        };
-      }
-      , done: function () {
-        layui.index.removeNoPermButtons()
-      }
-      ,page: true
-      ,height: 'full-108'
-    });
-    var _params;
-    form.on('submit(query-form-element)', function(data){
-      //layer.msg(JSON.stringify(data.field));
-      _params = data.field;
-      table.reload('datagrid', {
-          where: data.field
-          ,page:{curr:1}
-      });
-      layer.closeAll();
-      return false;
-    });
-  });
-  </script>
-</body>
-</html>
-