فهرست منبع

小程序派单,消息

wushaodong 4 سال پیش
والد
کامیت
9d17c6f5f5

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

@@ -1,5 +1,7 @@
 # coding=utf-8
 from django.conf import settings
+import datetime
+from django.utils import timezone
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.permission import IsAdministratorUser
 from apps.tenant.models import Tenant
@@ -15,6 +17,7 @@ from utils import response_ok, response_error
 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
 
 class TenantViewSet(CustomModelViewSet):
     permission_classes = [IsAdministratorUser, ]
@@ -68,6 +71,24 @@ class TenantViewSet(CustomModelViewSet):
                 }
                 Option.objects.create(**option_data1)
                 Option.objects.create(**option_data2)
+                notice_data = {
+                    'title':'企业入驻审核通知,请点击查看!',
+                    'content':'''您的企业入驻审核已通过,请牢记一下内容:
+                    企业名称:{0}
+                    企业编号:{1}
+                    超级管理员账号:{2}
+                    超级管理员密码:{3}
+                    电脑端管理系统网址:https://baoxiu.zzliaoyuan.com/
+                    '''.format(tenant.company_name,tenant.company_no,username,password),
+                    'create_user':request.user,
+                    'tenant':tenant,
+                    'type':Notices.MESSAGE,
+                    'range':Notices.ADMIN,
+                    'end_time':(timezone.now() + datetime.timedelta(days=10)).strftime('%Y-%m-%d'),
+                }
+                notice = Notices.objects.create(**notice_data)
+                NoticesToUser.objects.create(notice=notice,user=user)
+
                 admin_log(request.user, BizLog.INSERT, u'企业[%s]添加超级账号[%s]' % (tenant.company_name,username))
             return response_ok()
         except CustomError as e:

+ 33 - 7
apps/tenant/notices/models.py

@@ -8,20 +8,46 @@ from apps.tenant.models import Tenant
 
 
 class Notices(models.Model):
-    content = models.CharField(max_length=200, verbose_name=u"内容")
+    NOTICE = 1
+    MESSAGE = 2
+    TYPE_CHOICES = (
+        (NOTICE, u'集体通知'),
+        (MESSAGE, u'个人消息'),
+    )
+
+    ALL = 1
+    ADMIN = 2
+    EMPLOYEE = 3
+    REPAIR = 4
+    RANGE_CHOICES = (
+        (NOTICE, u'所有人'),
+        (ADMIN, u'管理者'),
+        (EMPLOYEE, u'检修人'),
+        (REPAIR, u'报修人'),
+    )
+
+    content = models.TextField(verbose_name=u"内容")
     title = models.CharField(max_length=50, verbose_name=u'标题')
     create_time = models.DateTimeField(verbose_name='发布时间', auto_now_add=True)
     create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建者", on_delete=models.PROTECT,
                                     editable=False)
     tenant = models.ForeignKey(Tenant, verbose_name=u'企业', on_delete=models.PROTECT, blank=True)
+    type = models.PositiveSmallIntegerField(verbose_name=u'通知类型', choices=TYPE_CHOICES, default=NOTICE)
+    range = models.PositiveSmallIntegerField(verbose_name=u'通知范围', choices=RANGE_CHOICES, default=ALL)
+    end_time = models.DateField(verbose_name='截止时间', blank=True)
 
     class Meta:
         db_table = "notices"
         verbose_name = u"通知"
         ordering = ['-id']
-        default_permissions = ()
-        permissions = [
-            ('browse_notices', u'查看'),
-            ('add_notices', u'添加'),
-            ('delete_notices', u'删除'),
-        ]
+
+class NoticesToUser(models.Model):
+    notice = models.ForeignKey(Notices, verbose_name=u"接收人", on_delete=models.PROTECT, related_name='notice_user')
+    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"接收人", on_delete=models.PROTECT,
+                             editable=False)
+    read_count = models.IntegerField(verbose_name=u"阅读次数",default=0)
+
+    class Meta:
+        db_table = "notices_user"
+        verbose_name = u"通知消息接收人"
+        ordering = ['-id']

+ 2 - 0
apps/tenant/notices/serializers.py

@@ -6,6 +6,8 @@ from .models import Notices
 
 class NoticesSerializer(serializers.ModelSerializer):
     create_user_name = serializers.CharField(source='create_user.employee.name', read_only=True)
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    range_text = serializers.CharField(source='get_range_display', read_only=True)
     class Meta:
         model = Notices
         fields = '__all__'

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

@@ -134,7 +134,7 @@ class RepairOrderViewSet(CustomModelViewSet):
             return response_error(e.get_error_msg())
         except Exception as e:
             return response_error(str(e))
-        return response_ok('派完成!')
+        return response_ok('派完成!')
 
     @action(methods=['post'], detail=True)
     def cancel(self, request, pk):

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

@@ -14,11 +14,10 @@ from apps.upload.models import Upload
 from apps.log.models import BizLog
 from apps.tenant import tenant_log
 from apps.tenant.inspection_order.models import InspectionOrder
-from apps.WechatApplet.models import WechatApplet
 from apps.wxapp.models import CustomerWechat
 from .serializers import (RepairOrderSerializer, RepairOrderListSerializer,
                           RepairOrderDetailSerializer)
-from apps.tenant.employee.models import Employee
+from apps.tenant.employee.models import Employee,User
 
 
 class RepairOrderDetailView(generics.RetrieveAPIView):
@@ -168,6 +167,31 @@ class RepairOrderViewSet(CustomModelViewSet):
             return response_error(str(e))
         return response_ok('成功取消挂起!')
 
+    @action(methods=['post'], detail=True)
+    def dispatch_employee(self, request, pk):
+        # 派工
+        try:
+            user_ids = request.data.get('user_id')
+            if not user_ids:
+                return response_error('请选择维修工人!')
+            user = self.request.user
+            with transaction.atomic():
+                instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
+                if not instance.status == settings.CHECKED:
+                    return response_ok('当前报修工单状态非待派单状态,不能进行派单!')
+                instance.dispatch_repair_order(user, user_ids)
+            if user.id != user_ids:
+                user = User.objects.filter(id=user_ids).first()
+                CustomerWechat.sendDispatchMsg(user, instance.user.employee.name, instance.device_address,
+                                               instance.fault_des, instance.create_time, instance.no)
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            import traceback
+            traceback.print_exc()
+            return response_error(str(e))
+        return response_ok('派单完成!')
+
     @action(methods=['get'], detail=True)
     def rob_repair(self, request, pk):
         # 抢单

+ 1 - 0
apps/wxapp/urls.py

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

+ 17 - 2
apps/wxapp/views.py

@@ -232,18 +232,19 @@ class DictView(APIView):
 
 
 class NoticesView(generics.ListAPIView):
-    queryset = Notices.objects.filter()
+    queryset = Notices.objects.filter(type=Notices.NOTICE,end_time__gte=timezone.now().date())
     serializer_class = NoticesWXSerializer
 
     def filter_queryset(self, queryset):
         if self.request.user and self.request.user.is_authenticated:
             queryset = queryset.filter(tenant=self.request.user.employee.tenant)
+            # 查看自己的通知和所有通知
+            queryset = queryset.filter(Q(range=self.request.user.type) | Q(range=Notices.ALL))
         else:
             queryset = queryset.filter(tenant=0)
         f = NoticesFilter(self.request.GET, queryset=queryset)
         return f.qs
 
-
 class NoticesDetailView(generics.RetrieveAPIView):
     permission_classes = [isLogin, ]
     queryset = Notices.objects.filter()
@@ -256,6 +257,20 @@ class NoticesDetailView(generics.RetrieveAPIView):
     def retrieve(self, request, *args, **kwargs):
         return response_ok(NoticesWXSerializer(self.get_object()).data)
 
+class MessageView(generics.ListAPIView):
+    queryset = Notices.objects.filter(type=Notices.MESSAGE,end_time__gte=timezone.now().date())
+    serializer_class = NoticesWXSerializer
+
+    def filter_queryset(self, queryset):
+        if self.request.user and self.request.user.is_authenticated:
+            queryset = queryset.filter(tenant=self.request.user.employee.tenant, notice_user__user=self.request.user)
+            # 查看自己的通知和所有通知
+            # queryset = queryset.filter(Q(range=self.request.user.type) | Q(range=Notices.ALL))
+        else:
+            queryset = queryset.filter(tenant=0)
+        f = NoticesFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
 class DeviceView(APIView):
     permission_classes = [isLogin, ]
     def get(self, request):

+ 1 - 1
uis/tenant/index.html

@@ -174,7 +174,7 @@
         var user_type = layui.data(layui.setter.tableName)['user_type'];
         $('#LAY-system-side-muen .layui-nav-child dd').each(function () {
             var perm = $(this).data('user_type');
-            if (perm.indexOf(user_type) === -1) {
+            if (perm.toString().indexOf(user_type) === -1) {
                 $(this).remove();
             }
         });

+ 24 - 2
uis/tenant/notices/edit.html

@@ -28,6 +28,25 @@
                                        autocomplete="off" class="layui-input">
                             </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="range" lay-verify="required" style="width: 40px;">
+                                    <option value=""></option>
+                                    <option value='1'>所有人</option>
+                                    <option value='2'>管理者</option>
+                                    <option value='3'>检修人</option>
+                                    <option value='4'>报修人</option>
+                                </select>
+                            </div>
+                        </div>
+                        <div>
+                            <label class="layui-form-label">截止时间:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="end_time" id="id_end_time"
+                                       placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
                         <div>
                             <label class="layui-form-label"><font color='red' size="4">*</font>内容:</label>
                             <div class="layui-input-block">
@@ -52,9 +71,10 @@
     }).extend({
         index: 'lib/index',
         formSelects: 'formSelects-v4'
-    }).use(['index', 'form', 'utils',], function () {
+    }).use(['index', 'form', 'laydate', 'utils',], function () {
         var $ = layui.$
             , admin = layui.admin
+            , laydate = layui.laydate
             , form = layui.form;
         var id = layui.view.getParameterByName('id');
 
@@ -64,7 +84,9 @@
         }
 
         form.render(null, 'component-form-element');
-
+        laydate.render({
+            elem: '#id_end_time'
+        });
         form.on('submit(component-form-element)', function (data) {
 
             if (id) {

+ 5 - 2
uis/tenant/notices/index.html

@@ -110,8 +110,11 @@
             , url: '/tenant/notices/'
             , cols: [[
                 {field: 'title', title: '标题', width: 200}
+                , {field: 'type_text', title: '类型', width: 200}
+                , {field: 'range_text', title: '范围', width: 200}
                 , {field: 'content', title: '内容', MinWidth: 150}
                 , {field: 'create_time', title: '发布时间', width: 180}
+                , {field: 'end_time', title: '截止时间', width: 180}
                 , {field: 'create_user_name', title: '发布人', width: 100}
                 , {width: 130, align: 'center', fixed: 'right', toolbar: '#notices-operate-bar'}
             ]]
@@ -139,7 +142,7 @@
                     type: 2,
                     title: '修改',
                     shadeClose: false,
-                    area: ['50%', '50%'],
+                    area: ['50%', '80%'],
                     btn: ['保存', '取消'],
                     yes: function (index, dom) {
                         layui.onSubmitChild = function (data) {
@@ -169,7 +172,7 @@
             layer.open({
                 type: 2,
                 title: '添加',
-                area: ['50%', '50%'],
+                area: ['50%', '70%'],
                 btn: ['保存', '取消'],
                 yes: function (index, dom) {
                     layui.onSubmitChild = function (data) {