wushaodong hace 4 años
padre
commit
1ddaa8a845

+ 6 - 3
apps/account/models.py

@@ -1,7 +1,7 @@
 # coding=utf-8
 
 from django.db import models
-from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, Group
+from django.db.models import Q
 from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, Group, AbstractUser
 from django.utils import timezone
 from rest_framework.utils import model_meta
@@ -42,7 +42,7 @@ class User(AbstractBaseUser, PermissionsMixin):
     )
     username = models.CharField(verbose_name=u'用户名', max_length=30, unique=True, db_index=True,
                                 help_text=u'不多于20个字符。只能用字母、数字和字符。')
-    password = models.CharField(u'密码', max_length=128, blank=True)
+    # password = models.CharField(u'密码', max_length=128, blank=True,)
 
     is_active = models.BooleanField(verbose_name=u'是否可用', default=True, editable=False)
     date_joined = models.DateTimeField(verbose_name=u'注册时间', auto_now_add=True, editable=False)
@@ -95,7 +95,10 @@ class User(AbstractBaseUser, PermissionsMixin):
         for row in rows:
             stores.append(row['store_id'])
 
-        create_stores = Store.objects.filter(create_user=self).values('id')
+        create_stores = Store.objects.filter(Q(create_user=self) |
+                                             Q(agent__create_user=self) |
+                                             Q(agent__general_agent__create_user=self)
+                                             ).values('id')
         for create_store in create_stores:
             stores.append(create_store['id'])
 

+ 3 - 3
apps/account/serializers.py

@@ -86,7 +86,7 @@ class EmployeeSerializer(serializers.ModelSerializer):
         validated_data['check_user'] = user
         validated_data['status'] = User.INSERVICE
         instance = super(EmployeeSerializer, self).create(validated_data)
-        instance.set_password(validated_data['password'])
+        instance.set_password(self.initial_data['password'])
         instance.save()
         groups = self.context['request'].data.get('groups', None)
         if groups:
@@ -102,10 +102,10 @@ class EmployeeSerializer(serializers.ModelSerializer):
         password = instance.password
         validated_data['is_superuser'] = instance.is_superuser
         instance = super(EmployeeSerializer, self).update(instance, validated_data)
-        if not 'password' in validated_data or not validated_data['password']:
+        if not 'password' in self.initial_data or not self.initial_data['password']:
             instance.password = password
         else:
-           instance.set_password(validated_data['password'])
+           instance.set_password(self.initial_data['password'])
         instance.save()
 
         groups = self.context['request'].data.get('groups', None)

+ 25 - 13
apps/account/views.py

@@ -1,4 +1,4 @@
-#coding=utf-8
+# coding=utf-8
 import traceback
 import json
 from django.db.models import Q
@@ -8,9 +8,10 @@ from rest_framework.views import APIView
 from rest_framework.serializers import ValidationError
 from utils.permission import permission_required, isLogin, check_permission
 from django.contrib.auth.models import Group, Permission
-from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
+from rest_framework_jwt.views import ObtainJSONWebToken, VerifyJSONWebToken, RefreshJSONWebToken
 from utils import response_error, response_ok
 from django.contrib.auth import get_user_model
+
 User = get_user_model()
 from apps.account.serializers import JWTSerializer, EmployeeSerializer, GroupDictSerializer, GroupSerializer
 from utils.custom_modelviewset import CustomModelViewSet
@@ -21,6 +22,7 @@ from apps.account.consts import PermissionMenu
 from collections import OrderedDict
 from apps.agent.models import Store, Agent
 
+
 class LoginView(ObtainJSONWebToken):
     serializer_class = JWTSerializer
 
@@ -28,11 +30,13 @@ class LoginView(ObtainJSONWebToken):
         try:
             ser = self.serializer_class(data=request.data)
             ser.request = request
+            # TODO 判断门店是否在用、在有效期内
             if ser.is_valid(raise_exception=True):
                 return response_ok(ser.validated_data)
         except ValidationError as e:
             return response_error(e.detail['error'][0])
 
+
 class RefreshTokenView(RefreshJSONWebToken):
     def post(self, request, *args, **kwargs):
         try:
@@ -42,6 +46,7 @@ class RefreshTokenView(RefreshJSONWebToken):
         except ValidationError as e:
             return response_error(u'登录状态失效,请重新登录')
 
+
 class EmployeeViewSet(CustomModelViewSet):
     permission_classes = [isLogin, ]
     queryset = User.objects.filter()
@@ -54,7 +59,11 @@ class EmployeeViewSet(CustomModelViewSet):
         queryset = queryset.filter(
             Q(store_id__in=self.request.user.get_manager_range()) |
             Q(id=user.id) |
-            Q(create_user=user))
+            Q(create_user=user) |
+
+            Q(agent__create_user=user) |
+            Q(general_agent__create_user=user)
+        )
 
         f = UserFilter(self.request.GET, queryset=queryset)
         return f.qs
@@ -99,9 +108,9 @@ class EmployeeViewSet(CustomModelViewSet):
             traceback.print_exc()
             return response_error(u'入职失败')
 
-    @permission_required('account.manager_store')
     @action(methods=['post'], detail=True)
     def branch(self, request, pk):
+        check_permission(request, 'account.manager_store')
         data = json.loads(request.POST.get('sotres'))
         try:
             with transaction.atomic():
@@ -110,12 +119,13 @@ class EmployeeViewSet(CustomModelViewSet):
                 for row in data:
                     ManageStoreUser.objects.create(store_id=row, manage_user_id=pk)
                 BizLog.objects.addnew(self.request.user, BizLog.INSERT,
-                                      u'设置账号[%s]管理门店,id=%d' % (instance.username, instance.id),data)
+                                      u'设置账号[%s]管理门店,id=%d' % (instance.username, instance.id), data)
             return response_ok()
         except Exception as e:
             traceback.print_exc()
             return response_error(u'保存失败')
 
+
 class GroupsViewSet(CustomModelViewSet):
     permission_classes = [isLogin, ]
     queryset = Group.objects.filter()
@@ -124,8 +134,8 @@ class GroupsViewSet(CustomModelViewSet):
     @permission_required('account.manager_permissions')
     def filter_queryset(self, queryset):
         if not self.request.user.is_superuser:
-            groups =  self.request.user.groups.all()
-            queryset =queryset.filter(id__in=[g.id for g in groups])
+            groups = self.request.user.groups.all()
+            queryset = queryset.filter(id__in=[g.id for g in groups])
         f = GroupFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -158,6 +168,7 @@ class GroupsViewSet(CustomModelViewSet):
             instance.delete()
         return response_ok()
 
+
 class PermissionsListView(APIView):
     permission_classes = [isLogin, ]
 
@@ -181,6 +192,7 @@ class PermissionsListView(APIView):
                 permissions[row.content_type.name] = [item, ]
         return response_ok(menus)
 
+
 class PermissionDictView(APIView):
     permission_classes = [isLogin, ]
 
@@ -189,7 +201,7 @@ class PermissionDictView(APIView):
         rows = Group.objects.filter()
         if not request.user.is_superuser:
             groups = request.user.groups.all()
-            rows =rows.filter(id__in=[g.id for g in groups])
+            rows = rows.filter(id__in=[g.id for g in groups])
         serializer = GroupDictSerializer(rows, many=True)
         return response_ok(serializer.data)
 
@@ -206,15 +218,15 @@ class StoreTreeView(APIView):
         agents = Agent.objects.filter()
         if not request.user.is_superuser:
             agents = agents.filter(id=request.user.agent_id)
-        agents = agents.values('id','name')
+        agents = agents.values('id', 'name')
         for agent in agents:
             item = {
-                'title':agent['name'],
-                'id':agent['id'],
-                'field':'agent',
+                'title': agent['name'],
+                'id': agent['id'],
+                'field': 'agent',
                 'children': [],
             }
-            stores = Store.objects.filter(agent_id=agent['id'], enable=True).values('id','name')
+            stores = Store.objects.filter(agent_id=agent['id'], enable=True).values('id', 'name')
             for store in stores:
                 manage_store = ManageStoreUser.objects.filter(manage_user_id=id, store_id=store['id']).first()
                 checked = manage_store and True or False

+ 3 - 1
apps/agent/models.py

@@ -44,6 +44,8 @@ class Agent(models.Model):
             ('view_agent', u'查看'),
             ('add_agent', u'添加'),
             ('delete_agent', u'删除'),
+            ('add_general_agent', u'添加总代理'),
+            ('delete_general_agent', u'删除总代理'),
         ]
 
 
@@ -73,4 +75,4 @@ class Store(models.Model):
             ('add_store', u'添加'),
             ('delete_store', u'删除'),
             ('check_store', u'审核'),
-        ]
+        ]

+ 6 - 2
apps/agent/serializers.py

@@ -4,11 +4,12 @@ from rest_framework import serializers
 from django.conf import settings
 from apps.agent.models import GeneralAgent,Agent,Store
 from utils.booleancharfield import BooleanCharField
-
+from utils.exceptions import CustomError
 
 class GeneralAgentSerializer(serializers.ModelSerializer):
     create_user_text = serializers.CharField(source='create_user.name', read_only=True)
-
+    create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
+                                              read_only=True)
     class Meta:
         model = GeneralAgent
         fields = '__all__'
@@ -67,6 +68,9 @@ class StoreSerializer(serializers.ModelSerializer):
         fields = '__all__'
 
     def create(self, validated_data):
+        agent = self.context['request'].user.agent
+        if not agent:
+            raise CustomError('当前账号未绑定代理商,禁止添加门店!')
         validated_data['create_user'] = self.context['request'].user
         validated_data['agent'] = self.context['request'].user.agent
         validated_data['end_date'] = (datetime.datetime.now() + datetime.timedelta(days=365)).strftime('%Y-%m-%d')

+ 19 - 8
apps/agent/views.py

@@ -21,11 +21,13 @@ class GeneralAgentViewSet(CustomModelViewSet):
     queryset = GeneralAgent.objects.filter()
     serializer_class = GeneralAgentSerializer
 
+    @permission_required('agent.view_agent')
     def filter_queryset(self, queryset):
-        queryset = queryset.filter()
+        queryset = queryset.filter(Q(id=self.request.user.general_agent.id) | Q(create_user=self.request.user))
         f = GeneralAgentFilter(self.request.GET, queryset=queryset)
         return f.qs
 
+    @permission_required('agent.add_general_agent')
     def perform_create(self, serializer):
         super(GeneralAgentViewSet, self).perform_create(serializer)
         instance = serializer.instance
@@ -33,6 +35,7 @@ class GeneralAgentViewSet(CustomModelViewSet):
         BizLog.objects.addnew(self.request.user, BizLog.INSERT,
                               u'添加总代理[%s],id=%d' % (instance.name, instance.id), validated_data)
 
+    @permission_required('agent.delete_general_agent')
     def destroy(self, request, *args, **kwargs):
         instance = self.get_object()
         BizLog.objects.addnew(self.request.user, BizLog.DELETE,
@@ -48,7 +51,8 @@ class AgentViewSet(CustomModelViewSet):
 
     @permission_required('agent.view_agent')
     def filter_queryset(self, queryset):
-        queryset = queryset.filter()
+        queryset = queryset.filter(Q(general_agent__create_user=self.request.user)
+                                   | Q(create_user=self.request.user))
         f = AgentFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -68,6 +72,7 @@ class AgentViewSet(CustomModelViewSet):
         super(AgentViewSet, self).perform_destroy(instance)
         return response_ok()
 
+
 class StoreViewSet(CustomModelViewSet):
     permission_classes = [isLogin, ]
     queryset = Store.objects.filter()
@@ -75,7 +80,7 @@ class StoreViewSet(CustomModelViewSet):
 
     @permission_required('agent.view_store')
     def filter_queryset(self, queryset):
-        queryset = queryset.filter()
+        queryset = queryset.filter(id__in=self.request.user.get_manager_range())
         f = StoreFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -87,7 +92,6 @@ class StoreViewSet(CustomModelViewSet):
         BizLog.objects.addnew(self.request.user, BizLog.INSERT,
                               u'添加门店[%s],id=%d' % (instance.name, instance.id), validated_data)
 
-
     @permission_required('agent.delete_store')
     def destroy(self, request, *args, **kwargs):
         instance = self.get_object()
@@ -108,7 +112,7 @@ class StoreViewSet(CustomModelViewSet):
             if instance.status > settings.DEFAULT:
                 raise CustomError('当前企业已审核!')
 
-            instance.check_user = self.request.user
+            instance.check_user = request.user
             instance.status = status
             instance.check_time = timezone.now()
             instance.save()
@@ -120,19 +124,26 @@ class StoreViewSet(CustomModelViewSet):
             return response_error(str(e))
         return response_ok('审核完成!')
 
+
 class AgentDictView(APIView):
     permission_classes = [isLogin, ]
 
     def get(self, request):
-        general_agent_rows = GeneralAgent.objects.filter(Q(create_user=request.user) | Q(id=request.user.general_agent_id))
+        general_agent_rows = GeneralAgent.objects.filter(
+            Q(create_user=request.user) | Q(id=request.user.general_agent_id))
         general_agents = GeneralAgentComboboxSerializer(general_agent_rows, many=True).data
+        agents = stores = []
         for general_agent_row in general_agent_rows:
-            rows = Agent.objects.filter(general_agent=general_agent_row)
+            rows = Agent.objects.filter(general_agent=general_agent_row,)
+            if request.user.agent:
+                rows = rows.filter(id=request.user.agent.id)
             agents = AgentComboboxSerializer(rows, many=True).data
             stores = []
 
             for row in rows:
-                store = Store.objects.filter(agent=row, enable=True, end_date__gte=timezone.now().date())
+                store = Store.objects.filter(agent=row, enable=True,check_user__isnull=False, end_date__gte=timezone.now().date())
+                if request.user.store:
+                    store = store.filter(id=request.user.store.id)
                 store_serializer = StoreComboboxSerializer(store, many=True).data
                 stores.extend(store_serializer)
         return response_ok({

+ 15 - 4
apps/customer/views.py

@@ -156,7 +156,10 @@ class NewCustomerViewSet(CustomModelViewSet):
     serializer_class = NewCustomerSerializer
 
     def filter_queryset(self, queryset):
-        queryset = queryset.filter()
+        queryset = queryset.filter(
+            Q(store_id__in=self.request.user.get_manager_range()) |
+            Q(create_user=self.request.user)
+        )
         f = NewCustomerFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -185,7 +188,7 @@ class NewCustomerViewSet(CustomModelViewSet):
                 'store':request.user.store.id,
                 'create_user':request.user.id,
                 'description':description,
-                'instruction':instruction,
+                'instruction':instruction or None,
                 'is_entry':is_entry,
                 'is_giveup':is_giveup,
             }
@@ -208,7 +211,11 @@ class NewCustomerViewSet(CustomModelViewSet):
                 'next_time':next_time,
                 'end_time':timezone.now(),
                 'stage_progress':instance.stage_progress.id,
+                'status':NewCustomer.NORMAL,
             }
+            # TODO 如果客户已放弃,再次跟踪后自动改成正常客户,同时工单状态改成正常
+            if instance.status == NewCustomer.ABANDONED:
+                data['status'] = NewCustomer.NORMAL
             ser = self.serializer_class(instance, data=data, partial=True)
             if ser.is_valid(raise_exception=True):
                 ser.save()
@@ -306,11 +313,14 @@ class StageCountView(APIView):
 
 class ReviewViewSet(CustomModelViewSet):
     permission_classes = [isLogin]
-    queryset = Review.objects.filter()
+    queryset = Review.objects.filter(Q(instruction__isnull=False) | Q(is_giveup=True))
     serializer_class = ReviewSerializer
 
     def filter_queryset(self, queryset):
-        queryset = queryset.filter()
+        queryset = queryset.filter(
+            Q(store_id__in=self.request.user.get_manager_range()) |
+            Q(create_user=self.request.user)
+        )
         f = ReviewFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -336,6 +346,7 @@ class ReviewViewSet(CustomModelViewSet):
                 instance.check_time = timezone.now()
                 instance.save()
                 instance.customer.status = NewCustomer.ABANDONED
+                # TODO 如果客户已下单,把工单状态改成放弃
             instance.customer.next_time = next_time
             instance.customer.save()
         except CustomError as e:

+ 4 - 1
apps/order/models.py

@@ -5,6 +5,7 @@ from django.utils import timezone
 from apps.option.models import Option
 from apps.customer.models import NewCustomer
 from utils.format import strftime
+from apps.agent.models import Store
 
 class Order(models.Model):
     NORMAL = 1
@@ -26,6 +27,8 @@ class Order(models.Model):
     create_time = models.DateTimeField(verbose_name=u'下单时间', auto_now_add=True, editable=False)
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"订单状态", default=NORMAL)
     notes = models.CharField(max_length=500, verbose_name=u"备注", null=True)
+    store = models.ForeignKey(Store, verbose_name=u'门店', related_name='order_store',
+                              editable=False, on_delete=models.PROTECT)
 
     class Meta:
         db_table = "order"
@@ -68,4 +71,4 @@ class ProgressDetails(models.Model):
             'operation_time': strftime(self.operation_time),
         }
 
-        return dict
+        return dict

+ 6 - 1
apps/order/views.py

@@ -6,6 +6,7 @@ from utils.exceptions import CustomError
 from .serializers import OrderSerializer
 from .filters import OrderFilter
 from apps.log.models import BizLog
+from django.db.models import Q
 from utils import response_ok, response_error
 from utils.permission import isLogin, check_permission
 from apps.customer.models import NewCustomer
@@ -57,7 +58,11 @@ class OrderViewSet(CustomModelViewSet):
     serializer_class = OrderSerializer
 
     def filter_queryset(self, queryset):
-        queryset = queryset.filter()
+        queryset = queryset.filter(
+            Q(store_id__in=self.request.user.get_manager_range()) |
+            Q(service_user=self.request.user) |
+            Q(customer__create_user=self.request.user)
+        )
         f = OrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 

+ 8 - 8
uis/views/agent/index.html

@@ -68,7 +68,7 @@
                         <div style="width: 30%">
                             <div class="LAY-btns" style="margin-bottom: 10px;">
                                 <div style="float: left">
-                                    <button class="layui-btn" id="total_agent_add" data-permission="agent.add_agent"><i
+                                    <button class="layui-btn" id="total_agent_add" data-permission="agent.add_general_agent"><i
                                             class="layui-icon layui-icon-add-circle"></i>添加
                                     </button>
                                 </div>
@@ -115,12 +115,12 @@
 
                     <script type="text/html" id="total-agent-operate-bar">
                         <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-xs" lay-event="agent_edit" data-permission="agent.add_agent"
+                            <a class="layui-btn layui-btn-xs" lay-event="agent_edit" data-permission="agent.add_general_agent"
                             >修改</a>
                         </div>
                         <div class="layui-btn-group">
                             <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="agent_del"
-                               data-permission="agent.delete_agent"
+                               data-permission="agent.delete_general_agent"
                             >删除</a>
                         </div>
                     </script>
@@ -158,11 +158,11 @@
             elem: '#total_agent_datagrid'
             , url: '/agent/general_agent/'
             , cols: [[
-                {field: 'name', title: '总代理名称', event: 'showAgent', width: 200}
-                , {field: 'create_user_text', title: '添加人', width: 150}
-                , {field: 'create_time', title: '添加时间', width: 200}
+                {field: 'name', title: '总代理名称', event: 'showAgent', width: 150}
+                , {field: 'create_user_text', title: '添加人', width: 90}
+                , {field: 'create_time_f', title: '添加时间', width: 150}
                 , {field: 'notes', title: '备注', width: 200}
-                , {width: 150, align: 'center', fixed: 'right', toolbar: '#total-agent-operate-bar'}
+                , {width: 120, align: 'center', fixed: 'right', toolbar: '#total-agent-operate-bar'}
             ]]
             , page: true
             , height: 'full-108'
@@ -180,7 +180,7 @@
                 , {field: 'create_user_text', title: '添加人', width: 100}
                 , {field: 'create_time_f', title: '添加时间', width: 180}
                 , {field: 'notes', title: '备注', width: 200}
-                , {width: 150, align: 'center', fixed: 'right', toolbar: '#agent-operate-bar'}
+                , {width: 120, align: 'center', fixed: 'right', toolbar: '#agent-operate-bar'}
             ]]
             , page: true
             , height: 'full-108'

+ 4 - 0
uis/views/customer/add_report.html

@@ -121,6 +121,10 @@
         });
 
         form.on('submit(component-form-element)', function (data) {
+            if(data.field.is_giveup === "1" && !data.field.instruction){
+                layer.msg('请填写放弃原因!',{icon: 2})
+                return false
+            }
             admin.req({
                 url: '/customer/new_customer/'+customer_id+'/add_review/'
                 , data: data.field