wushaodong 4 år sedan
förälder
incheckning
847c2d0264

+ 6 - 1
apps/account/models.py

@@ -101,11 +101,16 @@ class User(AbstractBaseUser, PermissionsMixin):
     def addCustomer(self):
         self.type = self.type | self.EMPLOYEE
 
-    def is_customer(self):
+    def is_employee(self):
         if self.type == self.EMPLOYEE:
             return True
         return False
 
+    def is_repair(self):
+        if self.type == self.REPAIR:
+            return True
+        return False
+
     def is_admin(self):
         if self.type == self.ADMIN or self.type == self.SUPPER:
             return True

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

@@ -19,3 +19,6 @@ class DeviceModel(models.Model):
         db_table = "device"
         verbose_name = u"设备管理"
         ordering = ('-id',)
+
+    def get_full_name(self):
+        return self.branch + ' ' + self.address

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

@@ -11,9 +11,13 @@ from django.db import transaction
 
 class Employee(models.Model):
     ENABLE = 1
-    DISABLE = 2
+    WORKING = 2
+    DAY_OFF = 3
+    DISABLE = 4
     STATUS_CHOICES = (
-        (ENABLE, u'在用'),
+        (ENABLE, u'启用'),
+        (WORKING, u'工作中'),
+        (DAY_OFF, u'调休'),
         (DISABLE, u'禁用'),
     )
 

+ 1 - 1
apps/tenant/repair_order/filters.py

@@ -7,7 +7,7 @@ from .models import RepairOrder
 class RepairOrderFilter(django_filters.FilterSet):
     no = django_filters.CharFilter(field_name='no', lookup_expr='icontains')
     status = django_filters.CharFilter(method='query_status')
-    building = django_filters.CharFilter(field_name='building')
+    device_name = django_filters.CharFilter(field_name='device__name', lookup_expr='icontains')
 
     class Meta:
         model = RepairOrder

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

@@ -7,11 +7,11 @@ from apps.log.models import BizLog
 from apps.tenant import tenant_log
 from apps.tenant.models import Tenant
 from apps.upload.models import Upload
-from apps.tenant.building.models import Building
 from utils.exceptions import CustomError
 from apps.tenant.option.models import Option
 from utils.format import strftime, strfsecond
 from apps.account.models import User
+from apps.tenant.device.models import DeviceModel
 
 
 class RepairOrder(models.Model):
@@ -24,7 +24,9 @@ class RepairOrder(models.Model):
 
     no = models.CharField(max_length=50, verbose_name='单号', blank=True)
     tenant = models.ForeignKey(Tenant, verbose_name=u'租户', on_delete=models.PROTECT, blank=True)
-    building = models.ForeignKey(Building, verbose_name='楼宇', on_delete=models.PROTECT, blank=True, null=True)
+    device = models.ForeignKey(DeviceModel, verbose_name='设备', on_delete=models.PROTECT, blank=True, null=True)
+    device_name = models.CharField(max_length=100, verbose_name='设备名称')
+    device_address = models.CharField(max_length=200, verbose_name='设备地址')
     fault_des = models.CharField(max_length=200, verbose_name='故障描述')
     repair_type = models.ForeignKey(Option, verbose_name='报修类型', on_delete=models.PROTECT)
     user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"报修人员", on_delete=models.PROTECT,
@@ -65,9 +67,9 @@ class RepairOrder(models.Model):
         no = '%s%d-%s' % ('BX', self.tenant.id, now.strftime('%Y%m%d%H%M%S'))
         return no
 
-    def get_full_building(self):
-        builiding = u'{0}-{1}-{2}'.format(self.building.building,self.building.floor,self.building.location,)
-        return builiding
+    def get_full_name(self):
+        address = u'{0}-{1}'.format(self.device.branch,self.device.address)
+        return address
 
     @staticmethod
     def get_instance_by_id(id, tenant):

+ 1 - 5
apps/tenant/repair_order/serializers.py

@@ -9,19 +9,15 @@ class RepairOrderSerializer(serializers.ModelSerializer):
     status_text = serializers.CharField(source='get_status_display', read_only=True)
     user_username = serializers.CharField(source='user.username', read_only=True)
     repair_type = serializers.CharField(source='repair_type.name', read_only=True)
-    building_text = serializers.SerializerMethodField()
     images = serializers.SerializerMethodField()
 
     def get_images(self, obj):
         return UploadSerializer(obj.images, many=True).data
 
-    def get_building_text(self, obj):
-        return obj.building.get_full_name()
-
     class Meta:
         model = RepairOrder
         fields = (
-            'id', 'status','status_text', 'no', 'fault_des', 'name', 'tel', 'create_time', 'building_text',
+            'id', 'status','status_text', 'no', 'fault_des', 'name', 'tel', 'create_time', 'device_name', 'device_address',
             'repair_type', 'user', 'user_username', 'images')
 
 class RepairOrderFinishSerializer(serializers.ModelSerializer):

+ 2 - 25
apps/tenant/repair_order/views.py

@@ -8,7 +8,7 @@ from utils.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
 from utils.permission import IsTenantUser, permission_required
 from .serializers import RepairOrderSerializer
-from .models import RepairOrder, RepairOrderRecord,RepairOrderFinish
+from .models import RepairOrder, RepairOrderRecord, RepairOrderFinish
 from .filters import RepairOrderFilter
 from apps.tenant import tenant_log
 from apps.log.models import BizLog
@@ -24,29 +24,14 @@ class DictView(APIView):
         ret = {
             'status': settings.REPAIR_STATUS_CHOICES,
         }
-        # 租户下面的账号,只查询账号所在区域的部门数据
-        if request.user.is_admin() and request.user.employee.department:
-            ret['area'] = [{
-                'id': request.user.employee.department.area.id,
-                'name': request.user.employee.department.area.name,
-            }]
-            ret['department'] = AreaDepartmentSerializer(
-                Department.objects.filter(delete=False, enable=True, area=request.user.employee.department.area),
-                many=True).data
-        else:
-            ret['area'] = AreaSerializer(Area.objects.filter(delete=False, enable=True, tenant=tenant), many=True).data
-            ret['department'] = AreaDepartmentSerializer(
-                Department.objects.filter(delete=False, enable=True, area__tenant=tenant), many=True).data
         return response_ok(ret)
 
 class GetEmployeeView(APIView):
     permission_classes = [IsTenantUser, ]
 
     def get(self, request):
-        department_id = request.GET.get('department_id')
         employees = EmployeeSerializer(
-            Employee.objects.filter(status__lt=Employee.LEAVE_OFFICE, type=Employee.EMPLOYEE,
-                                    department_id=department_id), many=True).data
+            Employee.objects.filter(status__lte=Employee.DAY_OFF, type=Employee.EMPLOYEE, ), many=True).data
         data = []
         for emp in employees:
             dict = {
@@ -73,13 +58,11 @@ class RepairOrderViewSet(CustomModelViewSet):
     queryset = RepairOrder.objects.filter(delete=False)
     serializer_class = RepairOrderSerializer
 
-    @permission_required('repair_order.browse_repair_order')
     def filter_queryset(self, queryset):
         queryset = queryset.filter(tenant=self.request.user.employee.tenant)
         f = RepairOrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 
-    @permission_required('repair_order.delete_repair_order')
     def destroy(self, request, *args, **kwargs):
         with transaction.atomic():
             instance = self.get_object()
@@ -93,8 +76,6 @@ class RepairOrderViewSet(CustomModelViewSet):
     def check(self, request, pk):
         # 审核
         try:
-            if not self.request.user.has_perm('repair_order.check_repair_order'):
-                raise CustomError(u"您没有[报修工单-审核]权限,无法执行该操作,请联系管理员分配权限!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -109,8 +90,6 @@ class RepairOrderViewSet(CustomModelViewSet):
     def dispatch_employee(self, request, pk):
         # 派工
         try:
-            if not self.request.user.has_perm('repair_order.dispatch_repair_order'):
-                raise CustomError(u"您没有[报修工单-派工]权限,无法执行该操作,请联系管理员分配权限!")
             user_ids = self.request.data.get('user_ids')
             if not user_ids:
                 return response_error('请选择维修工人!')
@@ -132,8 +111,6 @@ class RepairOrderViewSet(CustomModelViewSet):
     def turn_employee(self, request, pk):
         # 转单
         try:
-            if not self.request.user.has_perm('repair_order.dispatch_repair_order'):
-                raise CustomError(u"您没有[报修工单-派工]权限,无法执行该操作,请联系管理员分配权限!")
             user_ids = self.request.data.get('user_ids')
             if not user_ids:
                 return response_error('请选择维修工人!')

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

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

+ 16 - 13
apps/wxapp/repair_order/views.py

@@ -7,7 +7,7 @@ from rest_framework.decorators import action
 from utils import response_ok, response_error
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
-from utils.permission import IsTenantUser, permission_required, isLogin
+from utils.permission import IsTenantUser, permission_required, isLogin, IsEmployee
 from apps.tenant.repair_order.models import RepairOrder, RepairOrderRecord, RepairOrderComment, RepairOrderFinish
 from apps.tenant.repair_order.filters import RepairOrderFilter
 from apps.upload.models import Upload
@@ -85,14 +85,15 @@ class DispatchRepairOrderView(generics.ListAPIView):
 
 
 class RepairOrderViewSet(CustomModelViewSet):
-    permission_classes = [isLogin, ]
+    permission_classes = [IsTenantUser, ]
     queryset = RepairOrder.objects.filter(delete=False)
     serializer_class = RepairOrderSerializer
 
     def filter_queryset(self, queryset):
-        appid = self.request.GET.get('appid')
-        app = WechatApplet.getByAppid(appid)
-        queryset = queryset.filter(tenant=app.tenant, user=self.request.user)
+        queryset = queryset.filter(tenant=self.request.user.employee.tenant, )
+        if self.request.user.is_repair:
+            queryset = queryset.filter(user=self.request.user)
+        # user_ids = self.repair_users.split(',') or [] TODO 维修师傅一对一
         f = RepairOrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -116,8 +117,8 @@ class RepairOrderViewSet(CustomModelViewSet):
     def check(self, request, pk):
         # 审核
         try:
-            # if not self.request.user.has_perm('repair_order.check_repair_order'):
-            #     raise CustomError(u"您没有[报修工单-审核]权限,无法执行该操作,请联系管理员分配权限!")
+            if not self.request.user.is_admin():
+                raise CustomError(u"权限不足,禁止操作!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -132,8 +133,8 @@ class RepairOrderViewSet(CustomModelViewSet):
     def hang_up(self, request, pk):
         # 挂起
         try:
-            # if not self.request.user.has_perm('repair_order.finish_repair_order'):
-            #     raise CustomError(u"您没有[报修工单-审核]权限,无法执行该操作,请联系管理员分配权限!")
+            if not self.request.user.is_admin():
+                raise CustomError(u"权限不足,禁止操作!")
             reason = request.data.get('reason')
             if not reason:
                 raise CustomError('请填写挂起原因')
@@ -151,8 +152,8 @@ class RepairOrderViewSet(CustomModelViewSet):
     def cancel_hang_up(self, request, pk):
         # 取消挂起,继续施工
         try:
-            # if not self.request.user.has_perm('repair_order.finish_repair_order'):
-            #     raise CustomError(u"您没有[报修工单-审核]权限,无法执行该操作,请联系管理员分配权限!")
+            if not self.request.user.is_admin():
+                raise CustomError(u"权限不足,禁止操作!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -234,8 +235,8 @@ class RepairOrderViewSet(CustomModelViewSet):
     def invalid(self, request, pk):
         # 作废
         try:
-            # if not self.request.user.has_perm('repair_order.invalid_repair_order'):
-            #     raise CustomError(u"您没有[报修工单-作废]权限,无法执行该操作,请联系管理员分配权限!")
+            if not self.request.user.is_admin():
+                raise CustomError(u"权限不足,禁止操作!")
             with transaction.atomic():
                 user = self.request.user
                 instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
@@ -286,6 +287,8 @@ class RepairOrderViewSet(CustomModelViewSet):
     @permission_required('repair_order.delete_repair_order')
     def destroy(self, request, *args, **kwargs):
         try:
+            if not self.request.user.is_admin():
+                raise CustomError(u"权限不足,禁止操作!")
             with transaction.atomic():
                 instance = self.get_object()
                 instance.delete = True

+ 2 - 0
apps/wxapp/serializers.py

@@ -44,6 +44,7 @@ class WechatLoginSerializer(serializers.Serializer):
                 'user_id': user.id,
                 'token': jwt_encode_handler(payload),
                 'openid': customer_wechat.openid,
+                'tenant_id': customer_wechat.customer.tenant and customer_wechat.customer.tenant.id or '',
                 'nick_name': settings.WEAPP['nick_name'],
                 'name': customer_wechat.customer.name or '',
                 'tel': customer_wechat.customer.tel or '',
@@ -78,6 +79,7 @@ class WechatBindSerializer(serializers.Serializer):
                 'face': customer.face,
                 'user_type': customer.type,  # 用户类别,1为平台管理员,2为管理者,3检修人,4报修人
                 'forbid_baoxiu': 'true' and customer.status == Employee.DISABLE or 'false',  # 是否禁用报修,
+                'tenant_id': customer.tenant and customer.tenant.id or '',
             }
 
         else:

+ 1 - 2
apps/wxapp/views.py

@@ -140,13 +140,12 @@ class PosterView(generics.ListAPIView):
         return data
 
 class DictView(APIView):
-
+    permission_classes = [isLogin, ]
     def get(self, request):
         tenant = request.user.employee.tenant
         ret = {
             'repair_type': OptionSerializer(Option.objects.filter(delete=False,type=Option.REPAIRS_TYPE, enable=True, tenant=tenant), many=True).data,
             'fault_cause': OptionSerializer(Option.objects.filter(delete=False,type=Option.FAULT_CAUSE, enable=True, tenant=tenant), many=True).data,
-            'area': AreaSerializer(Area.objects.filter(delete=False, enable=True, tenant=tenant), many=True).data,
         }
         return response_ok(ret)
 

+ 1 - 58
uis/tenant/repairManage/dispatch.html

@@ -20,24 +20,7 @@
                 <div class="layui-card-body">
                     <form class="layui-form" action="" lay-filter="component-form-element">
                         <div class="layui-row layui-col-space10 layui-form-item">
-                            <div class="layui-col-lg6">
-                                <label class="layui-form-label"><font color='red' size="4">*</font>区域:</label>
-                                <div class="layui-input-block">
-                                    <select id="id_area" lay-verify="required" name="area" lay-filter="areaChange"
-                                            style="width: 40px;">
-                                        <option value="">选择区域</option>
-                                    </select>
-                                </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 id="id_department" lay-verify="required" name="department"
-                                            lay-filter="deptChange" style="width: 40px;">
-                                        <option value="">选择部门</option>
-                                    </select>
-                                </div>
-                            </div>
+
                             <div class="layui-col-lg6">
                                 <label class="layui-form-label"><font color='red' size="4">*</font>人员:</label>
                                 <div class="layui-input-block">
@@ -73,40 +56,7 @@
         var departments = []
         // 调用接口获取dict
         admin.req({
-            url: '/tenant/repair_order/dict/',
-            done: function (res) {
-                departments = res.data.department;
-                var area = res.data.area;
-                var area_node = $('#id_area');
-                for (var i in area) {
-                    var pid = area[i].id;
-                    var area_value = area[i].name;
-                    area_node.append("<option value='" + pid + "'>" + area_value + "</option>");
-                }
-                form.render();
-            }
-        });
-        var areaChange = function (value) {
-            var department_option = '<option value="">选择部门</option>';
-            for (var i = 0; i < departments.length; i++) {
-                if (departments[i].area === parseInt(value)) {
-                    department_option += "<option value=" + departments[i].id + ">" + departments[i].name + "</option>";
-                }
-            }
-            $("#id_department").append(department_option);
-            form.render();
-        };
-
-        form.on('select(areaChange)', function (data) {
-            $("#id_department").html('');
-            if (!data.value) return;
-            areaChange(data.value)
-        });
-
-        var deptChange = function (value) {
-            admin.req({
                 url: '/tenant/repair_order/get_employee/',
-                data: {department_id: value},
                 type: 'get',
                 done: function (res) {
                     var users = res.data;
@@ -119,13 +69,6 @@
                     form.render();
                 }
             });
-        };
-
-        form.on('select(deptChange)', function (data) {
-            $("#id_user").html('');
-            if (!data.value) return;
-            deptChange(data.value)
-        });
 
 
         form.on('submit(component-form-element)', function (data) {

+ 2 - 1
uis/tenant/repairManage/index.html

@@ -130,7 +130,8 @@
             , type: 'get'
             , cols: [[
                 {field: 'no', title: '报修单号', width: 180}
-                , {field: 'building_text', title: '地点', width: 250}
+                , {field: 'device_name', title: '设备名称', width: 200}
+                , {field: 'device_address', title: '地点', width: 200}
                 , {field: 'fault_des', title: '问题描述', MinWidth: 200}
                 , {field: 'repair_type', title: '报修类型', width: 100}
                 , {field: 'name', title: '报修人', width: 100}

+ 6 - 0
utils/permission.py

@@ -17,6 +17,12 @@ class IsTenantUser(permissions.BasePermission):
             return False
         return request.user.is_admin()
 
+class IsEmployee(permissions.BasePermission):
+    def has_permission(self, request, view):
+        if not request.user or not request.user.is_authenticated:
+            return False
+        return request.user.is_employee()
+
 class IsAdministratorUser(permissions.BasePermission):
     def has_permission(self, request, view):
         if not request.user or not request.user.is_authenticated: