wushaodong 4 سال پیش
والد
کامیت
1297cc5f91
42فایلهای تغییر یافته به همراه574 افزوده شده و 1147 حذف شده
  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
 from .serializers import DeviceSerializer
 from utils.exceptions import CustomError
-from utils.permission import IsTenantUser
+from utils.permission import IsAdministratorUser
 from .filters import DeviceFilter, DeviceModel
 from utils.custom_modelviewset import CustomModelViewSet
 from apps.log.models import BizLog
@@ -14,7 +14,7 @@ from .resources import DeviceImporter
 
 # Create your views here.
 class DeviceViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser]
+    permission_classes = [IsAdministratorUser]
     queryset = DeviceModel.objects.all()
     serializer_class = DeviceSerializer
 
@@ -46,7 +46,7 @@ class DeviceViewSet(CustomModelViewSet):
         super(DeviceViewSet, self).perform_destroy(instance)
 
 class DeviceImportView(APIView):
-    permission_classes = [IsTenantUser, ]
+    permission_classes = [IsAdministratorUser, ]
 
     def post(self, request):
         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 apps.account.models import User
 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 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 utils import response_ok, response_error
 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 import tenant_log
 from apps.log.models import BizLog
 from apps.tenant.employee.filters import EmployeeFilter
 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 utils.exceptions import CustomError
 
@@ -47,17 +44,15 @@ class VisitorView(CustomModelViewSet):
         return response_ok()
 
 class EmployeeViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser]
+    permission_classes = [IsAdministratorUser]
     queryset = Employee.objects.filter()
     serializer_class = EmployeeSerializer
 
-    @permission_required('employee.browse_employee')
     def filter_queryset(self, queryset):
         queryset = queryset.filter(tenant=self.request.user.employee.tenant, type__lt=Employee.REPAIR)
         f = EmployeeFilter(self.request.GET, queryset=queryset)
         return f.qs
 
-    @permission_required('employee.add_employee')
     def perform_create(self, serializer):
         super(EmployeeViewSet, self).perform_create(serializer)
         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),
                    validated_data)
 
-    @permission_required('employee.add_employee')
     def perform_update(self, serializer):
         super(EmployeeViewSet, self).perform_update(serializer)
         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),
                    validated_data)
 
-    @permission_required('employee.delete_employee')
     def destroy(self, request, *args, **kwargs):
         with transaction.atomic():
             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.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
-from utils.permission import IsTenantUser
+from utils.permission import IsAdministratorUser
 from apps.tenant import tenant_log
 from apps.log.models import BizLog
 from .serializers import NoticesSerializer
@@ -13,7 +13,7 @@ from .filters import NoticesFilter
 
 
 class NoticesViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
+    permission_classes = [IsAdministratorUser, ]
     serializer_class = NoticesSerializer
     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
 
 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
 from .models import Poster
-from utils.permission import IsTenantUser, permission_required
+from utils.permission import IsAdministratorUser
 from .serializer import PosterSerializer
 from apps.log.models import BizLog
-from apps.tenant import tenant_log
 from .filters import PosterFilter
 from django.db import transaction
 from utils.exceptions import CustomError
@@ -16,35 +15,55 @@ from utils import response_ok, response_error
 
 
 class PosterViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser, ]
+    permission_classes = [IsAdministratorUser, ]
     queryset = Poster.objects.filter()
     serializer_class = PosterSerializer
 
     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)
         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()
 

+ 1 - 4
apps/tenant/urls.py

@@ -10,18 +10,15 @@ urlpatterns = [
     url(r'^token_refresh/$', TenantRefreshTokenView.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'^option/', include('apps.tenant.option.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'^inspection_order/', include('apps.tenant.inspection_order.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'^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:
             if not self.request.user.is_admin():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非管理人员,禁止操作!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -133,7 +133,7 @@ class RepairOrderViewSet(CustomModelViewSet):
         # 挂起
         try:
             if not self.request.user.is_employee():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非维修师傅,禁止操作!")
             reason = request.data.get('reason')
             if not reason:
                 raise CustomError('请填写挂起原因')
@@ -152,7 +152,7 @@ class RepairOrderViewSet(CustomModelViewSet):
         # 取消挂起,继续施工
         try:
             if not self.request.user.is_employee():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非维修师傅,禁止操作!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -167,6 +167,8 @@ class RepairOrderViewSet(CustomModelViewSet):
     def rob_repair(self, request, pk):
         # 抢单
         try:
+            if not self.request.user.is_employee():
+                raise CustomError(u"非维修师傅,禁止操作!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -190,7 +192,7 @@ class RepairOrderViewSet(CustomModelViewSet):
     def finish(self, request, pk):
         # 完工
         if not self.request.user.is_employee():
-            raise CustomError(u"权限不足,禁止操作!")
+            raise CustomError(u"非维修师傅,禁止操作!")
         try:
             content = request.data.get('content')
             images = request.data.get('images', None)
@@ -236,7 +238,7 @@ class RepairOrderViewSet(CustomModelViewSet):
         # 作废
         try:
             if not self.request.user.is_admin():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非管理人员,禁止操作!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -287,7 +289,7 @@ class RepairOrderViewSet(CustomModelViewSet):
     def destroy(self, request, *args, **kwargs):
         try:
             if not self.request.user.is_admin():
-                raise CustomError(u"权限不足,禁止操作!")
+                raise CustomError(u"非管理人员,禁止操作!")
             with transaction.atomic():
                 instance = self.get_object()
                 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.serializers import NoticesWXSerializer
 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 apps.tenant.poster.serializer import PosterSerializer, Poster
 from apps.tenant.device.models import DeviceModel
@@ -117,7 +117,7 @@ class HomeStatisticsView(APIView):
 
 class StatisticsRepairView(APIView):
     '''小程序统计数据'''
-    permission_classes = [isLogin, ]
+    permission_classes = [IsTenantUser, ]
     def get(self, request):
         days = int(request.GET.get('days')) # 7 30 365
         data = []# 报修数据
@@ -175,7 +175,7 @@ class StatisticsRepairView(APIView):
 
 class StatisticsEvaluateView(APIView):
     '''小程序评价统计数据'''
-    permission_classes = [isLogin, ]
+    permission_classes = [IsTenantUser, ]
     def get(self, request):
         days = int(request.GET.get('days')) # 7 30 365
         data = []# 评价数据
@@ -205,9 +205,10 @@ class PosterView(generics.ListAPIView):
         is_auth = False
         if self.request.user and self.request.user.is_authenticated:
             is_auth = True
-        queryset = queryset.filter(tenant__isnull=True)
         if is_auth:
             queryset = queryset.filter(Q(tenant__isnull=True) | Q(tenant=self.request.user.employee.tenant))
+        else:
+            queryset = queryset.filter(tenant__isnull=True)
         return queryset
 
     def list(self, request, *args, **kwargs):

+ 0 - 3
ly_baoxiu_admin/settings.py

@@ -50,10 +50,7 @@ INSTALLED_APPS = [
     'apps.tenant',
     'apps.upload',
     'apps.tenant.option',
-    'apps.tenant.area',
     'apps.tenant.config',
-    'apps.tenant.building',
-    'apps.tenant.equipment',
     'apps.tenant.device',
     'apps.tenant.repair_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>
                         <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>
                             </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>
                             </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>
                             </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>
                             </dd>
+                            <dd data-name="nav" data-user_type="1">
+                                <a lay-href="banner/index.html">首页轮播</a>
+                            </dd>
                         </dl>
                     </li>
                     <li data-name="set" class="layui-nav-item">
@@ -113,7 +116,7 @@
                             <cite>通知管理</cite>
                         </a>
                         <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>
                             </dd>
                         </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>
-