wushaodong il y a 3 ans
Parent
commit
cd69b64e74

+ 5 - 3
apps/order/models.py

@@ -72,7 +72,7 @@ class Order(models.Model):
     upkeep = models.CharField(max_length=10, verbose_name=u"保养", null=True)
     dpratio = models.CharField(max_length=10, verbose_name=u"首付比例", null=True)
     lamount = models.CharField(max_length=10, verbose_name=u"申请贷款金额", null=True)
-    package = models.ForeignKey(Product, verbose_name=u'贷款产品', on_delete=models.PROTECT, null=True)
+    laompany = models.ForeignKey(Product, verbose_name=u'贷款产品', on_delete=models.PROTECT, null=True)
 
     name = models.CharField(max_length=10, verbose_name=u"姓名", null=True)
     sex = models.PositiveSmallIntegerField(choices=order.GENDER_CHOICES, verbose_name=u"性别", default=order.ZERO)
@@ -81,6 +81,7 @@ class Order(models.Model):
     nationality = models.PositiveSmallIntegerField(choices=order.NATIONALITY_CHOICES, verbose_name=u"国籍/地区", default=order.ZERO)
     ntype = models.PositiveSmallIntegerField(choices=order.ITYPE_CHOICES, verbose_name=u"身份证件类型", default=order.ZERO)
     inumber = models.CharField(max_length=18, verbose_name=u"身份证件号码", null=True)
+    dincome = models.CharField(max_length=10, verbose_name=u"税后收入", null=True)
     mstatus = models.PositiveSmallIntegerField(choices=order.HUNYIN_CHOICES, verbose_name=u"婚姻状况", default=order.ZERO)
     elevel = models.PositiveSmallIntegerField(choices=order.JIAOYU_CHOICES, verbose_name=u"教育程度", default=order.ZERO)
     naddress = models.CharField(max_length=100, verbose_name=u"现居住地址", null=True)
@@ -192,8 +193,9 @@ class OrderDetailEdit(models.Model):
     )
     type = models.PositiveSmallIntegerField(choices=TYPE_CHOICE, default=ZERO)
     order = models.ForeignKey(Order, verbose_name=u'产品', on_delete=models.PROTECT, related_name='order_detail_edit')
-    value = models.CharField(max_length=20, verbose_name=u'订单明细对象值') # 文字资料和图片资料id
-    edit_time = models.DateTimeField(verbose_name=u'修改时间', auto_now_add=True)
+    value = models.CharField(max_length=20, verbose_name=u'订单明细对象值') # 文字资料存自动名称,图片存OrderImages id
+    edit_time = models.DateTimeField(verbose_name=u'修改时间', null=True)
+    reason = models.CharField(max_length=200, verbose_name=u'修改原因', null=True)
 
     class Meta:
         db_table = "order_detail_edit"

+ 19 - 2
apps/order/serializers.py

@@ -57,18 +57,35 @@ class OrderListSerializer(serializers.ModelSerializer):
                                               read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
     sex_text = serializers.CharField(source='get_sex_display', read_only=True)
-    package_text = serializers.CharField(source='package__name', read_only=True)
+    laompany_text = serializers.CharField(source='laompany.name', read_only=True)
 
     class Meta:
         model = Order
-        fields = ('name','tel','sex_text','inumber','package_text','status_text','create_time_f','create_user_text','seller_text',)
+        fields = ('id','name','tel','sex_text','inumber','laompany_text','status_text','create_time_f','create_user_text','seller_text',)
 
 class OrderSerializer(serializers.ModelSerializer):
     create_user_text = serializers.CharField(source='create_user.username', read_only=True)
+    laompany_text = serializers.CharField(source='laompany.name', label='产品名称', read_only=True)
     create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
                                               read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
     category_text = serializers.CharField(source='get_category_display', read_only=True)
+    sex_text = serializers.CharField(source='get_sex_display', label='性别', read_only=True)
+    rpr_text = serializers.CharField(source='get_rpr_display', label='户口', read_only=True)
+    nationality_text = serializers.CharField(source='get_nationality_display', label='国籍/地区', read_only=True)
+    ntype_text = serializers.CharField(source='get_ntype_display', label='身份证件类型', read_only=True)
+    elevel_text = serializers.CharField(source='get_elevel_display', label='教育程度', read_only=True)
+    hptype_text = serializers.CharField(source='get_hptype_display', label='现居住房产类型', read_only=True)
+    maddress_text = serializers.CharField(source='get_maddress_display', label='邮寄地址', read_only=True)
+    itype_text = serializers.CharField(source='get_itype_display', label='行业类型', read_only=True)
+    otype_text = serializers.CharField(source='get_otype_display', label='职业类型', read_only=True)
+    relation_text = serializers.CharField(source='get_relation_display', label='与借款人关系', read_only=True)
+    tsrelation_text = serializers.CharField(source='get_tsrelation_display', label='与借款人关系', read_only=True)
+    tsitype_text = serializers.CharField(source='get_tsitype_display', label='身份证件类型', read_only=True)
+    tsmaddress_text = serializers.CharField(source='get_tsmaddress_display', label='邮寄地址', read_only=True)
+    mstatus_text = serializers.CharField(source='get_mstatus_display', label='婚姻状况', read_only=True)
+    wbst_text = BooleanCharField(source='wbst', label='是否挂靠', read_only=True)
+    thesame_text = BooleanCharField(source='thesame', label='是否有共同借款人', read_only=True)
 
     class Meta:
         model = Order

+ 110 - 13
apps/order/views.py

@@ -16,6 +16,7 @@ from rest_framework.decorators import action
 from django.contrib.auth import get_user_model
 
 User = get_user_model()
+from utils.format import strftime
 
 
 class ProductView(APIView):
@@ -25,9 +26,9 @@ class ProductView(APIView):
         queryset = Product.objects.filter(enable=True)
         for row in queryset:
             item = {
-                'id':row.id,
-                'name':row.name,
-                'month':row.month,
+                'id': row.id,
+                'name': row.name,
+                'month': row.month,
             }
             data.append(item)
         return response_ok(data)
@@ -50,6 +51,7 @@ class DeleteProductImageView(APIView):
             return response_error(str(e))
         return response_ok()
 
+
 class ProductViewSet(CustomModelViewSet):
     permission_classes = [isLogin, ]
     queryset = Product.objects.filter()
@@ -90,7 +92,7 @@ class ProductViewSet(CustomModelViewSet):
                     if file:
                         upload = Upload.objects._addnew(file, 'commodity_image')
                         ProductImages.objects.create(product_id=instance.id,
-                                                           image_id=upload.id)
+                                                     image_id=upload.id)
 
                         if not upload:
                             return response_error('上传失败,请重新上传!')
@@ -118,24 +120,27 @@ class ProductViewSet(CustomModelViewSet):
             data.append(commodity_image_item)
         return response_ok(data)
 
+
 class ProductListView(ListAPIView):
     queryset = Product.objects.filter()
     serializer_class = ProductListSerializer
 
-    def filter_queryset(self, queryset,):
+    def filter_queryset(self, queryset, ):
         f = ProductFilter(self.request.GET, queryset=queryset)
         return f.qs
 
+
 class OrderListView(ListAPIView):
     permission_classes = [isLogin, ]
     queryset = Order.objects.filter()
     serializer_class = OrderListSerializer
 
-    def filter_queryset(self, queryset,):
+    def filter_queryset(self, queryset, ):
         queryset = queryset.filter(Q(create_user=self.request.user) | Q(seller=self.request.user))
         f = OrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 
+
 class OrderViewSet(CustomModelViewSet):
     permission_classes = [isLogin, ]
     queryset = Order.objects.filter()
@@ -146,6 +151,28 @@ class OrderViewSet(CustomModelViewSet):
         f = OrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 
+    def retrieve(self, request, *args, **kwargs):
+        # 小程序草稿箱、已上报修改,调用明细
+        instance = self.get_object()
+        serializer = self.get_serializer(instance)
+        if instance.category == order.ZERO:
+            return response_ok(serializer.data)
+        else:
+            # y已上报修改,返回需要修改的字段列表
+            edit_data = []
+            edit_values = OrderDetailEdit.objects.filter(order=instance, type=OrderDetailEdit.ZERO).values('value')
+            for r in edit_values:
+                item = {
+                    'name': r['value'],
+                    'reason': '填错了,请修改',
+                }
+                edit_data.append(item)
+            result = {
+                'data': serializer.data,
+                'edit_values': edit_data,
+            }
+            return response_ok(result)
+
     def create(self, request, *args, **kwargs):
         try:
             with transaction.atomic():
@@ -165,14 +192,17 @@ class OrderViewSet(CustomModelViewSet):
         try:
             instance = self.get_object()
             with transaction.atomic():
-                serializer = self.get_serializer(instance,data=request.data)
+                serializer = self.get_serializer(instance, data=request.data)
                 if serializer.is_valid(raise_exception=True):
                     instance = serializer.save()
-                    for key in data:
-                        edit, create = OrderDetailEdit.objects.get_or_create(type=OrderDetailEdit.ZERO, order=instance, value=key)
-                        if not create:
-                            edit.edit_time = datetime.datetime.now()
-                            edit.save()
+                    # 已上报的,修改,记录修改时间
+                    if instance.category == order.ONE:
+                        for key in data:
+                            edit = OrderDetailEdit.objects.filter(type=OrderDetailEdit.ZERO, order=instance,
+                                                                  value=key).first()
+                            if edit:
+                                edit.edit_time = datetime.datetime.now()
+                                edit.save()
 
                     BizLog.objects.addnew(self.request.user, BizLog.INSERT,
                                           u'修改订单[%s],id=%d' % (instance.name, instance.id), request.data)
@@ -182,6 +212,36 @@ class OrderViewSet(CustomModelViewSet):
         except Exception as e:
             return response_error(str(e))
 
+    @action(methods=['post'], detail=True)
+    def checkEdit(self, request, pk):
+        data = request.POST.get('items')
+        status = request.GET.get('statu')
+        try:
+            instance = self.get_object()
+            with transaction.atomic():
+                if status == '1':
+                    # 通过
+                    instance.status = order.ONE
+                elif status == '3':
+                    # 拒绝审批
+                    instance.status = order.THREE
+                else:
+                    OrderDetailEdit.objects.filter(order=instance).delete()
+                    if not len(data):
+                        raise CustomError('请填写返回修改原因')
+                    for item in json.loads(data):
+                        OrderDetailEdit.objects.create(order=instance, value=item['name'], reason=item['reason'],
+                                                       type=item['type'])
+                    instance.status = order.TOW
+                instance.save()
+                BizLog.objects.addnew(self.request.user, BizLog.INSERT,
+                                      u'审批订单[%s],id=%d' % (instance.name, instance.id), request.data)
+                return response_ok()
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            return response_error(str(e))
+
     @action(methods=['post'], detail=False)
     def upload_image(self, request):
         file = self.request.FILES.get('file')
@@ -193,6 +253,44 @@ class OrderViewSet(CustomModelViewSet):
             return response_ok(upload.id)
         return response_error('上传失败,请重新上传!')
 
+    @action(methods=['get'], detail=True)
+    def get_detail(self, request, pk):
+        # 后端审核业务,获取客户信息和部分字段修改时间
+        instance = self.get_object()
+        serializer = self.get_serializer(instance)
+        # y已上报修改,返回需要修改的字段列表
+        # 不显示字段
+        show = [
+            'vmodel', 'invioce', 'ptax', 'insurance', 'boutique', 'wextension', 'upkeep', 'dpratio', 'lamount',
+            'laompany_text', 'name', 'sex_text', 'bdate', 'rpr_text', 'nationality_text', 'ntype_text', 'inumber',
+            'dincome', 'mstatus_text',
+            'elevel_text', 'naddress', 'hptype_text', 'maddress_text', 'email', 'wx', 'phone', 'tel', 'wname', 'wphone',
+            'waddress', 'itype_text', 'otype_text', 'position', 'wbst_text', 'bstname', 'bstcode', 'bsttel',
+            'bstaddress',
+            'cname', 'ctel', 'relation_text', 'caddress', 'ctname', 'cttel', 'thesame_text', 'tsname', 'tsbdate',
+            'tsitype_text', 'tsinumber', 'tstel', 'tsrelation_text', 'tsnaddress', 'tsmaddress', 'tsemail', 'tswx',
+            'tswname', 'tswphone', 'tswaddress', 'tsmincome',
+        ]
+        result = []
+        for s in show:
+            key = serializer[s]
+            edit_values = OrderDetailEdit.objects.filter(order=instance, type=OrderDetailEdit.ZERO,
+                                                         value=key.name).first()
+            edit_time = reason = ''
+            if edit_values:
+                edit_time = edit_values.edit_time and strftime(edit_values.edit_time) or ''
+                reason = edit_values.reason
+            item = {
+                'name': key.name,  # tel
+                'label': key.label,  # 电话
+                'value': key.value,  # 13566
+                'edit_time': edit_time,
+                'reason': reason,
+                'type': '0',
+            }
+            result.append(item)
+        return response_ok(result)
+
     @action(methods=['post'], detail=True)
     def update_image(self, request):
         file = self.request.FILES.get('file')
@@ -222,4 +320,3 @@ class OrderViewSet(CustomModelViewSet):
         except Exception as e:
             return response_error(str(e))
         return response_ok()
-

+ 44 - 2
uis/views/order/index.html

@@ -57,7 +57,16 @@
             <div class="layui-row layui-col-space15">
                 <div class="layui-col-md12">
                     <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
-
+                    <script type="text/html" id="order-operate-bar">
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="order_check"
+                            >审批</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="order_edit"
+                            >拒绝</a>
+                        </div>
+                    </script>
                 </div>
             </div>
         </div>
@@ -116,11 +125,12 @@
                 , {field: 'sex_text', title: '性别', width: 100}
                 , {field: 'tel', title: '手机号', width: 130}
                 , {field: 'inumber', title: '证件号', width: 150}
-                , {field: 'package_text', title: '贷款产品', width: 200}
+                , {field: 'laompany_text', title: '贷款产品', width: 200}
                 , {field: 'status_text', title: '订单状态', width: 100}
                 , {field: 'create_time_f', title: '下单时间', width: 180,}
                 , {field: 'create_user_text', title: '下单人', width: 120,}
                 , {field: 'seller_text', title: '业务人员', width: 120,}
+                , {width: 150, align: 'center', fixed: 'right', toolbar: '#order-operate-bar'}
             ]]
             , page: true
             , height: 'full-108'
@@ -143,6 +153,38 @@
             layer.closeAll();
             return false;
         });
+        //监听工具条
+        table.on('tool(datagrid-operate)', function (obj) {
+            var data = obj.data;
+            table.editdata = data;
+            if (obj.event === 'order_check') {
+                layer.open({
+                    type: 2,
+                    title: '审批',
+                    area: ['70%', '80%'],
+                    btn: ['返回修改', '审批通过', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitEdit = function (data) {
+                            layer.close(index);
+                            table.reload('datagrid', {});
+                        };
+                        layui.submitEdit();
+                    },
+                    btn2: function (index, layero) {
+                        layui.onSubmitPass = function (data) {
+                            layer.close(index);
+                            table.reload('datagrid', {});
+                        };
+                        layui.submitPass();
+                    },
+                    btn3: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'order_detail_check.html?id=' + data.id
+                });
+            }
+
+        });
     });
 </script>
 </body>

+ 197 - 0
uis/views/order/order_detail_check.html

@@ -0,0 +1,197 @@
+<!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">
+    <style type="text/css">
+        /*您可以将下列样式写入自己的样式表中*/
+        /*layui 元素样式改写*/
+        .layui-btn-sm {
+            line-height: normal;
+            font-size: 12.5px;
+        }
+
+        .layui-table-view .layui-table-body {
+            min-height: 256px;
+        }
+
+        .layui-table-cell .layui-input.layui-unselect {
+            height: 30px;
+            line-height: 30px;
+        }
+
+        /*设置 layui 表格中单元格内容溢出可见样式*/
+        .table-overlay .layui-table-view,
+        .table-overlay .layui-table-box,
+        .table-overlay .layui-table-body {
+            overflow: visible;
+        }
+
+        .table-overlay .layui-table-cell {
+            height: auto;
+            overflow: visible;
+        }
+
+        .imgStyle {
+            padding-left: 10px;
+            width: 80px;
+            height: 50px;
+        }
+
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-col-md12">
+        <div class="layui-card">
+            <div class="layui-card">
+                <form class="layui-form" action="" lay-filter="component-form-edit">
+                    <button class="layui-btn" id="id_save_edit" lay-submit lay-filter="component-form-edit"
+                            style="display: none">保存
+                    </button>
+                </form>
+                <form class="layui-form" action="" lay-filter="component-form-pass">
+                    <button class="layui-btn" id="id_save_pass" lay-submit lay-filter="component-form-pass"
+                            style="display: none">保存
+                    </button>
+                </form>
+            </div>
+            <div class="layui-card-body">
+                <div style="height: 5px"></div>
+
+                <div id="tableRes" class="table-overlay">
+                    <table id="dataTable" lay-filter="dataTable" class="layui-hide"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script type="text/html" id="paramImage">
+    {{# if(d.images_url){ }}
+    <img src="{{ d.images_url }}" class="imgStyle"/>
+    {{# } }}
+</script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table', 'layer', 'form',], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , table = layui.table
+            , form = layui.form
+            , layer = layui.layer;
+
+        var id = layui.view.getParameterByName('id');
+
+        var tbWidth = $("#tableRes").width();
+        var layTableId = "layTable";
+        var tableIns = table.render({
+            elem: '#dataTable',
+            id: layTableId,
+            data: [],
+            width: tbWidth,
+            page: false,
+            limit: 100,
+            loading: true,
+            even: true, //不开启隔行背景
+            cols: [[
+                {title: '序号', type: 'numbers'},
+                {field: 'label', title: '名称', width: '15%',},
+                {field: 'value', title: '内容', width: '30%',},
+                {field: 'edit_time', title: '最后修改时间', width: '15%',},
+                {field: 'reason', title: '打回修改原因', edit: 'text', width: '20%',},
+            ]]
+        });
+
+        admin.req({
+            url: '/order/' + id + '/get_detail/',
+            done: function (res) {
+                if (res.code === 0) {
+                    var rows = res.data;
+                    var oldData = table.cache[layTableId];
+                    for (var k in rows) {
+                        oldData.push(
+                            {
+                                label: rows[k].label,
+                                value: rows[k].value,
+                                name: rows[k].name,
+                                edit_time: rows[k].edit_time,
+                                reason: rows[k].reason,
+                                type: rows[k].type,
+                            }
+                        )
+                    }
+                    tableIns.reload({
+                        data: oldData
+                    });
+                }
+                else
+                    layer.msg('获取内容失败', {icon: 5});
+            }
+        });
+        //保存
+        form.on('submit(component-form-edit)', function (data) {
+            var rows = table.cache[layTableId];
+            var items = [];
+            for (var k in rows) {
+                if (rows[k].reason) {
+                    var item = {
+                        name: rows[k].name,
+                        reason: rows[k].reason,
+                        type: rows[k].type,
+                    };
+                    items.push(item);
+                }
+            }
+
+            if (items.length === 0) {
+                layer.msg("请填写退回修改的原因", {icon: 2})
+                return false;
+            }
+            admin.req({
+                url: '/order/' + id + '/checkEdit/?statu=2'
+                , data: {items:JSON.stringify(items)}
+                , type: 'post'
+                , done: function (res) {
+                    parent.layui.onSubmitEdit(res);
+                }
+            });
+
+            return false;
+        });
+
+        form.on('submit(component-form-pass)', function (data) {
+            var formData = new FormData();
+            formData.append('items', [])
+            admin.req({
+                url: '/order/' + id + '/checkEdit/?statu=1'
+                , data: {items:[]}
+                , type: 'post'
+                , done: function (res) {
+                    parent.layui.onSubmitPass(res);
+                }
+            });
+            return false;
+        });
+        parent.layui.submitEdit = function () {
+            $("#id_save_edit").click();
+        };
+        parent.layui.submitPass = function () {
+            $("#id_save_pass").click();
+        };
+    });
+
+</script>
+</body>
+</html>