wushaodong пре 4 година
родитељ
комит
19431cf66b

+ 2 - 3
apps/account/consts.py

@@ -7,6 +7,7 @@ CONTENT_TYPE_SORTING = (
     'account-user',  # 用户管理
     'account-managestoreuser',  # 权限管理
     'option-option',  # 自定义项
+    'customer-reportcustomer', # 报备客户
 
 )
 
@@ -22,9 +23,7 @@ MENU_TO_MODEL = (
     ),
     (
         u'潜客作业', (
-            'device-device',
-            'type_model-devicetype',
-            'device-godownentry',
+             'customer-reportcustomer',
         )
     ),
     (

+ 2 - 3
apps/account/views.py

@@ -83,7 +83,7 @@ class EmployeeViewSet(CustomModelViewSet):
                               u'删除账号[%s],id=%d' % (instance.username, instance.id))
         super(EmployeeViewSet, self).perform_destroy(instance)
 
-    @permission_required('account.check_user')
+    # @permission_required('account.check_user')
     @action(methods=['post'], detail=True)
     def join(self, request, pk):
         try:
@@ -184,10 +184,9 @@ class PermissionsListView(APIView):
 class PermissionDictView(APIView):
     permission_classes = [isLogin, ]
 
-    @permission_required('account.manager_store')
+    @permission_required('account.add_user')
     def get(self, request):
         rows = Group.objects.filter()
-        print()
         if not request.user.is_superuser:
             groups = request.user.groups.all()
             rows =rows.filter(id__in=[g.id for g in groups])

+ 1 - 1
apps/agent/views.py

@@ -86,7 +86,7 @@ class StoreViewSet(CustomModelViewSet):
             instance.status = status
             instance.check_time = timezone.now()
             instance.save()
-            BizLog.objects.addnew(None, request.user, BizLog.INSERT,
+            BizLog.objects.addnew(request.user, BizLog.INSERT,
                                   u'审核门店[%s]状态为[%s],id=%d' % (instance.name, status, instance.id))
         except CustomError as e:
             return response_error(e.get_error_msg())

+ 8 - 9
apps/customer/models.py

@@ -1,11 +1,9 @@
 # coding=utf-8
 from django.db import models
 from django.conf import settings
-from django.utils import timezone
-
 from utils.exceptions import CustomError
 from apps.option.models import Option
-
+from apps.agent.models import Store
 
 class ReportCustomer(models.Model):
     NOT_CHECKED = 0
@@ -13,7 +11,7 @@ class ReportCustomer(models.Model):
     REPEAT_REPORT = 2
     STATUS_CHOICES = (
         (NOT_CHECKED, '待审核'),
-        (CHECKED, '已审核'),
+        (CHECKED, '已分配'),
         (REPEAT_REPORT, '重复报备')
     )
 
@@ -23,18 +21,19 @@ class ReportCustomer(models.Model):
                                               default=settings.MALE)
     village = models.CharField(max_length=200, verbose_name=u'小区')
     address = models.CharField(max_length=200, verbose_name=u'地址')
-    source = models.ForeignKey(Option, verbose_name=u'来源', related_name='customer_source', on_delete=models.PROTECT)
-    project = models.ManyToManyField(Option, verbose_name=u'项目', related_name='customer_category', editable=False,
+    source = models.ForeignKey(Option, verbose_name=u'来源', related_name='report_customer_source', on_delete=models.PROTECT)
+    project = models.ManyToManyField(Option, verbose_name=u'项目', related_name='report_customer_category', editable=False,
                                      null=True,blank=True)
     notes = models.CharField(max_length=500, verbose_name=u"备注", null=True)
     report_status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'报备状态', default=NOT_CHECKED)
-    check_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'审核人', related_name='customer_check_user',
+    check_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'审核人', related_name='report_customer_check_user',
                                    on_delete=models.PROTECT, null=True)
     check_time = models.DateTimeField(verbose_name=u'审核时间', null=True)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'添加人', related_name='customer_create_user',
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'添加人', related_name='report_customer_create_user',
                                     editable=False, on_delete=models.PROTECT)
     create_time = models.DateTimeField(verbose_name=u'添加时间', auto_now_add=True, editable=False)
-
+    store = models.ForeignKey(Store, verbose_name=u'门店', related_name='report_customer_store',
+                                    editable=False, on_delete=models.PROTECT)
 
     class Meta:
         db_table = 'report_customer'

+ 7 - 3
apps/customer/serializers.py

@@ -9,9 +9,9 @@ from .models import ReportCustomer
 class ReportCustomerSerializer(serializers.ModelSerializer):
     gender_text = serializers.CharField(source='get_gender_display', read_only=True)
     report_status_text = serializers.CharField(source='get_report_status_display', read_only=True)
-    check_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
     source_text = serializers.CharField(source='source.name', read_only=True)
-    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    create_user_text = serializers.CharField(source='create_user.name', read_only=True)
+    check_user_text = serializers.CharField(source='check_user.name', read_only=True)
     project_text = serializers.SerializerMethodField()
 
     def get_project_text(self, obj):
@@ -24,12 +24,16 @@ class ReportCustomerSerializer(serializers.ModelSerializer):
 
     def create(self, validated_data):
         validated_data['create_user'] = self.context['request'].user
+        store = self.context['request'].user.store
+        if not store:
+            raise CustomError('当前账号未绑定门店,禁止报备客户!')
+
         instance = super(ReportCustomerSerializer, self).create(validated_data)
         projects = self.initial_data['project']
         if projects:
             projects = json.loads(projects)
         else:
-            raise CustomError(u'请选择项目')
+            raise CustomError(u'请选择项目')
 
         for project in projects:
             instance.project.add(project)

+ 3 - 3
apps/customer/urls.py

@@ -2,14 +2,14 @@
 from django.conf.urls import url, include
 from rest_framework.routers import SimpleRouter
 
-from .views import ReportCustomerViewSet,ReportCustomerDictView
-
+from .views import *
 
 urlpatterns = [
     url(r'^dict/$', ReportCustomerDictView.as_view()),
+    url(r'^get_user/$', UserDictView.as_view()),
 
 ]
 
 router = SimpleRouter()
 router.register(r'report_customer', ReportCustomerViewSet)
-urlpatterns += router.urls
+urlpatterns += router.urls

+ 30 - 24
apps/customer/views.py

@@ -13,7 +13,8 @@ from apps.option.serializers import OptionComboboxSerializer
 from .models import ReportCustomer
 from .serializers import ReportCustomerSerializer
 from .filters import ReportCustomerFilter
-
+from django.contrib.auth import get_user_model
+User = get_user_model()
 
 class ReportCustomerViewSet(CustomModelViewSet):
     permission_classes = [isLogin]
@@ -22,7 +23,9 @@ class ReportCustomerViewSet(CustomModelViewSet):
 
     @permission_required('customer.view_report_customer')
     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 = ReportCustomerFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -48,41 +51,33 @@ class ReportCustomerViewSet(CustomModelViewSet):
                               u'删除客户报备[%s],id=%d' % (instance.name, instance.id))
         super(ReportCustomerViewSet, self).perform_destroy(instance)
 
-    @permission_required('customer.check_report_customer')
-    @action(methods=['post'], detail=False)
-    def check(self, request, pk):
+    # @permission_required('customer.check_report_customer')
+    @action(methods=['post'], detail=True)
+    def dispatch_customer(self, request, pk):
         # 审核
-        report_status = request.POST.get('report_status')
+        # TODO 创建潜客跟踪表
+        user = request.POST.get('user')
         try:
             instance = ReportCustomer.objects.filter(id=pk).first()
             if not instance:
-                raise CustomError('当前客户报备信息有误!')
-            if report_status == ReportCustomer.REPEAT_REPORT:
-                raise CustomError('当前客户报备状态为重复报备!')
-            if instance.report_status == ReportCustomer.CHECKED and report_status == ReportCustomer.CHECKED:
-                # 撞单
-                instance.check_user = self.request.user
-                instance.report_status = ReportCustomer.REPEAT_REPORT
-                instance.check_time = timezone.now()
-                instance.save()
-            if instance.report_status == ReportCustomer.NOT_CHECKED and report_status == ReportCustomer.CHECKED:
-                instance.check_user = self.request.user
-                instance.report_status = ReportCustomer.CHECKED
-                instance.check_time = timezone.now()
-                instance.save()
-            BizLog.objects.addnew(None, request.user, BizLog.INSERT,
-                                  u'审核客户报备[%s]状态为[%s],id=%d' % (instance.name, report_status, instance.id))
+                raise CustomError('当前客户报备信息有误,请刷新重试!')
+            instance.check_user = self.request.user
+            instance.report_status = ReportCustomer.CHECKED
+            instance.check_time = timezone.now()
+            instance.save()
+            BizLog.objects.addnew(request.user, BizLog.INSERT,
+                                  u'分配客户报备[%s],id=%d' % (instance.name,  instance.id))
         except CustomError as e:
             return response_error(e.get_error_msg())
         except Exception as e:
             return response_error(str(e))
-        return response_ok('审核完成!')
+        return response_ok()
 
 class ReportCustomerDictView(APIView):
     permission_classes = [isLogin]
 
     def get(self, request):
-        scouce = Option.objects.filter(type=Option.CUSTOMER_SOURCE , enable=True)
+        scouce = Option.objects.filter(type=Option.CUSTOMER_SOURCE, enable=True)
         project = Option.objects.filter(type=Option.CATEGORY, enable=True)
         serializer_scouce = OptionComboboxSerializer(scouce, many=True)
         serializer_project = OptionComboboxSerializer(project, many=True)
@@ -90,3 +85,14 @@ class ReportCustomerDictView(APIView):
             'source': serializer_scouce.data,
             'project': serializer_project.data,
         })
+
+class UserDictView(APIView):
+    permission_classes = [isLogin]
+
+    def get(self, request):
+        store = request.user.store
+        if not store:
+            return response_error('当前账号未绑定门店,禁止分配客户!')
+        users = User.objects.filter(store=store).values('id', 'name')
+        users = [{'value': user['id'], 'lable': user['name']} for user in users]
+        return response_ok(users)

+ 3 - 4
uis/views/customer/index.html

@@ -105,11 +105,10 @@
         base: '../../../layuiadmin/' //静态资源所在路径
     }).extend({
         index: 'lib/index' //主入口模块
-    }).use(['index', 'table', 'form', 'upload'], function () {
+    }).use(['index', 'table', 'form',], function () {
         var $ = layui.$;
         var table = layui.table
             , form = layui.form
-            , upload = layui.upload
             , admin = layui.admin;
 
         table.render({
@@ -125,8 +124,8 @@
                 , {field: 'project_text', title: '项目', width: 200}
                 , {field: 'notes', title: '备注', width: 200}
                 , {field: 'report_status_text', title: '报备状态', width: 100}
-                , {field: 'check_user', title: '审核人', width: 100}
-                , {field: 'check_time', title: '审核时间', width: 150}
+                , {field: 'check_user_text', title: '审核人', width: 100}
+                , {field: 'check_time', title: '审核时间', width: 160}
                 , {width: 130, align: 'center', fixed: 'right', toolbar: '#customer-operate-bar'}
             ]]
             , page: true

+ 1 - 3
uis/views/employee/index.html

@@ -169,8 +169,7 @@
                 layer.confirm('确定要入职该员工吗?', function (index) {
                     layer.close(index);
                     layui.admin.req({
-                        notice: true
-                        , url: '/account/employee/' + data.id + '/join/'
+                        url: '/account/employee/' + data.id + '/join/'
                         , type: 'post'
                         , done: function (res) {
                             table.reload('datagrid', {});
@@ -208,7 +207,6 @@
                         layer.close(index);
                         table.reload('datagrid', {});
                     };
-                    layui.submitChild();
                 },
                 btn2: function (index, layero) {
                     layer.close(index);//关闭当前按钮

+ 1 - 1
uis/views/option/edit.html

@@ -148,7 +148,7 @@
                 , data: data.field
                 , type: type
                 , done: function (res) {
-                    parent.layui.onSubmitChild(res.data);
+                    parent.layui.onSubmitChild();
                 }
             });
 

+ 1 - 1
uis/views/option/index.html

@@ -174,7 +174,7 @@
                 area: ['50%', '70%'],
                 btn: ['保存', '取消'],
                 yes: function (index, dom) {
-                    layui.onSubmitChild = function (data) {
+                    layui.onSubmitChild = function () {
                         layer.close(index);
                         table.reload('datagrid', {});
                     };

+ 24 - 66
uis/views/report_check/divide.html

@@ -9,7 +9,6 @@
           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>
         .input {
             border-radius: 2px;
@@ -34,11 +33,8 @@
                         <div>
                             <label class="layui-form-label"><font color='red' size="4">*</font>选择人员:</label>
                             <div class="layui-input-block">
-                                <select lay-verify="required" name="source" id="id_source">
+                                <select lay-verify="required" name="user" id="id_user">
                                     <option value="">请选择人员</option>
-                                    <option value="1">小红</option>
-                                    <option value="2">小芳</option>
-                                    <option value="3">小绿</option>
                                 </select>
                             </div>
                         </div>
@@ -56,75 +52,37 @@
     layui.link('../../../layuiadmin/style/autocomplete.css');
     layui.config({
         base: '../../../layuiadmin/' //静态资源所在路径
-        , autocomplete: 'autocomplete'
     }).extend({
         index: 'lib/index',
-        formSelects: 'formSelects-v4'
-    }).use(['index', 'form', 'autocomplete', 'formSelects'], function () {
+    }).use(['index', 'form',], function () {
         var $ = layui.$
             , admin = layui.admin
-            , formSelects = layui.formSelects
             , form = layui.form
-        var id = layui.view.getParameterByName('id');
-        console.log(id, "oppppp");
-
-        // admin.req({
-        //     url: '/customer/dict/',
-        //     done: function (res) {
-        //         var data_source = res.data.source;
-        //         var source_node = $('#id_source');
-        //         for (var i in data_source) {
-        //             var pid = data_source[i].id;
-        //             var name = data_source[i].name;
-        //             source_node.append("<option value='" + pid + "'>" + name + "</option>");
-        //         }
-        //         var data_project = res.data.project;
-        //         let tempData = [];
-        //         if(data_project && data_project.length > 0){
-        //             tempData =  data_project.map(item=>{
-        //                 if(id && editdata['project']){
-        //                    if(typeof editdata['project'] === 'number'){
-        //                        editdata['project'] = [editdata['project']]
-        //                    }
-        //                    editdata['project'].forEach(item1=>{
-        //                        if(item.id === item1){
-        //                            item.selected = 'selected'
-        //                        }else{
-        //                            item.selected = ''
-        //                        }
-        //                    })
-        //                 }
-        //                 return {value: item.id, name: item.name, selected: item.selected }
-        //             });
-        //         }
-        //         formSelects.data('selectProject', 'local', {
-        //             arr: tempData
-        //         });
-        //         form.val("component-form-element", editdata);
-        //     }
-        // });
 
-        //form.render(null, 'component-form-element');
+        admin.req({
+            url: '/customer/get_user/',
+            done: function (res) {
+                var data_user = res.data;
+                var user_node = $('#id_user');
+                for (var i in data_user) {
+                    var pid = data_user[i].value;
+                    var name = data_user[i].lable;
+                    user_node.append("<option value='" + pid + "'>" + name + "</option>");
+                }
+                form.render()
+            }
+        });
 
+        var id = layui.view.getParameterByName('id');
         form.on('submit(component-form-element)', function (data) {
-            // if (id) {
-            //     var url = '/customer/report_customer/' + id + '/';
-            //     var type = 'put';
-            // } else {
-            //     url = '/customer/report_customer/';
-            //     type = 'post'
-            // }
-            var submitData = data.field;
-            // admin.req({
-            //     url: url
-            //     , data: data.field
-            //     , type: type
-            //     , done: function (res) {
-            parent.layui.onSubmitChild();
-            //     }
-            // });
-
-
+            admin.req({
+                url: '/customer/report_customer/' + id + '/dispatch_customer/'
+                , data: data.field
+                , type: 'post'
+                , done: function (res) {
+                     parent.layui.onSubmitChild();
+                }
+            });
             return false;
         });
 

+ 64 - 36
uis/views/report_check/index.html

@@ -57,11 +57,7 @@
             <div class="layui-row layui-col-space15">
                 <div class="layui-col-md12">
                     <div class="LAY-btns" style="margin-bottom: 10px;">
-                        <div style="float: left">
-                            <button class="layui-btn" id="report_check_divide"><i
-                                    class="layui-icon layui-icon-auz"></i>分配客户
-                            </button>
-                        </div>
+
                         <form class="layui-form" lay-filter="query-form-element1">
                             <div class="seach_items">
                                 <button class="layui-btn" lay-submit lay-filter="query-form-element1"><i
@@ -69,9 +65,13 @@
                                 </button>
                             </div>
                             <div class="seach_items">
-                                <input type="text" name="name" autocomplete="off" class="layui-input"
+                                <input type="text" name="tel" autocomplete="off" class="layui-input"
                                        placeholder="姓名"/>
                             </div>
+                            <div class="seach_items">
+                                <input type="text" name="name" autocomplete="off" class="layui-input"
+                                       placeholder="电话"/>
+                            </div>
                         </form>
                         <div style="clear: both;"></div>
                     </div>
@@ -79,8 +79,16 @@
 
                     <script type="text/html" id="report_check-operate-bar">
                         <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-default layui-btn-xs" lay-event="report_check_search"
-                            >查看跟踪记录</a>
+                            <a class="layui-btn layui-btn-default layui-btn-xs" lay-event="dispatch"
+                            >分配</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="sign_repeat"
+                            >标记撞单</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-default layui-btn-xs" lay-event="repeat_report"
+                            >撞单跟踪记录</a>
                         </div>
                     </script>
                 </div>
@@ -94,30 +102,28 @@
         base: '../../../layuiadmin/' //静态资源所在路径
     }).extend({
         index: 'lib/index' //主入口模块
-    }).use(['index', 'table', 'form', 'upload'], function () {
+    }).use(['index', 'table', 'form',], function () {
         var $ = layui.$;
         var table = layui.table
             , form = layui.form
-            , upload = layui.upload
             , admin = layui.admin;
 
         table.render({
             elem: '#report_check_datagrid'
             , url: '/customer/report_customer/?report_status=0'
             , cols: [[
-                {type:'checkbox'}
-                , {field: 'name', title: '姓名', width: 200}
+                {field: 'name', title: '姓名', width: 120}
                 , {field: 'gender_text', title: "性别", width: 70}
-                , {field: 'tel', title: '电话', width: 150}
+                , {field: 'tel', title: '电话', width: 120}
                 , {field: 'project_text', title: '项目', width: 200}
-                , {field: 'report_time', title: '报备时间', width: 150}
-                , {field: 'report_user', title: '报备人', width: 100}
+                , {field: 'create_time', title: '报备时间', width: 150}
+                , {field: 'create_user_text', title: '报备人', width: 100}
                 , {field: 'hitBill_customer', title: '撞单客户', width: 100}
                 , {field: 'hitBill_project_text', title: '撞单项目', width: 100}
                 , {field: 'stalk_user', title: '撞单跟踪人', width: 100}
                 , {field: 'stalk_process', title: '撞单进度', width: 100}
                 , {field: 'last_stalk', title: '最后跟踪', width: 200}
-                , {width: 120, align: 'center', fixed: 'right', toolbar: '#report_check-operate-bar'}
+                , {width: 240, align: 'center', fixed: 'right', toolbar: '#report_check-operate-bar'}
             ]]
             , page: true
             , height: 'full-108'
@@ -137,14 +143,33 @@
         //     }
         // });
 
-        $('#btn_download').on('click', function () {
-            layui.view.download("/static/xls/设备信息导入模板.xlsx");
-        });
         //监听工具条
         table.on('tool(report_check-operate)', function (obj) {
             var data = obj.data;
             //查看跟踪记录
-            if (obj.event === 'report_check_search') {
+            if (obj.event === 'dispatch') {
+                layer.open({
+                    type: 2,
+                    title: '分配客户',
+                    area: ['30%', '40%'],
+                    btn: ['分配', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitChild = function (data) {
+                            layer.close(index);
+                            table.reload('report_check_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'divide.html?id=' + data.id
+                });
+            }
+            else if (obj.event === 'sign_repeat') {
+
+            }
+            else if (obj.event === 'repeat_report') {
 
             }
         });
@@ -161,11 +186,14 @@
 
         $('#report_check_divide').on('click', function () {
             var checkStatus = table.checkStatus('report_check_datagrid');
-            if(checkStatus.data.length === 0){
+            if (checkStatus.data.length === 0) {
                 layer.msg('请至少选择一条记录');
                 return
             };
-            let divide_id = checkStatus.data.map(item=>{ return item.id }).join(",");
+            let divide_id = checkStatus.data.map(item => {
+                return item.id
+            }).join(",");
+
             layer.open({
                 type: 2,
                 title: '分配客户',
@@ -175,22 +203,22 @@
                     layui.onSubmitChild = function (data) {
                         let customer = '华北';
                         layer.close(index);
-                        if(!data){
+                        if (!data) {
                             layer.open({
-                            type: 1,
-                            title: '操作',
-                            area: ['300px', '220px'],
-                            btn: ['标记为撞单客户', '重新分配'],
-                            yes: function (index, dom) {
-                                layui.onSubmitChild = function (data) {
+                                type: 1,
+                                title: '操作',
+                                area: ['300px', '220px'],
+                                btn: ['标记为撞单客户', '重新分配'],
+                                yes: function (index, dom) {
+                                    layui.onSubmitChild = function (data) {
+                                        layer.close(index);
+                                    };
+                                },
+                                btn2: function (index, layero) {
                                     layer.close(index);
-                                };
-                            },
-                            btn2: function (index, layero) {
-                                layer.close(index);
-                            },
-                            content: '<p style="text-align: center; padding: 15px 0">和' + customer + '客户撞单,请选择后续操作。<p>'
-                        });
+                                },
+                                content: '<p style="text-align: center; padding: 15px 0">和' + customer + '客户撞单,请选择后续操作。<p>'
+                            });
                         }
                         table.reload('report_check_datagrid', {});
                     };