Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

wushaodong 4 yıl önce
ebeveyn
işleme
fef695a608

+ 9 - 0
apps/customer/filters.py

@@ -19,3 +19,12 @@ class NewCustomerFilter(django_filters.FilterSet):
     class Meta:
         model = NewCustomer
         fields = '__all__'
+
+
+class ReviewFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='customer__name', lookup_expr='icontains')
+    tel = django_filters.CharFilter(field_name='customer__tel', lookup_expr='icontains')
+
+    class Meta:
+        model = NewCustomer
+        fields = '__all__'

+ 2 - 0
apps/customer/models.py

@@ -113,6 +113,8 @@ class Review(models.Model):
     check_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='review_ref_checkuser', verbose_name=u"审核人",
                                    editable=False, blank=True, null=True, on_delete=models.PROTECT)
     check_time = models.DateTimeField(verbose_name=u"审核时间", editable=False, blank=True, null=True)
+    next_time = models.DateTimeField(verbose_name=u"下次回访时间", editable=False, blank=True, null=True)
+
 
     class Meta:
         db_table = "customer_review"

+ 13 - 3
apps/customer/serializers.py

@@ -115,14 +115,24 @@ class NewCustomerSerializer(serializers.ModelSerializer):
 
 
 class ReviewSerializer(serializers.ModelSerializer):
-
     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_status_text = serializers.CharField(source='get_check_status_display', read_only=True)
-    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
-    check_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    create_time_f = TimeCharField(source='create_time', read_only=True)
+    check_time_f = TimeCharField(source='check_time', read_only=True)
+    next_time_f = TimeCharField(source='next_time', read_only=True)
     is_giveup_text = BooleanCharField(source='is_giveup', read_only=True)
 
+    name = serializers.CharField(source='customer.report_customer.name', read_only=True)
+    tel = serializers.CharField(source='customer.report_customer.tel', read_only=True)
+    village = serializers.CharField(source='customer.report_customer.village', read_only=True)
+    address = serializers.CharField(source='customer.report_customer.address', read_only=True)
+    project_text = serializers.SerializerMethodField()
+
+    def get_project_text(self, obj):
+        project = obj.customer.report_customer.project.all()
+        return ','.join(project.values_list('name', flat=True))
+
     class Meta:
         model = Review
         fields = '__all__'

+ 1 - 0
apps/customer/urls.py

@@ -14,4 +14,5 @@ urlpatterns = [
 router = SimpleRouter()
 router.register(r'report_customer', ReportCustomerViewSet)
 router.register(r'new_customer', NewCustomerViewSet)
+router.register(r'review', ReviewViewSet)
 urlpatterns += router.urls

+ 49 - 3
apps/customer/views.py

@@ -13,9 +13,9 @@ from utils.exceptions import CustomError
 from apps.log.models import BizLog
 from apps.option.models import Option
 from apps.option.serializers import OptionComboboxSerializer
-from .models import ReportCustomer,NewCustomer
+from .models import ReportCustomer,NewCustomer,Review
 from .serializers import ReportCustomerSerializer,NewCustomerSerializer, ReviewSerializer
-from .filters import ReportCustomerFilter,NewCustomerFilter
+from .filters import ReportCustomerFilter,NewCustomerFilter,ReviewFilter
 from django.contrib.auth import get_user_model
 User = get_user_model()
 
@@ -149,7 +149,7 @@ class NewCustomerViewSet(CustomModelViewSet):
         next_time = request.POST.get('next_time')
 
         try:
-            instance =NewCustomer.objects.filter(id=pk).first()
+            instance = NewCustomer.objects.filter(id=pk).first()
             if not instance:
                 raise CustomError('当前客户信息有误,请刷新重试!')
             data = {
@@ -215,3 +215,49 @@ class StageCountView(APIView):
             }
             data.append(stage_count)
         return response_ok(data)
+
+class ReviewViewSet(CustomModelViewSet):
+    permission_classes = []
+    queryset = Review.objects.filter()
+    serializer_class = ReviewSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter()
+        f = ReviewFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    @action(methods=['post'], detail=True)
+    def track_review(self, request, pk):
+        # 跟踪审核
+        check_status = request.POST.get('check_status')
+        check_comment = request.POST.get('check_comment')
+        next_time = request.POST.get('next_time')
+        try:
+            instance = Review.objects.filter(id=pk).first()
+            if int(check_status) == Review.KEEPUP:
+                instance.check_user = request.user
+                instance.check_status = check_status
+                instance.check_comment = check_comment
+                instance.next_time = next_time
+                instance.check_time = timezone.now()
+                instance.save()
+            if int(check_status) == Review.ABANDON:
+                instance.check_user = request.user
+                instance.check_status = check_status
+                instance.check_comment = check_comment
+                instance.check_time = timezone.now()
+                instance.is_giveup = True
+                instance.save()
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            return response_error(str(e))
+        return response_ok()
+
+
+
+
+
+
+
+

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

@@ -35,6 +35,7 @@
                             <div class="layui-input-block">
                                 <select lay-verify="required" name="check_status">
                                      <option value="">请选择审核状态</option>
+                                     <option value="0">未审核</option>
                                      <option value="1">继续跟踪</option>
                                      <option value="2">放弃</option>
                                  </select>
@@ -43,7 +44,7 @@
                         <div>
                             <label class="layui-form-label"><font color='red' size="4">*</font>审核批示:</label>
                             <div class="layui-input-block">
-                                <textarea lay-verify="required" type="text" name="check_written" class="layui-textarea" placeholder="请输入审核批示"/></textarea>
+                                <textarea lay-verify="required" type="text" name="check_comment" class="layui-textarea" placeholder="请输入审核批示"/></textarea>
                             </div>
                         </div>
                         <div>
@@ -81,10 +82,10 @@
             ,type: 'datetime'
         });
         var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
-        form.val("component-form-element", {next_time: editdata['next_time']});
+        form.val("component-form-element", {next_time: editdata['next_time_f']});
 
         form.on('submit(component-form-element)', function (data) {
-            var url = '/agent/agent/' + id + '/';
+            var url = '/customer/review/' + id + '/track_review/';
             var type = 'post';
 
             admin.req({

+ 19 - 11
uis/views/customer/check_index.html

@@ -101,21 +101,22 @@
 
         table.render({
             elem: '#customer_datagrid'
-            , url: '/api/check_list.json'
+            , url: '/customer/review/'
             , cols: [[
                 {field: 'name', title: '姓名', width: 110}
                 , {field: 'tel', title: '电话', width: 120}
                 , {field: 'address', title: '地址', width: 200}
-                , {field: 'project', title: '项目', width: 150}
+                , {field: 'project_text', title: '项目', width: 150}
                 , {field: 'village', title: '小区', width: 150}
-                , {field: 'follow_user', title: '跟踪人', width: 110}
-                , {field: 'report_content', title: '报告内容', width: 200}
-                , {field: 'isSupport', title: '支援或放弃', width: 110}
-                , {field: 'isAbandon', title: '是否放弃', width: 100}
-                , {field: 'check_status', title: '审核状态', width: 110}
-                , {field: 'check_user', title: '审核人员', width: 110}
-                , {field: 'check_written', title: '审核批示', width: 100}
-                , {field: 'check_time', title: '审核时间', width: 180}
+                , {field: 'description', title: '回访情况', width: 200}
+                , {field: 'instruction', title: '申请支援或放弃', width: 110}
+                , {field: 'is_giveup_text', title: '是否放弃', width: 100}
+                , {field: 'check_status_text', title: '审核状态', width: 110}
+                , {field: 'create_user_text', title: '审核人', width: 110}
+                , {field: 'check_comment', title: '审核批示', width: 100}
+                , {field: 'check_time_f', title: '审核时间', width: 180}
+                , {field: 'track_user_text', title: '跟踪人', width: 110}
+                , {field: 'next_time_f', title: '下次回访时间', width: 180}
                 , {width: 80, align: 'center', fixed: 'right', toolbar: '#customer-operate-bar'}
             ]]
             , page: true
@@ -125,6 +126,10 @@
         table.on('tool(customer-operate)', function (obj) {
             var data = obj.data;
             if (obj.event === 'customer_check') {
+                if(data.check_status !== 0){
+                    layer.msg("当前记录已审核", {icon: 2});
+                    return
+                }
                table.editdata = data;
                layer.open({
                 type: 2,
@@ -133,8 +138,11 @@
                 btn: ['保存', '取消'],
                 yes: function (index, dom) {
                     layui.onSubmitChild = function (res) {
+                        if(res.code === 0){
+                            layer.msg("审核成功!", {icon: 1})
+                        }
                         layer.close(index);
-                        table.reload('agent_datagrid', {});
+                        table.reload('customer_datagrid', {});
                     };
                     layui.submitChild();
                 },

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

@@ -199,7 +199,6 @@
                 content: 'add_report.html?customer_id=' + customer_id + '&stage_progress_sort=' + stage_progress_sort
             });
         };
-
         //监听工具条
         table.on('tool(customer-operate)', function (obj) {
             var data = obj.data;

+ 1 - 2
uis/views/customer/order.html

@@ -120,11 +120,10 @@
                 //     var name = data_source[i].name;
                 //     source_node.append("<option value='" + pid + "'>" + name + "</option>");
                 // }
-                form.val("component-form-element", {});
+                // form.val("component-form-element", {});
             }
         });
 
-        //form.render(null, 'component-form-element');
 
         form.on('submit(component-form-element)', function (data) {
             var url = '/customer/report_customer/';

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

@@ -171,7 +171,7 @@
                 });
             }else if(obj.event === 'store_check'){
                 if(data.status !== 0){
-                    layer.msg("只有待审核状态才允许审核");
+                    layer.msg("当前记录已经审核!", {icon: 2});
                     return
                 }
                 layer.confirm('确定要审核当前门店吗?', {icon: 3, title:'提示'}, function(index){