浏览代码

撞单标记

wushaodong 4 年之前
父节点
当前提交
ea409ec299

+ 3 - 1
apps/customer/models.py

@@ -13,7 +13,7 @@ class ReportCustomer(models.Model):
     STATUS_CHOICES = (
     STATUS_CHOICES = (
         (NOT_CHECKED, '待审核'),
         (NOT_CHECKED, '待审核'),
         (CHECKED, '已分配'),
         (CHECKED, '已分配'),
-        (REPEAT_REPORT, '重复报备')
+        (REPEAT_REPORT, '撞单客户')
     )
     )
 
 
     name = models.CharField(max_length=20, verbose_name=u"姓名")
     name = models.CharField(max_length=20, verbose_name=u"姓名")
@@ -77,6 +77,8 @@ class NewCustomer(models.Model):
                                     editable=False, on_delete=models.PROTECT)
                                     editable=False, on_delete=models.PROTECT)
     create_time = models.DateTimeField(verbose_name=u'建档时间', auto_now_add=True, editable=False)
     create_time = models.DateTimeField(verbose_name=u'建档时间', auto_now_add=True, editable=False)
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"状态", default=NORMAL)
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"状态", default=NORMAL)
+    store = models.ForeignKey(Store, verbose_name=u'门店', related_name='customer_store',
+                              editable=False, on_delete=models.PROTECT)
 
 
     class Meta:
     class Meta:
         db_table = 'new_customer'
         db_table = 'new_customer'

+ 50 - 0
apps/customer/serializers.py

@@ -14,7 +14,57 @@ class ReportCustomerSerializer(serializers.ModelSerializer):
     source_text = serializers.CharField(source='source.name', read_only=True)
     source_text = serializers.CharField(source='source.name', read_only=True)
     create_user_text = serializers.CharField(source='create_user.name', 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)
     check_user_text = serializers.CharField(source='check_user.name', read_only=True)
+    create_time_f = TimeCharField(source='create_time', read_only=True)
     project_text = serializers.SerializerMethodField()
     project_text = serializers.SerializerMethodField()
+    hit_customer = serializers.SerializerMethodField()
+    hit_project = serializers.SerializerMethodField()
+    hit_track_user = serializers.SerializerMethodField()
+    hit_process = serializers.SerializerMethodField()
+    hit_last_stalk = serializers.SerializerMethodField()
+    hit_store = serializers.SerializerMethodField()
+
+    def get_hit_store(self, obj):
+        customer = NewCustomer.objects.filter(store__agent=obj.store.agent,tel=obj.tel).order_by('-id').first()
+        if customer:
+            return customer.store.name
+        else:
+            return ''
+
+    def get_hit_last_stalk(self, obj):
+        customer = NewCustomer.objects.filter(store__agent=obj.store.agent,tel=obj.tel).order_by('-id').first()
+        if customer:
+            return strfdate(customer.end_time)
+        else:
+            return ''
+
+    def get_hit_process(self, obj):
+        customer = NewCustomer.objects.filter(store__agent=obj.store.agent,tel=obj.tel).order_by('-id').first()
+        if customer:
+            return customer.stage_progress.name
+        else:
+            return ''
+
+    def get_hit_track_user(self, obj):
+        customer = NewCustomer.objects.filter(store__agent=obj.store.agent,tel=obj.tel).order_by('-id').first()
+        if customer:
+            return customer.track_user.name
+        else:
+            return ''
+
+    def get_hit_project(self, obj):
+        customer = NewCustomer.objects.filter(store__agent=obj.store.agent,tel=obj.tel).order_by('-id').first()
+        if customer:
+            project = customer.project.all()
+            return ','.join(project.values_list('name', flat=True))
+        else:
+            return ''
+
+    def get_hit_customer(self, obj):
+        customer = NewCustomer.objects.filter(store__agent=obj.store.agent,tel=obj.tel).order_by('-id').first()
+        if customer:
+            return customer.name
+        else:
+            return ''
 
 
     def get_project_text(self, obj):
     def get_project_text(self, obj):
         project = obj.project.all()
         project = obj.project.all()

+ 24 - 2
apps/customer/views.py

@@ -57,7 +57,7 @@ class ReportCustomerViewSet(CustomModelViewSet):
     @action(methods=['post'], detail=True)
     @action(methods=['post'], detail=True)
     def dispatch_customer(self, request, pk):
     def dispatch_customer(self, request, pk):
         check_permission(request, 'customer.check_report_customer')
         check_permission(request, 'customer.check_report_customer')
-        # 审核
+        # 报备客户审核 分配
         user_id = request.POST.get('user')
         user_id = request.POST.get('user')
         try:
         try:
             instance = ReportCustomer.objects.filter(id=pk).first()
             instance = ReportCustomer.objects.filter(id=pk).first()
@@ -79,7 +79,7 @@ class ReportCustomerViewSet(CustomModelViewSet):
 
 
             customer = NewCustomer.objects.create(report_customer=instance, potential_level=potential_level,
             customer = NewCustomer.objects.create(report_customer=instance, potential_level=potential_level,
                                        track_user_id=user_id, next_time=next_time, stage_progress=stage_progress,
                                        track_user_id=user_id, next_time=next_time, stage_progress=stage_progress,
-                                       create_user=instance.create_user,
+                                       create_user=instance.create_user,store=instance.store,
                                        name=instance.name,tel=instance.tel,village=instance.village,
                                        name=instance.name,tel=instance.tel,village=instance.village,
                                        address=instance.address,source=instance.source,notes=instance.notes,
                                        address=instance.address,source=instance.source,notes=instance.notes,
                                        )
                                        )
@@ -92,6 +92,28 @@ class ReportCustomerViewSet(CustomModelViewSet):
             return response_error(str(e))
             return response_error(str(e))
         return response_ok()
         return response_ok()
 
 
+    @action(methods=['post'], detail=True)
+    def sign_hit(self, request, pk):
+        check_permission(request, 'customer.check_report_customer')
+        # 报备客户标记撞单
+        try:
+            instance = ReportCustomer.objects.filter(id=pk).first()
+            if not instance:
+                raise CustomError('当前客户报备信息有误,请刷新重试!')
+            instance.check_user = self.request.user
+
+            instance.report_status = ReportCustomer.REPEAT_REPORT
+            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()
+
 
 
 class ReportCustomerDictView(APIView):
 class ReportCustomerDictView(APIView):
     permission_classes = [isLogin]
     permission_classes = [isLogin]

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

@@ -222,7 +222,7 @@
                         //取消
                         //取消
                         layer.close(index);//关闭当前按钮
                         layer.close(index);//关闭当前按钮
                     },
                     },
-                    content: 'detail.html'
+                    content: 'detail.html?customer='+data.id
                 });
                 });
             } else if (obj.event === 'add_review') {
             } else if (obj.event === 'add_review') {
                 //添加跟踪报告
                 //添加跟踪报告

+ 1 - 1
uis/views/index.html

@@ -95,7 +95,7 @@
                         </a>
                         </a>
                         <dl class="layui-nav-child">
                         <dl class="layui-nav-child">
                             <dd data-name="nav" data-permission="customer.view_report_customer">
                             <dd data-name="nav" data-permission="customer.view_report_customer">
-                                <a lay-href="new_customer/index.html">客户报备</a>
+                                <a lay-href="report_customer/index.html">客户报备</a>
                             </dd>
                             </dd>
                             <dd data-name="nav" data-permission="customer.check_report_customer">
                             <dd data-name="nav" data-permission="customer.check_report_customer">
                                 <a lay-href="report_check/index.html">报备审核</a>
                                 <a lay-href="report_check/index.html">报备审核</a>

+ 6 - 1
uis/views/report_check/divide.html

@@ -37,6 +37,7 @@
                                     <option value="">请选择人员</option>
                                     <option value="">请选择人员</option>
                                 </select>
                                 </select>
                             </div>
                             </div>
+                            <div id="tips" class="layui-hide"><font color="red">请注意:该客户是撞单客户!</font></div>
                         </div>
                         </div>
                         <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element"
                         <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element"
                                 style="display: none">保存
                                 style="display: none">保存
@@ -74,13 +75,17 @@
         });
         });
 
 
         var id = layui.view.getParameterByName('id');
         var id = layui.view.getParameterByName('id');
+        var hit_customer = layui.view.getParameterByName('hit_customer');
+        if (hit_customer) {
+            $('#tips').removeClass('layui-hide')
+        }
         form.on('submit(component-form-element)', function (data) {
         form.on('submit(component-form-element)', function (data) {
             admin.req({
             admin.req({
                 url: '/customer/report_customer/' + id + '/dispatch_customer/'
                 url: '/customer/report_customer/' + id + '/dispatch_customer/'
                 , data: data.field
                 , data: data.field
                 , type: 'post'
                 , type: 'post'
                 , done: function (res) {
                 , done: function (res) {
-                     parent.layui.onSubmitChild();
+                    parent.layui.onSubmitChild();
                 }
                 }
             });
             });
             return false;
             return false;

+ 26 - 33
uis/views/report_check/index.html

@@ -83,13 +83,9 @@
                             >分配</a>
                             >分配</a>
                         </div>
                         </div>
                         <div class="layui-btn-group">
                         <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="sign_repeat"
+                            <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="sign_repeat"
                             >标记撞单</a>
                             >标记撞单</a>
                         </div>
                         </div>
-                        <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-default layui-btn-xs" lay-event="repeat_report"
-                            >撞单跟踪记录</a>
-                        </div>
                     </script>
                     </script>
                 </div>
                 </div>
             </div>
             </div>
@@ -116,33 +112,20 @@
                 , {field: 'gender_text', title: "性别", width: 70}
                 , {field: 'gender_text', title: "性别", width: 70}
                 , {field: 'tel', title: '电话', width: 120}
                 , {field: 'tel', title: '电话', width: 120}
                 , {field: 'project_text', title: '项目', width: 200}
                 , {field: 'project_text', title: '项目', width: 200}
-                , {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: 240, align: 'center', fixed: 'right', toolbar: '#report_check-operate-bar'}
+                , {field: 'create_time_f', title: '报备时间', width: 160}
+                , {field: 'create_user_text', title: '报备人', width: 120}
+                , {field: 'hit_customer', title: '撞单客户', width: 100}
+                , {field: 'hit_project', title: '撞单项目', width: 100}
+                , {field: 'hit_track_user', title: '撞单跟踪人', width: 100}
+                , {field: 'hit_store', title: '撞单门店', width: 100}
+                , {field: 'hit_process', title: '撞单进度', width: 100}
+                , {field: 'hit_last_stalk', title: '最后跟踪时间', width: 150}
+                , {width: 150, align: 'center', fixed: 'right', toolbar: '#report_check-operate-bar'}
             ]]
             ]]
             , page: true
             , page: true
             , height: 'full-108'
             , height: 'full-108'
         });
         });
 
 
-        // admin.req({
-        //     url: '/report_check/dict/',
-        //     done: function (res) {
-        //         var data = res.data.source;
-        //         var source_node = $('#id_source');
-        //         for (var i in data) {
-        //             var pid = data[i].id;
-        //             var name = data[i].name;
-        //             source_node.append("<option value='" + pid + "'>" + name + "</option>");
-        //         }
-        //         form.render('select');
-        //     }
-        // });
-
         //监听工具条
         //监听工具条
         table.on('tool(report_check-operate)', function (obj) {
         table.on('tool(report_check-operate)', function (obj) {
             var data = obj.data;
             var data = obj.data;
@@ -163,14 +146,24 @@
                     btn2: function (index, layero) {
                     btn2: function (index, layero) {
                         layer.close(index);//关闭当前按钮
                         layer.close(index);//关闭当前按钮
                     },
                     },
-                    content: 'divide.html?id=' + data.id
+                    content: 'divide.html?id=' + data.id + '&hit_customer=' + data.hit_customer
                 });
                 });
             }
             }
             else if (obj.event === 'sign_repeat') {
             else if (obj.event === 'sign_repeat') {
-
-            }
-            else if (obj.event === 'repeat_report') {
-
+                layer.confirm('确定要标记为撞单客户吗?', function (index) {
+                    layer.close(index);
+                    layui.admin.req({
+                        notice: true
+                        , url: '/customer/report_customer/' + data.id + '/sign_hit/'
+                        , type: 'post'
+                        , done: function (res) {
+                            if (res.code === 0) {
+                                layer.msg("标记成功!", {icon: 1})
+                            }
+                            table.reload('report_check_datagrid', {});
+                        }
+                    });
+                });
             }
             }
         });
         });
 
 
@@ -189,7 +182,7 @@
             if (checkStatus.data.length === 0) {
             if (checkStatus.data.length === 0) {
                 layer.msg('请至少选择一条记录');
                 layer.msg('请至少选择一条记录');
                 return
                 return
-            };
+            }
             let divide_id = checkStatus.data.map(item => {
             let divide_id = checkStatus.data.map(item => {
                 return item.id
                 return item.id
             }).join(",");
             }).join(",");

+ 0 - 0
uis/views/new_customer/edit.html → uis/views/report_customer/edit.html


+ 0 - 0
uis/views/new_customer/index.html → uis/views/report_customer/index.html