lyh преди 1 година
родител
ревизия
e7e1e3844f

+ 27 - 1
apps/vehicle_order/filters.py

@@ -2,7 +2,7 @@
 
 import django_filters
 
-from .models import VhicleDriveReserve, VhicleInquiry
+from .models import VhicleDriveReserve, VhicleInquiry, UsedVhicleInquiry, UsedVhicleEstimate
 
 
 class VhicleDriveReserveFilter(django_filters.FilterSet):
@@ -28,3 +28,29 @@ class VhicleInquiryFilter(django_filters.FilterSet):
         model = VhicleInquiry
         fields = '__all__'
 
+
+class UsedVhicleInquiryFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
+    tel = django_filters.CharFilter(field_name='customer__tel', lookup_expr='icontains')
+    brand = django_filters.CharFilter(field_name='brand')
+    status = django_filters.CharFilter(field_name='status')
+    id = django_filters.CharFilter(field_name='id')
+
+    class Meta:
+        model = UsedVhicleInquiry
+        fields = '__all__'
+
+
+
+class UsedVhicleEstimateFilter(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')
+    brand = django_filters.CharFilter(field_name='brand')
+    status = django_filters.CharFilter(field_name='status')
+    id = django_filters.CharFilter(field_name='id')
+
+    class Meta:
+        model = UsedVhicleEstimate
+        fields = '__all__'
+
+

+ 49 - 0
apps/vehicle_order/models.py

@@ -62,4 +62,53 @@ class VhicleInquiry(models.Model):
     class Meta:
         db_table = 'vehicle_inquiry'
         verbose_name = u'新车询价'
+        default_permissions = ()
+
+
+class UsedVhicleInquiry(models.Model):
+    WAIT_VISIT = 1
+    VISITED = 2
+    STATUS_CHOICES = (
+        (WAIT_VISIT, u'待回访'),
+        (VISITED, u'已回访'),
+    )
+    brand = models.ForeignKey(Option, verbose_name=u'品牌', on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"添加时间", auto_now_add=True, editable=False)
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'状态', default=WAIT_VISIT)
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False)
+    name = models.CharField(max_length=100, verbose_name=u'名称', null=True)
+    gender = models.PositiveSmallIntegerField(choices=settings.GENDER_CHOICES, verbose_name=u'性别', null=True)
+    years = models.CharField(max_length=100, verbose_name=u'车龄', null=True)
+    area = models.CharField(max_length=100, verbose_name=u'城市', null=True)
+    mileage = models.FloatField(verbose_name=u"车辆里程", null=True)
+    notes = models.CharField(max_length=500, verbose_name=u'备注', null=True)
+    delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
+
+    class Meta:
+        db_table = 'usedvehicle_inquiry'
+        verbose_name = u'二手车询价'
+        default_permissions = ()
+
+
+class UsedVhicleEstimate(models.Model):
+    WAIT_VISIT = 1
+    VISITED = 2
+    STATUS_CHOICES = (
+        (WAIT_VISIT, u'待回访'),
+        (VISITED, u'已回访'),
+    )
+    brand = models.ForeignKey(Option, verbose_name=u'品牌', on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"添加时间", auto_now_add=True, editable=False)
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'状态', default=WAIT_VISIT)
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False)
+    model = models.CharField(max_length=100, verbose_name=u'车型', null=True)
+    plate_date = models.DateField(verbose_name=u"上牌日期", blank=True, null=True)
+    area = models.CharField(max_length=100, verbose_name=u'城市', null=True)
+    mileage = models.FloatField(verbose_name=u"车辆里程", null=True)
+    notes = models.CharField(max_length=500, verbose_name=u'备注', null=True)
+    delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
+
+    class Meta:
+        db_table = 'usedvehicle_estimate'
+        verbose_name = u'二手车预估'
         default_permissions = ()

+ 27 - 2
apps/vehicle_order/serializers.py

@@ -7,9 +7,8 @@ from rest_framework import serializers
 from utils.exceptions import CustomError
 
 from apps.base import Formater
-from apps.images.models import Images
 
-from .models import VhicleDriveReserve, VhicleInquiry
+from .models import VhicleDriveReserve, VhicleInquiry, UsedVhicleInquiry, UsedVhicleEstimate
 
 class VhicleDriveReserveSerializer(serializers.ModelSerializer):
     shop_name = serializers.CharField(source='shop.name', read_only=True)
@@ -55,3 +54,29 @@ class VhicleInquirySerializer(serializers.ModelSerializer):
         model = VhicleInquiry
         fields = '__all__'
 
+
+class UsedVhicleInquirySerializer(serializers.ModelSerializer):
+    brand_name = serializers.CharField(source='brand.name', read_only=True)
+    customer_name = serializers.CharField(source='customer.name', read_only=True)
+    customer_tel = serializers.CharField(source='customer.tel', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    gender_text = serializers.CharField(source='get_gender_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+
+    class Meta:
+        model = UsedVhicleInquiry
+        fields = '__all__'
+
+
+class UsedVhicleEstimateSerializer(serializers.ModelSerializer):
+    brand_name = serializers.CharField(source='brand.name', read_only=True)
+    customer_name = serializers.CharField(source='customer.name', read_only=True)
+    customer_tel = serializers.CharField(source='customer.tel', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    plate_date = serializers.DateField(format='%Y-%m-%d')
+
+    class Meta:
+        model = UsedVhicleEstimate
+        fields = '__all__'
+

+ 2 - 0
apps/vehicle_order/urls.py

@@ -12,4 +12,6 @@ urlpatterns = [
 router = SimpleRouter()
 router.register(r'drive_reserve', VhicleDriveReserveViewSet)
 router.register(r'inquiry', VhicleInquiryViewSet)
+router.register(r'usedvehicle_inquiry', UsedVhicleInquiryViewSet)
+router.register(r'usedvehicle_estimate', UsedVhicleEstimateViewSet)
 urlpatterns += router.urls

+ 42 - 0
apps/vehicle_order/views.py

@@ -50,4 +50,46 @@ class VhicleInquiryViewSet(CustomModelViewSet):
             order.status = VhicleInquiry.VISITED
             order.save()
             tenant_log(self.request.user, BizLog.UPDATE, u'新车询价单回访,id=%d' % (order.id))
+        return response_ok()
+
+
+
+class UsedVhicleInquiryViewSet(CustomModelViewSet):
+    queryset = UsedVhicleInquiry.objects.filter(delete=False)
+    serializer_class = UsedVhicleInquirySerializer
+
+    def filter_queryset(self, queryset):
+        f = UsedVhicleInquiryFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    @action(methods=['post'], detail=True)
+    def visit(self, request, pk):
+        order = UsedVhicleInquiry.objects.filter(id=pk).first()
+        with transaction.atomic():
+            if order.status != UsedVhicleInquiry.WAIT_VISIT:
+                raise CustomError(u'当前状态不允许修改!')
+            order.status = UsedVhicleInquiry.VISITED
+            order.save()
+            tenant_log(self.request.user, BizLog.UPDATE, u'二手车询价单回访,id=%d' % (order.id))
+        return response_ok()
+
+
+
+class UsedVhicleEstimateViewSet(CustomModelViewSet):
+    queryset = UsedVhicleEstimate.objects.filter(delete=False)
+    serializer_class = UsedVhicleEstimateSerializer
+
+    def filter_queryset(self, queryset):
+        f = UsedVhicleEstimateFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    @action(methods=['post'], detail=True)
+    def visit(self, request, pk):
+        order = UsedVhicleEstimate.objects.filter(id=pk).first()
+        with transaction.atomic():
+            if order.status != UsedVhicleEstimate.WAIT_VISIT:
+                raise CustomError(u'当前状态不允许修改!')
+            order.status = UsedVhicleEstimate.VISITED
+            order.save()
+            tenant_log(self.request.user, BizLog.UPDATE, u'二手车预估单回访,id=%d' % (order.id))
         return response_ok()

+ 2 - 2
uis/views/index.html

@@ -84,10 +84,10 @@
               </a>
               <dl class="layui-nav-child">
                 <dd data-name="button">
-                  <a lay-href="customer/index.html">询价管理</a>
+                  <a lay-href="vehicle_order/usedvehicle_inquiry.html">询价管理</a>
                 </dd>
                 <dd data-name="button">
-                  <a lay-href="purchase/purchase_price.html">置换预估</a>
+                  <a lay-href="vehicle_order/usedvehicle_estimate.html">置换预估</a>
                 </dd>
               </dl>
             </li>

+ 158 - 0
uis/views/vehicle_order/usedvehicle_estimate.html

@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>活动管理</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" 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 type="text/css">
+    .LAY-btns .layui-nav {padding-left:0;padding-right:10px;top:-4px;margin: 0 10px;border: 0;background-color: #009688;}
+    .LAY-btns .layui-nav .layui-nav-item{line-height: 30px;}
+    .LAY-btns .layui-nav .layui-nav-child{top:34px;}
+    .LAY-btns .layui-nav .layui-nav-bar{display: none;}
+    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a{color:#333;background-color:#fff;}
+    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {background-color: #f2f2f2;color: #000;}
+    .seach_items {float:right;margin-left: 10px;}
+  </style>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+        <div class="layui-row layui-col-space15">
+          <div class="layui-col-md12">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+
+                <form class="layui-form" lay-filter="query-form-element">
+                    <div class="seach_items">
+                        <button class="layui-btn" lay-submit lay-filter="query-form-element"><i class="layui-icon layui-icon-search"></i>查询</button>
+                    </div>
+                    <div class="seach_items">
+                        <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>
+                    <div class="seach_items">
+                         <select  name="brand" id="seach_brand">
+                            <option value="">品牌</option>
+                        </select>
+                    </div>
+                    <div class="seach_items">
+                       <select  name="status">
+                            <option value="">状态</option>
+                            <option value="1">待回访</option>
+                            <option value="2">已回访</option>
+                        </select>
+                    </div>
+
+                </form>
+                <div style="clear: both;"></div>
+            </div>
+            <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
+
+            <script type="text/html" id="datagrid-operate-bar">
+                <div class="layui-btn-group">
+                    <a class="layui-btn layui-btn-xs" lay-event="visit">已回访</a>
+                </div>
+            </script>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>
+
+  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+     ,formSelects: 'formSelects-v4'
+  }).use(['index', 'table', 'form', 'formSelects'], function(){
+    var $ = layui.$
+        ,table = layui.table
+        ,admin = layui.admin
+        ,form = layui.form;
+
+    admin.req({
+        url: '/foundation/option/search/?type=0',
+        done: function (res) {
+            var data = res.data;
+            var brand_node = $('#seach_brand');
+            for (var i in data) {
+                var pid = data[i].id;
+                var value = data[i].name;
+                brand_node.append("<option value='" + pid + "'>" + value + "</option>");
+            }
+            form.render();
+        }
+    });
+
+    table.render({
+      elem: '#datagrid'
+      ,url: '/vehicle_order/usedvehicle_estimate/'
+      ,cols: [[
+        {field:'brand_name', title:'品牌',width: 100},
+            {field:'model', title:'车型',width: 100}
+       ,{field:'status_text', title:'状态',width: 100}
+       ,{field:'customer_name', title:'客户',width: 100}
+        ,{field:'customer_tel', title:'电话',width: 120}
+        ,{field:'plate_date', title:'上牌日期',width: 120}
+       ,{field:'area', title:'地区',width: 150}
+       ,{field:'mileage', title:'里程',width: 150}
+       ,{field:'create_time', title:'创建时间',width: 150}
+       ,{field:'notes', title:'备注',width: 150}
+        ,{width:80, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+      ]]
+      ,page: true
+      ,height: 'full-108'
+      , done: function () {
+        layui.index.removeNoPermButtons()
+      }
+    });
+    form.on('submit(query-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+      table.reload('datagrid', {
+          where: data.field
+          ,page:{curr:1}
+      });
+      layer.closeAll();
+      return false;
+    });
+    //监听工具条
+    table.on('tool(datagrid-operate)', function(obj){
+      var data = obj.data;
+      table.editdata = data;
+        if(obj.event === 'visit'){
+            if (data.status !== 1){
+                 layer.msg('该询价已回访');
+                return;
+            }
+         layer.confirm('确定询价已回访吗?', function(index){
+             layer.close(index);
+            admin.req({
+                url: '/vehicle_order/usedvehicle_estimate/'+data.id + '/visit/'
+                ,type: 'post'
+                ,done: function(res){
+                    if(res.code === 1){
+                        layer.msg(res.msg);
+                        return;
+                    }
+                    table.reload('datagrid',{});
+                }
+            });
+        });
+      }
+    });
+  });
+  </script>
+</body>
+</html>
+

+ 159 - 0
uis/views/vehicle_order/usedvehicle_inquiry.html

@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>活动管理</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" 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 type="text/css">
+    .LAY-btns .layui-nav {padding-left:0;padding-right:10px;top:-4px;margin: 0 10px;border: 0;background-color: #009688;}
+    .LAY-btns .layui-nav .layui-nav-item{line-height: 30px;}
+    .LAY-btns .layui-nav .layui-nav-child{top:34px;}
+    .LAY-btns .layui-nav .layui-nav-bar{display: none;}
+    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a{color:#333;background-color:#fff;}
+    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {background-color: #f2f2f2;color: #000;}
+    .seach_items {float:right;margin-left: 10px;}
+  </style>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+        <div class="layui-row layui-col-space15">
+          <div class="layui-col-md12">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+
+                <form class="layui-form" lay-filter="query-form-element">
+                    <div class="seach_items">
+                        <button class="layui-btn" lay-submit lay-filter="query-form-element"><i class="layui-icon layui-icon-search"></i>查询</button>
+                    </div>
+                    <div class="seach_items">
+                        <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>
+                    <div class="seach_items">
+                         <select  name="brand" id="seach_brand">
+                            <option value="">品牌</option>
+                        </select>
+                    </div>
+                    <div class="seach_items">
+                       <select  name="status">
+                            <option value="">状态</option>
+                            <option value="1">待回访</option>
+                            <option value="2">已回访</option>
+                        </select>
+                    </div>
+
+                </form>
+                <div style="clear: both;"></div>
+            </div>
+            <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
+
+            <script type="text/html" id="datagrid-operate-bar">
+                <div class="layui-btn-group">
+                    <a class="layui-btn layui-btn-xs" lay-event="visit">已回访</a>
+                </div>
+            </script>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>
+
+  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+     ,formSelects: 'formSelects-v4'
+  }).use(['index', 'table', 'form', 'formSelects'], function(){
+    var $ = layui.$
+        ,table = layui.table
+        ,admin = layui.admin
+        ,form = layui.form;
+
+    admin.req({
+        url: '/foundation/option/search/?type=0',
+        done: function (res) {
+            var data = res.data;
+            var brand_node = $('#seach_brand');
+            for (var i in data) {
+                var pid = data[i].id;
+                var value = data[i].name;
+                brand_node.append("<option value='" + pid + "'>" + value + "</option>");
+            }
+            form.render();
+        }
+    });
+
+    table.render({
+      elem: '#datagrid'
+      ,url: '/vehicle_order/usedvehicle_inquiry/'
+      ,cols: [[
+        {field:'brand_name', title:'品牌',width: 100}
+       ,{field:'status_text', title:'状态',width: 100}
+       ,{field:'customer_name', title:'客户',width: 100}
+        ,{field:'customer_tel', title:'电话',width: 120}
+        ,{field:'gender_text', title:'性别',width: 80}
+       ,{field:'name', title:'询价人',width: 100}
+       ,{field:'area', title:'地区',width: 150}
+       ,{field:'years', title:'车龄',width: 150}
+       ,{field:'mileage', title:'里程',width: 150}
+       ,{field:'create_time', title:'创建时间',width: 150}
+       ,{field:'notes', title:'备注',width: 150}
+        ,{width:80, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+      ]]
+      ,page: true
+      ,height: 'full-108'
+      , done: function () {
+        layui.index.removeNoPermButtons()
+      }
+    });
+    form.on('submit(query-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+      table.reload('datagrid', {
+          where: data.field
+          ,page:{curr:1}
+      });
+      layer.closeAll();
+      return false;
+    });
+    //监听工具条
+    table.on('tool(datagrid-operate)', function(obj){
+      var data = obj.data;
+      table.editdata = data;
+        if(obj.event === 'visit'){
+            if (data.status !== 1){
+                 layer.msg('该询价已回访');
+                return;
+            }
+         layer.confirm('确定询价已回访吗?', function(index){
+             layer.close(index);
+            admin.req({
+                url: '/vehicle_order/usedvehicle_inquiry/'+data.id + '/visit/'
+                ,type: 'post'
+                ,done: function(res){
+                    if(res.code === 1){
+                        layer.msg(res.msg);
+                        return;
+                    }
+                    table.reload('datagrid',{});
+                }
+            });
+        });
+      }
+    });
+  });
+  </script>
+</body>
+</html>
+