Преглед изворни кода

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

lijiangwei пре 4 година
родитељ
комит
e5b01434de

+ 2 - 2
apps/admin/poster/views.py

@@ -33,7 +33,7 @@ class PosterViewSet(CustomModelViewSet):
         with transaction.atomic():
             data['create_user'] = request.user
             poster = Poster.objects.create(**data)
-            poster._add_img(banner_img)
+            poster._add_img(banner_img,request.user)
             BizLog.objects.addnew(None, request.user, BizLog.INSERT, u'添加轮播信息', data)
         return response_ok()
 
@@ -48,7 +48,7 @@ class PosterViewSet(CustomModelViewSet):
                 poster = self.get_object()
                 if banner_img:
                     poster.del_images()
-                    poster._add_img(banner_img)
+                    poster._add_img(banner_img,request.user)
         except CustomError as e:
             return response_error(e.get_error_msg())
         except Exception as e:

+ 2 - 2
apps/admin/tenant/serializers.py

@@ -1,7 +1,7 @@
 # coding=utf-8
 import datetime
 from rest_framework import serializers
-from apps.tenant.models import Tenant
+from apps.tenant.models import Tenant,Invoice
 from apps.tenant.employee.models import Employee
 from utils.exceptions import CustomError
 from apps.account.models import User
@@ -10,6 +10,7 @@ from apps.upload.models import Upload
 class TenantSerializer(serializers.ModelSerializer) :
     create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
+    user_text = serializers.CharField(source='user.username', read_only=True)
     username = serializers.SerializerMethodField()
     image = serializers.SerializerMethodField()
 
@@ -50,4 +51,3 @@ class TenantSerializer(serializers.ModelSerializer) :
         return instance
 
 
-

+ 10 - 0
apps/admin/tenant/views.py

@@ -1,6 +1,8 @@
 # coding=utf-8
 from django.conf import settings
 import datetime
+import traceback
+
 from django.utils import timezone
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.permission import IsAdministratorUser
@@ -18,6 +20,8 @@ from apps.account.models import User
 from .filters import TenantFilter
 from apps.tenant.option.models import Option
 from apps.tenant.notices.models import Notices, NoticesToUser
+from apps.WechatApplet.models import WechatApplet
+
 
 class TenantViewSet(CustomModelViewSet):
     permission_classes = [IsAdministratorUser, ]
@@ -110,8 +114,14 @@ class TenantViewSet(CustomModelViewSet):
 
                 instance.status = status
                 instance.reject_reason = reject_reason
+
+                if not instance.wxapp_img:
+                    applet = WechatApplet.objects.filter(authorizer_appid=settings.WEAPP['appid']).first()
+                    filename = applet.getWXAppCode(instance.company_no)
+                    instance.wxapp_img = "{0}{1}".format(settings.MEDIA_URL, filename)
                 instance.save()
                 BizLog.objects.addnew(None, request.user, BizLog.INSERT, u'审核企业[%s]状态为[%s],id=%d' % (instance.company_name, status, instance.id))
+
         except CustomError as e:
             return response_error(e.get_error_msg())
         except Exception as e:

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

@@ -1,4 +1,4 @@
-# coding=utf-8
+ # coding=utf-8
 from rest_framework.views import APIView
 from django.db import transaction
 import traceback

+ 12 - 2
apps/tenant/filters.py

@@ -2,11 +2,21 @@
 
 import django_filters
 
-from .models import Tenant
+from .models import Tenant,Invoice
 
 class TenantFilter(django_filters.FilterSet):
     name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
 
     class Meta:
         model = Tenant
-        fields = ['name',]
+        fields = ['name',]
+
+class InvoiceFilter(django_filters.FilterSet):
+    invoice_name = django_filters.CharFilter(field_name='invoice_name', lookup_expr='icontains')
+    tax_no = django_filters.CharFilter(field_name='tax_no', lookup_expr='icontains')
+    consignee = django_filters.CharFilter(field_name='consignee', lookup_expr='icontains')
+    consignee_tel = django_filters.CharFilter(field_name='consignee_tel', lookup_expr='icontains')
+
+    class Meta:
+        model = Invoice
+        fields = '__all__'

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

@@ -14,5 +14,4 @@ class InspectionOrderFilter(django_filters.FilterSet):
 
     def query_status(self, queryset, *args):
         queryset = queryset.filter(status__in=args[1].split(','))
-        print(queryset)
         return queryset

+ 44 - 2
apps/tenant/models.py

@@ -89,7 +89,7 @@ class Pay(models.Model):
     WAIT = 0
     PAY = 1
     CONFIRM = 2
-    UNDO = 4
+    UNDO = 3
     STATUS_CHOICES = (
         (WAIT, u'待付款'),
         (PAY, u'已付款'),
@@ -110,7 +110,8 @@ class Pay(models.Model):
     qrcode = models.CharField(max_length=512, verbose_name=u"付款码", null=True)
     amount = models.BigIntegerField(verbose_name=u"支付金额", null=True)
     user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'下单人',related_name='pay_user', on_delete=models.PROTECT)
-    tenant = models.ForeignKey(Tenant, verbose_name=u'商户',related_name='pay_tenant', on_delete=models.PROTECT)
+    tenant = models.ForeignKey(Tenant, verbose_name=u'商户', related_name='pay_tenant', on_delete=models.PROTECT)
+    invoice = models.ForeignKey('invoice',verbose_name=u'发票', related_name='pay_invoice', on_delete=models.PROTECT)
 
     class Meta:
         db_table = "pay"
@@ -213,3 +214,44 @@ class Pay(models.Model):
         pay.qrcode = qrcode
         pay.save()
         return pay
+
+class Invoice(models.Model):
+    NOT_CHECKED = 0
+    NOT_MAIL = 1
+    MAILED = 2
+    REJECT = 3
+
+    APPLY_STATE_CHOICES = (
+        (NOT_CHECKED, u'待审核'),
+        (NOT_MAIL, u'待邮寄'),
+        (MAILED, u'已邮寄'),
+        (REJECT, u'未通过'),
+    )
+
+    invoice_name = models.CharField(max_length=50, verbose_name=u'名称')
+    tax_no = models.CharField(max_length=200, verbose_name=u'税号')
+    company_address = models.CharField(max_length=200, verbose_name=u'单位地址', blank=True, null=True)
+    phone_no = models.CharField(max_length=20, verbose_name=u'电话号码', blank=True, null=True)
+    deposit_bank = models.CharField(max_length=50, verbose_name=u'开户银行', blank=True, null=True)
+    bank_account = models.CharField(max_length=50, verbose_name=u'银行帐户', blank=True, null=True)
+    invoice_sum = models.FloatField(verbose_name=u'发票金额')
+
+    user = models.CharField(max_length=20, verbose_name=u"申请人")
+    create_time = models.DateTimeField(verbose_name=u'申请时间', auto_now_add=True, editable=False)
+    status = models.PositiveSmallIntegerField(choices=APPLY_STATE_CHOICES, verbose_name=u'状态',
+                                              default=NOT_CHECKED)
+    reject_reason = models.CharField(max_length=200, verbose_name=u'拒绝原因', blank=True, null=True)
+    use_time = models.DateTimeField(verbose_name=u'操作时间', auto_now_add=True, editable=False)
+
+    consignee = models.CharField(max_length=10, verbose_name=u'收件人',)
+    consignee_tel= models.CharField(max_length=20, verbose_name=u'收件人电话')
+    consignee_address= models.CharField(max_length=200, verbose_name=u'收件地址')
+    express_company = models.CharField(max_length=20, verbose_name=u'快递公司', blank=True, null=True)
+    express_number = models.CharField(max_length=200, verbose_name=u'快递单号', blank=True, null=True)
+    tenant = models.ForeignKey(Tenant, verbose_name=u'商户', related_name='invoice_tenant', on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = 'invoice'
+        ordering = ['-id']
+        verbose_name = '申请发票'
+        default_permissions = ()

+ 2 - 2
apps/tenant/poster/models.py

@@ -32,12 +32,12 @@ class Poster(models.Model):
         ordering = ['-id', 'tenant']
         verbose_name = u'轮播广告'
 
-    def _add_img(self, file):
+    def _add_img(self, file, user_id):
         width = None
         height = None
 
         path = "poster/"
-        filename = UploadFile(file, path)
+        filename = UploadFile(file, path, user_id)
         fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
 
         try:

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

@@ -36,7 +36,7 @@ class PosterViewSet(CustomModelViewSet):
                     raise CustomError(u'只能添加2个在用的轮播!')
                 data['tenant'] = tenant
                 poster = Poster.objects.create(**data)
-                poster._add_img(banner_img)
+                poster._add_img(banner_img,request.user)
                 BizLog.objects.addnew(tenant, request.user, BizLog.INSERT, u'添加轮播信息', data)
             return response_ok()
         except CustomError as e:
@@ -60,7 +60,7 @@ class PosterViewSet(CustomModelViewSet):
                 poster = self.get_object()
                 if banner_img:
                     poster.del_images()
-                    poster._add_img(banner_img)
+                    poster._add_img(banner_img,request.user)
         except CustomError as e:
             return response_error(e.get_error_msg())
         except Exception as e:

+ 19 - 6
apps/tenant/repair_order/models.py

@@ -57,10 +57,12 @@ class RepairOrder(models.Model):
                                               default=settings.NOT_CHECKED)
     order_type = models.PositiveSmallIntegerField(choices=ORDER_TYPE, verbose_name=u'工单类型',
                                                   default=REPAIR_ORDER)
-    images = models.ManyToManyField(Upload, verbose_name='图片', blank=True)
+
     create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
     delete = models.BooleanField(verbose_name='删除', default=False)
 
+    images = models.ManyToManyField(Upload, verbose_name='图片', blank=True, related_name='images_id')
+
     class Meta:
         db_table = 'repair_order'
         verbose_name = '报修工单'
@@ -187,12 +189,21 @@ class RepairOrderRecord(models.Model):
             'status': self.status,
             'status_text': settings.REPAIR_STATUS_CHOICES[self.status - 1][1],
             'operation_time': strftime(self.operation_time),
+            'images': [],
         }
         user_name = self.user.employee.name
         if self.status == settings.NOT_CHECKED:
             dict['no'] = self.repair_order.no
             dict['desc'] = u'下单人:{}-{}'.format(self.repair_order.name, self.repair_order.tel)
             dict['tel'] = self.repair_order.tel
+            # images = self.repair_order.images.all()
+            # for img in images:
+            #     if img.type != Upload.REPAIR_VOICE:
+            #         dict['images'].append(
+            #             {
+            #                 'url': img.picture
+            #             }
+            #         )
         elif self.status == settings.CHECKED:
             dict['desc'] = u'审核人:{}'.format(user_name)
         elif self.status == settings.DISPATCH:
@@ -228,13 +239,15 @@ class RepairOrderRecord(models.Model):
             dict['fault_cause'] = order_finish.fault_cause.name
             dict['content'] = order_finish.content
             dict['images'] = []
+
             images = order_finish.images.all()
             for img in images:
-                dict['images'].append(
-                    {
-                        'url': img.picture
-                    }
-                )
+                if img.type != Upload.REPAIR_VOICE:
+                    dict['images'].append(
+                        {
+                            'url': img.picture
+                        }
+                    )
         elif self.status == settings.TURN_EMPLOYEE:
             e_name = User.objects.filter(id=self.repair_users).values('employee__name', 'employee__tel', )
             e_name = [e['employee__name'] + '-' + e['employee__tel'] for e in e_name]

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

@@ -33,7 +33,7 @@ class GetEmployeeView(APIView):
 
     def get(self, request):
         employees = EmployeeSerializer(
-            Employee.objects.filter(status__lte=Employee.DAY_OFF, type=Employee.EMPLOYEE, ), many=True).data
+            Employee.objects.filter(status__lte=Employee.DAY_OFF, type=Employee.EMPLOYEE, tenant=request.user.employee.tenant), many=True).data
         data = []
         for emp in employees:
             dict = {

+ 30 - 0
apps/tenant/serializers.py

@@ -8,6 +8,8 @@ from rest_framework_jwt.settings import api_settings
 from apps.log.models import BizLog
 from utils import get_remote_addr
 from apps.tenant.employee.models import Employee
+from apps.tenant.models import Pay,Invoice
+from apps.base import Formater
 
 User = get_user_model()
 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
@@ -51,3 +53,31 @@ class TenantJWTSerializer(JSONWebTokenSerializer):
             msg = u'必须包含“{username field}”和“password.'
             msg = msg.format(username_field=self.username_field)
             raise serializers.ValidationError(msg)
+
+class PaySerializer(serializers.ModelSerializer):
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    pay_channel_text = serializers.CharField(source='get_pay_channel_display', read_only=True)
+    tenant = serializers.DateTimeField(source='tenant.company_name', read_only=True)
+    username = serializers.CharField(source='user.employee.name', read_only=True)
+    amount = serializers.SerializerMethodField()
+
+    def get_amount(self, obj):
+        return Formater.formatAmountShow(obj.amount)
+
+    class Meta:
+        model = Pay
+        fields = '__all__'
+
+class InvoiceSerializer(serializers.ModelSerializer):
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    tenant = serializers.DateTimeField(source='tenant.company_name', read_only=True)
+    username = serializers.CharField(source='user.employee.name', read_only=True)
+
+    class Meta:
+        model = Invoice
+        fields = '__all__'
+
+    def create(self, validated_data):
+        validated_data['tenant'] = self.context['request'].user.employee.tenant
+        instance = super(InvoiceSerializer, self).create(validated_data)
+        return instance

+ 2 - 0
apps/tenant/urls.py

@@ -9,6 +9,7 @@ urlpatterns = [
     url(r'^login/$', TenantLoginView.as_view()),
     url(r'^token_refresh/$', TenantRefreshTokenView.as_view()),
     url(r'^token_verify/$', TenantVerifyTokenView.as_view()),
+    url(r'get_invoice_dict/$', InvoiceDataView.as_view()),
 
     url(r'^employee/', include('apps.tenant.employee.urls')),
     url(r'^option/', include('apps.tenant.option.urls')),
@@ -23,5 +24,6 @@ urlpatterns = [
 
 
 router = SimpleRouter()
+router.register(r'invoice', InvoiceViewSet)
 router.register(r'company', CompanyViewSet)
 urlpatterns += router.urls

+ 66 - 1
apps/tenant/views.py

@@ -4,14 +4,16 @@ import datetime
 import time
 from django.db import transaction
 from django.conf import settings
+from django.db.models import Q,Sum
 from rest_framework.decorators import action
 from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
 from rest_framework.serializers import ValidationError
+
 from utils.custom_modelviewset import CustomModelViewSet
 from utils import response_error, response_ok
 from .serializers import TenantJWTSerializer
 from utils.permission import IsTenantUser, IsAdministratorUser
-from .models import Tenant, Pay
+from .models import Tenant, Pay, Invoice
 from apps.admin.tenant.serializers import TenantSerializer
 from apps.admin.tenant.filters import TenantFilter
 from apps.log.models import BizLog
@@ -19,6 +21,10 @@ from apps.tenant.config.models import Config
 from utils.exceptions import CustomError
 from apps.base import Formater
 from apps.WechatApplet.models import WechatApplet
+from apps.tenant.serializers import PaySerializer,InvoiceSerializer
+from apps.tenant.filters import InvoiceFilter
+from rest_framework.views import APIView
+
 
 class TenantLoginView(ObtainJSONWebToken):
     serializer_class = TenantJWTSerializer
@@ -159,3 +165,62 @@ class CompanyViewSet(CustomModelViewSet):
             traceback.print_exc()
             return response_error(u'验证失败', request)
         return response_ok()
+
+    @action(methods=['get'], detail=True)
+    def get_renew_record(self, request, pk):
+        payment = Pay.objects.filter(tenant_id=pk)
+        data = PaySerializer(payment, many=True).data
+        return response_ok(data)
+
+class InvoiceDataView(APIView):
+    permission_classes = [IsTenantUser, ]
+
+    def get(self, request):
+        tenant = request.user.employee.tenant
+        pay = Pay.objects.filter(
+            Q(status=Pay.PAY, invoice_id=None,tenant=tenant) | Q(status=Pay.CONFIRM, invoice_id=None,tenant=tenant))\
+            .aggregate(amount=Sum('amount'))
+        data = {
+            'invoice_name': "",
+            'tax_no': "",
+            'company_address': "",
+            'phone_no': "",
+            'deposit_bank': "",
+            'bank_account': "",
+            'invoice_sum': "",
+            'consignee': "",
+            'consignee_tel': "",
+            'consignee_address': "",
+        }
+        try:
+            if not pay['amount']:
+                return CustomError('未开具发票!')
+            invoice = Invoice.objects.filter(tenant=tenant).order_by('-id').first()
+            if invoice:
+                data = {
+                    'invoice_name': invoice['invoice_name'],
+                    'tax_no': invoice['tax_no'],
+                    'company_address': invoice['company_address'],
+                    'phone_no': invoice['phone_no'],
+                    'deposit_bank': invoice['deposit_bank'],
+                    'bank_account': invoice['bank_account'],
+                    'invoice_sum': pay['amount'],
+                    'consignee': invoice['consignee'],
+                    'consignee_tel': invoice['consignee_tel'],
+                    'consignee_address': invoice['company_address'],
+                }
+            else:
+                data['invoice_sum']=pay['amount']
+        except Exception as e:
+            return response_error(str(e))
+        return response_ok(data)
+
+class InvoiceViewSet(CustomModelViewSet):
+    permission_classes = [IsTenantUser, ]
+    queryset = Invoice.objects.filter()
+    serializer_class = InvoiceSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(tenant=self.request.user.employee.tenant)
+        f = InvoiceFilter(self.request.GET, queryset=queryset)
+        return f.qs

+ 38 - 8
apps/upload/models.py

@@ -1,4 +1,6 @@
 # coding=utf-8
+import os
+
 from PIL import Image
 from django.conf import settings
 from django.db import models
@@ -20,9 +22,10 @@ class UploadManager(models.Manager):
         width = None
         height = None
 
-        path = UploadManager.calculatePath(type, tenant.id, user.id)
-        filename = UploadFile(file, path)
+        path = UploadManager.calculatePath(type, tenant.id)
+        filename = UploadFile(file, path, user.id)
         fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
+        size = os.path.getsize(fullname)
 
         try:
             img = Image.open(fullname)
@@ -42,44 +45,71 @@ class UploadManager(models.Manager):
             name=file.name,
             picture="%s%s" % (settings.MEDIA_URL, filename),
             width=width,
-            height=height
+            height=height,
+            file_size="%.2f" % (float(size)/1024),
+        )
+        instance.save()
+        return instance
+
+    def _addnew_voice(self, tenant, user, type, file, time):
+
+        path = UploadManager.calculatePath(type, tenant.id)
+        filename = UploadFile(file, path, user.id)
+        fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
+        size = os.path.getsize(fullname)
+
+        instance = self.model(
+            tenant=tenant,
+            user=user,
+            type=type,
+            name=file.name,
+            picture="%s%s" % (settings.MEDIA_URL, filename),
+            width=200,
+            height=200,
+            file_size="%.2f" % (float(size)/1024),
+            voice_time=time,
         )
         instance.save()
         return instance
 
     @staticmethod
-    def calculatePath(type, tenant_id, user_id):
+    def calculatePath(type, tenant_id):
         path_map = {
             Upload.REPAIR_IMAGE: repair_image,
             Upload.INSPECTION_IMAGE: inspection_image,
             Upload.COMPANY_IMAGE: company_image,
+            Upload.REPAIR_VOICE:repair_image,
         }
 
-        return path_map[type] + str(tenant_id) + str(user_id) + '/'
+        return path_map[type] + str(tenant_id)  + '/'
 
 
 repair_image = "repair/"
 inspection_image = "inspection/"
 company_image = "company/"
 
-
 class Upload(models.Model):
     REPAIR_IMAGE = 1
     INSPECTION_IMAGE = 2
     COMPANY_IMAGE = 3
+    REPAIR_VOICE = 4
     TYPE_CHOICES = (
         (REPAIR_IMAGE, u'报修图片'),
         (INSPECTION_IMAGE, u'巡检图片'),
         (COMPANY_IMAGE, u'营业执照图片'),
+        (REPAIR_VOICE, u'报修语音')
     )
+
     tenant = models.ForeignKey(Tenant, verbose_name=u'企业', on_delete=models.PROTECT)
     user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
     type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
     name = models.CharField(verbose_name=u'图片名', max_length=250)
     picture = models.CharField(verbose_name=u'图片路径', max_length=250)
-    width = models.IntegerField(verbose_name=u"图片宽度")
-    height = models.IntegerField(verbose_name=u"图片高度")
+    width = models.IntegerField(verbose_name=u"图片宽度", blank=True, default=0)
+    height = models.IntegerField(verbose_name=u"图片高度", blank=True, default=0)
     create_time = models.DateTimeField(verbose_name=u'上传时间', auto_now_add=True, editable=False)
+    file_size = models.FloatField(verbose_name="文件大小",blank=True, default=0)
+    voice_time = models.FloatField(verbose_name="语音时长",blank=True, default=0)
 
     objects = UploadManager()
 

+ 1 - 6
apps/upload/serializers.py

@@ -6,12 +6,7 @@ from .models import Upload
 
 
 class UploadSerializer(serializers.ModelSerializer):
-    # picture = serializers.SerializerMethodField()
-
-    # def get_picture(self, obj):
-        # print(5555555,obj.id)
-        # return '%s%s' % (settings.MEDIA_URL, obj.picture)
 
     class Meta:
         model = Upload
-        fields = ('picture', 'width', 'height')
+        fields = ('picture', 'width', 'height', 'type', 'voice_time')

+ 5 - 1
apps/wxapp/inspection_order/views.py

@@ -16,7 +16,7 @@ from apps.tenant import tenant_log
 
 class InspectionOrderDetailView(generics.RetrieveAPIView):
     permission_classes = [isLogin, ]
-    queryset = InspectionOrder.objects.filter(status=InspectionOrder.NOT_REPAIR)
+    queryset = InspectionOrder.objects.filter()
     serializer_class = InspectionOrderDetailSerializer
 
     def retrieve(self, request, *args, **kwargs):
@@ -24,6 +24,10 @@ class InspectionOrderDetailView(generics.RetrieveAPIView):
         serializer = self.get_serializer(instance)
         return response_ok(serializer.data)
 
+    def filter_queryset(self, queryset):
+        # queryset = queryset.filter(tenant=self.request.user.employee.tenant, user=self.request.user)
+        f = InspectionOrderFilter(self.request.GET, queryset=queryset)
+        return f.qs
 
 class InspectionOrderAllView(generics.ListAPIView):
     permission_classes = [isLogin, ]

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

@@ -56,8 +56,8 @@ class RepairOrderSerializer(serializers.ModelSerializer):
         fields = ('id', 'fault_des', 'tel', 'name', 'repair_type','device_name','device_address',)
 
     def create(self, validated_data):
-        if 'images' in self.initial_data:
-            validated_data['images'] = self.initial_data['images'].split(',')
+        if 'file' in self.initial_data:
+            validated_data['images'] = self.initial_data['file'].split(',')
         validated_data['user'] = self.context['request'].user
         validated_data['tenant'] = self.context['request'].user.employee.tenant
         instance = super(RepairOrderSerializer, self).create(validated_data)

+ 26 - 3
apps/wxapp/repair_order/views.py

@@ -1,6 +1,7 @@
 # coding=utf-8
 from django.conf import settings
 from django.db import transaction
+from django.db.models import Q
 from rest_framework import generics
 from rest_framework.views import APIView
 from rest_framework.decorators import action
@@ -49,13 +50,21 @@ class RepairOrderCountView(APIView):
             return response_ok({
                 'NOT_CHECKED_COUNT':0,
                 'CHECKED_COUNT':0,
+                'USER_NOT_CHECKED_COUNT': 0,
+                'USER_CHECKED_COUNT': 0,
                 'APPRAISE_COUNT': 0,
+                'FINISH':0,
+                'DISPATCH':0,
             })
         queryset = RepairOrder.objects.filter(delete=False, tenant=self.request.user.employee.tenant)
         return response_ok({
             'NOT_CHECKED_COUNT':queryset.filter(status__lte=settings.CHECKED).count(),
-            'CHECKED_COUNT':queryset.filter(status=settings.CHECKED).count(),
+            'CHECKED_COUNT':queryset.filter(status=settings.CHECKED,).count(),
+            'USER_NOT_CHECKED_COUNT':queryset.filter(status=settings.NOT_CHECKED,user = request.user).count(),
+            'USER_CHECKED_COUNT':queryset.filter(status=settings.CHECKED,user = request.user).count(),
             'APPRAISE_COUNT': queryset.filter(status=settings.APPRAISE, user = request.user).count(),
+            'FINISH':queryset.filter(status=settings.FINISH, user = request.user).count(),
+            'DISPATCH':queryset.filter(status=settings.DISPATCH, user = request.user).count(),
         })
 
 
@@ -66,6 +75,10 @@ class RepairOrderAllView(generics.ListAPIView):
 
     def filter_queryset(self, queryset):
         queryset = queryset.filter(tenant=self.request.user.employee.tenant)
+        if self.request.user.is_employee():
+            queryset = queryset.filter(Q(repair_users=self.request.user) | Q(user=self.request.user))
+        elif self.request.user.is_repair():
+            queryset = queryset.filter(user=self.request.user)
         f = RepairOrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -102,9 +115,9 @@ class RepairOrderViewSet(CustomModelViewSet):
         super(RepairOrderViewSet, self).perform_create(serializer)
         instance = serializer.instance
         # 发送微信通知
-        emplees = Employee.objects.filter(tenant=instance.tenant, type=Employee.ADMIN)
+        emplees = Employee.objects.filter(tenant=instance.tenant, type__in=[Employee.ADMIN, Employee.SUPER])
         for emp in emplees:
-            CustomerWechat.sendWaitCheckMsg(emp.user, instance.user.employee.name, instance.device_address,
+            CustomerWechat.sendWaitCheckMsg(emp.user, instance.name, instance.device_address,
                                instance.fault_des, instance.no)
         validated_data = serializer.validated_data
         tenant_log(self.request.user.employee, BizLog.INSERT, u'添加报修工单[%s],id=%d' % (instance.name, instance.id),
@@ -119,6 +132,16 @@ class RepairOrderViewSet(CustomModelViewSet):
             return response_ok(upload.id)
         return response_error('上传失败,请重新上传!')
 
+    @action(methods=['post'], detail=False)
+    def upload_voice(self, request):
+        file = self.request.FILES.get('file')
+        time = self.request.POST.get('time')
+        user = self.request.user
+        upload = Upload.objects._addnew_voice(user.employee.tenant, user, Upload.REPAIR_VOICE, file, time)
+        if upload:
+            return response_ok(upload.id)
+        return response_error('上传失败,请重新上传!')
+
     @action(methods=['get'], detail=True)
     def check(self, request, pk):
         # 审核

+ 2 - 0
apps/wxapp/tenant/views.py

@@ -34,9 +34,11 @@ class GetTenantView(APIView):
         emplayee = Employee.objects.filter(user=request.user).first()
         if emplayee:
             data = {
+                'tenant_id':emplayee.tenant.id,
                 'company_no':emplayee.tenant.company_no,
                 'company_name':emplayee.tenant.company_name,
                 'position':emplayee.position,
+                'wxapp_img':emplayee.tenant.wxapp_img,
                 'user_type_text':emplayee.get_type_display(),
             }
             return response_ok(data)

+ 1 - 0
apps/wxapp/urls.py

@@ -18,6 +18,7 @@ urlpatterns = [
     url(r'^dict/$', DictView.as_view()),
     url(r'^get_device/$', DeviceView.as_view()),
     url(r'^message/$', MessageView.as_view()),  # 消息
+    url(r'^message_list/$', MessageListView.as_view()),  # 消息
     url(r'^notices/$', NoticesView.as_view()),  # 通知
     url(r'^notices/(?P<pk>[0-9]+)/$', NoticesDetailView.as_view()),  # 通知
 

+ 10 - 0
apps/wxapp/views.py

@@ -271,6 +271,16 @@ class MessageView(generics.ListAPIView):
         f = NoticesFilter(self.request.GET, queryset=queryset)
         return f.qs
 
+class MessageListView(generics.ListAPIView):
+    permission_classes = [IsTenantUser, ]
+    queryset = Notices.objects.filter(type=Notices.MESSAGE)
+    serializer_class = NoticesWXSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(tenant=self.request.user.employee.tenant, notice_user__user=self.request.user)
+        f = NoticesFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
 class DeviceView(APIView):
     permission_classes = [isLogin, ]
     def get(self, request):

+ 1 - 1
ly_baoxiu_admin/settings.py

@@ -55,7 +55,7 @@ INSTALLED_APPS = [
     'apps.tenant.repair_order',
     'apps.tenant.inspection_order',
     'apps.wxapp',
-    'apps.tenant.notices'
+    'apps.tenant.notices',
 
 ]
 

+ 24 - 13
uis/tenant/company/detail.html

@@ -35,7 +35,9 @@
     </ul>
     <div class="layui-tab-content" style="background-color: #fff;">
         <div id="tenant_detail" class="layui-tab-item layui-show"></div>
-        <div id="invest_record" class="layui-tab-item"></div>
+        <div id="invest_record" class="layui-tab-item">
+            <table id="datagrid" style="width: 100%"></table>
+        </div>
 
         <script id="tenant_detail_demo" type="text/html">
             <div class="layui-tab-item layui-show">
@@ -85,17 +87,6 @@
                 </ui>
             </div>
         </script>
-        <script id="invest_record_demo" type="text/html">
-            <div class="layui-tab-item layui-show">
-                <ul class="layui-timeline">
-                    <li class="layui-timeline-item">
-                        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
-                        <div class="layui-timeline-content layui-text">
-                        </div>
-                    </li>
-                </ul>
-            </div>
-        </script>
     </div>
 </div>
 
@@ -107,8 +98,10 @@
         base: '../../../layuiadmin/' //静态资源所在路径
     }).extend({
         index: 'lib/index',
-    }).use(['index',  'laytpl'], function () {
+    }).use(['index', 'table', 'laytpl'], function () {
         var $ = layui.$
+            , admin = layui.admin
+            , table = layui.table
             , laytpl = layui.laytpl;
         var data = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
 
@@ -123,6 +116,24 @@
           var newPage=window.open();
           newPage.document.write("<img src="+ data.image +" />")
         })
+        admin.req({
+            url: '/tenant/company/' + data.id + '/get_renew_record/'
+            , done: function (res) {
+                table.render({
+                    elem: '#datagrid'
+                    , data: res.data
+                    , cols: [[
+                        {field: 'pay_no', title: '支付订单', width: 170}
+                        , {field: 'status_text', title: '支付状态', width: 100}
+                        , {field: 'amount', title: '支付金额', align: 'right', width: 100}
+                        , {field: 'create_time', title: '支付时间', width: 180}
+                        , {field: 'pay_channel_text', title: '支付方式', width: 100}
+                        , {field: 'username', title: '支付人员', width: 100}
+                    ]]
+                    , page: true
+                });
+            }
+        });
     });
 </script>
 </body>

+ 17 - 0
uis/tenant/repairManage/detail.html

@@ -60,10 +60,27 @@
                     <li class="baoxiu-li">
                         <h3>报修状态:{{ d.status_text }}</h3>
                     </li>
+
+                    {{# layui.each(d.images, function(index, item){ }}
+                    {{# if(item.type == 4){ }}
+                    <li class="baoxiu-li">
+                        <h3>报修语音:
+                            <audio controls>
+                                <source src={{ item.picture }} type="audio/mpeg">
+                            </audio>
+                        </h3>
+                    </li>
+                    {{# } }}
+                    {{# }); }}
+                    <li class="baoxiu-li">
+                        <h3>报修图片:</h3>
+                    </li>
                     {{# layui.each(d.images, function(index, item){ }}
+                    {{# if(item.type != 4){ }}
                     <li>
                         <img class="layui-upload-img" src={{ item.picture }}>
                     </li>
+                    {{# } }}
                     {{# }); }}
                 </ui>
             </div>

+ 1 - 0
uis/zzlyadmin/tenant/index.html

@@ -131,6 +131,7 @@
                 , {field: 'end_date', title: '企业到期日期', width: 120}
                 , {field: 'create_time', title: '申请时间', width: 160}
                 , {field: 'status_text', title: '审核状态', width: 100}
+                , {field: 'user_text', title: '申请人账号', width: 120}
                 , {field: 'username', title: '管理员账号', width: 200}
                 , {field: 'renew_time', title: '续费时间', width: 160}
                 , {field: 'renew_amount', title: '续费金额', width: 120}

+ 3 - 2
utils/file_operation.py

@@ -7,10 +7,11 @@ from django.utils import timezone
 from django.utils.deconstruct import deconstructible
 
 
-def UploadFile(file, upload_path):
+def UploadFile(file, upload_path, user_id):
     upload_path = PathAndRename(upload_path)
-    filename = "%s%s.%s" % (
+    filename = "%s%s_%s.%s" % (
         upload_path.path,
+        user_id,
         timezone.now().strftime('%Y%m%d%H%M%S%f'),
         file.name.split('.')[-1]
     )