Ver código fonte

订单审批

wushaodong 3 anos atrás
pai
commit
cdc5134e02
3 arquivos alterados com 221 adições e 94 exclusões
  1. 10 9
      apps/order/models.py
  2. 74 23
      apps/order/views.py
  3. 137 62
      uis/views/order/order_detail_check.html

+ 10 - 9
apps/order/models.py

@@ -148,23 +148,24 @@ class Order(models.Model):
         return instance
 
 class OrderImages(models.Model):
-    ZERO = 0
     ONE = 1
     TOW = 2
     THREE = 3
     FOUR = 4
     FIVE = 5
+    SIX = 6
     TYPE_CHOICE = (
-        (ZERO, '身份证'),
-        (ONE, '驾驶证'),
-        (TOW, '收入类'),
-        (THREE, '流水类'),
-        (FOUR, '营业执照'),
-        (FIVE, '挂靠协议'),
+        (ONE, '身份证', ),
+        (TOW, '驾驶证', ),
+        (THREE, '收入类',),
+        (FOUR, '流水类',),
+        (FIVE, '营业执照', ),
+        (SIX, '挂靠协议', ),
     )
-    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICE, default=ZERO)
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICE, default=ONE)
     order = models.ForeignKey(Order, verbose_name=u'产品', on_delete=models.PROTECT, related_name='order_images')
     image = models.ForeignKey(Upload, verbose_name=u'图片', on_delete=models.PROTECT)
+    enable = models.BooleanField(verbose_name=u'是否在用', default=True, )
 
     class Meta:
         db_table = "order_images"
@@ -193,7 +194,7 @@ 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'订单明细对象值') # 文字资料存自动名称,图片存OrderImages id
+    value = models.CharField(max_length=20, verbose_name=u'订单明细对象值') # 文字资料存自动名称,图片存OrderImages type值
     edit_time = models.DateTimeField(verbose_name=u'修改时间', null=True)
     reason = models.CharField(max_length=200, verbose_name=u'修改原因', null=True)
 

+ 74 - 23
apps/order/views.py

@@ -161,22 +161,21 @@ class OrderViewSet(CustomModelViewSet):
         else:
             # y已上报修改,返回需要修改的字段列表
             edit_data = []
-            edit_values = OrderDetailEdit.objects.filter(order=instance, type=OrderDetailEdit.ZERO).values('value', 'reason')
+            edit_file = []
+            edit_values = OrderDetailEdit.objects.filter(order=instance).values('value', 'reason', 'type')
             for r in edit_values:
                 item = {
                     'name': r['value'],
                     'reason': r['reason'],
                 }
-                edit_data.append(item)
+                if r['type'] == OrderDetailEdit.ZERO:
+                    edit_data.append(item)
+                else:
+                    edit_file.append(item)
             result = {
                 'data': serializer.data,
                 'edit_values': edit_data,
-                'edit_file': [
-                    {
-                        'upload_id':1,
-                        'url':'',
-                    }
-                ],
+                'edit_file': edit_file,
             }
             return response_ok(result)
 
@@ -225,6 +224,7 @@ class OrderViewSet(CustomModelViewSet):
         data = request.POST.get('items')
         reason = request.POST.get('reason')
         status = request.GET.get('statu')
+
         try:
             instance = self.get_object()
             if instance.status == order.ONE:
@@ -233,20 +233,24 @@ class OrderViewSet(CustomModelViewSet):
                 raise CustomError('该客户信息被拒绝审批,禁止操作')
             with transaction.atomic():
                 if status == '1':
-                    # 通过
+                    # 审核通过, 删除修改信息
                     instance.status = order.ONE
+                    OrderDetailEdit.objects.filter(order=instance).delete()
                 elif status == '3':
                     # 拒绝审批
                     instance.status = order.THREE
                     instance.cancel_reason = reason
                 else:
                     # 返回修改
-                    OrderDetailEdit.objects.filter(order=instance).delete()
                     if not len(data):
                         raise CustomError('请填写返回修改原因')
                     for item in json.loads(data):
+                        # 根据修改类别,删除对应的历史修改信息
+                        OrderDetailEdit.objects.filter(order=instance, type=item['type']).delete()
                         OrderDetailEdit.objects.create(order=instance, value=item['name'], reason=item['reason'],
                                                        type=item['type'])
+                        if item['type'] == OrderDetailEdit.ONE:
+                            OrderImages.objects.filter(order=instance, type=item['name']).update(enable=False)
                     instance.status = order.TOW
                 instance.save()
                 BizLog.objects.addnew(self.request.user, BizLog.INSERT,
@@ -257,12 +261,10 @@ class OrderViewSet(CustomModelViewSet):
         except Exception as e:
             return response_error(str(e))
 
-    @action(methods=['post'], detail=False)
-    def upload_image(self, request):
+    @action(methods=['post'], detail=True)
+    def upload_image(self, request, pk):
         file = self.request.FILES.get('file')
-        type = self.request.FILES.get('type')
-        order_id = self.request.FILES.get('order_id')
-        upload_id = self.request.FILES.get('upload_id')
+        type = self.request.POST.get('type')
         # 上传图片,order_id必填。更新图片时,upload_id必填
         # / order / 2 / upload_image /
         # post
@@ -270,20 +272,42 @@ class OrderViewSet(CustomModelViewSet):
         # type 0身份证, 1驾驶证, 2收入类, 3流水类, 4营业执照, 5挂靠协议
         # order_id 订单id
         # upload_id 图片id
+        try:
+            order = self.get_object()
+            with transaction.atomic():
+                if type:
+                    # 上传图片时,把不在使用的同类别图片删除。
+                    images = OrderImages.objects.filter(order=order, type=type, enable=False)
+                    for image in images:
+                        image.image.del_images()
+                        image.delete()
+                upload = Upload.objects._addnew(file, 'user_image')
+                if upload:
+                    OrderImages.objects.create(order=order, type=type, image=upload)
+                    dict = {
+                        'id': upload.id,
+                        'path': upload.get_path(),
+                    }
+                    return response_ok(dict)
+                return response_error('上传失败,请重新上传!')
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            return response_error(str(e))
 
+    @action(methods=['post'], detail=True)
+    def deleteImage(self, request, pk):
+        upload_id = self.request.POST.get('upload_id')
         try:
+            order = self.get_object()
             with transaction.atomic():
                 if upload_id:
                     upload = Upload.objects.filter(id=upload_id).first()
                     if upload:
                         upload.del_images()
-                        Upload.objects._update(file, 'user_image', upload)
-                        return response_ok(upload.id)
-                upload = Upload.objects._addnew(file)
-                if upload:
-                    OrderImages.objects.create(order_id=order_id, type=type, image=upload)
-                    return response_ok(upload.id)
-                return response_error('上传失败,请重新上传!')
+                        OrderImages.objects.filter(order=order, image_id=upload_id).delete()
+                        return response_ok()
+                return response_error('图片参数错误,删除失败')
         except CustomError as e:
             return response_error(e.get_error_msg())
         except Exception as e:
@@ -325,7 +349,34 @@ class OrderViewSet(CustomModelViewSet):
                 'type': '0',
             }
             result.append(item)
-        return response_ok(result)
+
+        files = []
+        types = OrderImages.TYPE_CHOICE
+        for t in types:
+            edit_values = OrderDetailEdit.objects.filter(order=instance, type=OrderDetailEdit.ONE,
+                                                         value=t[0]).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': t[0],  # 身份证
+                'label': t[1],  # 身份证
+                'images': [],  # 1
+                'edit_time': edit_time,
+                'reason': reason,
+                'type': '1',
+            }
+            images = OrderImages.objects.filter(order=instance, type=t[0])
+            for image in images:
+                item['images'].append(image.image.get_path())
+            files.append(item)
+        edit_dict = {
+            'order_info':result,
+            'image_info':files,
+        }
+        return response_ok(edit_dict)
 
     def destroy(self, request, *args, **kwargs):
         try:

+ 137 - 62
uis/views/order/order_detail_check.html

@@ -39,47 +39,66 @@
         }
 
         .imgStyle {
-            padding-left: 10px;
+            padding: 10px;
             width: 80px;
-            height: 50px;
+            height: 80px;
         }
 
+        .layui-table-cell {
+            font-size: 14px;// table自动换行
+            padding: 0 5px;
+            height: auto;
+            overflow: visible;
+            text-overflow: inherit;
+            white-space: normal;
+            word-break: break-all;
+        }
     </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 class="layui-tab layui-tab-card">
+    <ul class="layui-tab-title">
+        <li class="layui-this">资料详情</li>
+        <li>图片详情</li>
+    </ul>
+    <div class="layui-tab-content" style="background-color: #fff;">
+        <div class="layui-tab-item layui-show">
+
+            <form class="layui-form" action="" lay-filter="component-form-check">
+                <button class="layui-btn" id="id_save_edit" lay-submit lay-filter="component-form-check"
+                        style="display: none">保存
+                </button>
+            </form>
+            <form class="layui-form" action="" lay-filter="component-form-check">
+                <button class="layui-btn" id="id_save_pass" lay-submit lay-filter="component-form-check"
+                        style="display: none">保存
+                </button>
+            </form>
+
+            <div id="tableRes" class="table-overlay">
+                <table id="dataTable" lay-filter="dataTable" class="layui-hide"></table>
             </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 class="layui-tab-item">
+            <div id="tableResImage" class="table-overlay">
+                <table id="imageTable" lay-filter="imageTable-operate" class="layui-hide"></table>
+                <script type="text/html" id="datagrid-operate-bar">
+                    {{# for(var i in d.images){ }}
+                    <a lay-event="view_{{ i }}" id="image_{{ i }}">
+                        <img src="{{ d.images[i] }}" class="imgStyle"/>
+                    </a>
+                    {{# } }}
+                </script>
             </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/' //静态资源所在路径
@@ -114,11 +133,31 @@
             ]]
         });
 
+        var tbImageWidth = $("#tableResImage").width();
+        var layTableImageId = "layTableImage";
+        var tableImageIns = table.render({
+            elem: '#imageTable',
+            id: layTableImageId,
+            data: [],
+            width: tbImageWidth,
+            page: false,
+            limit: 100,
+            loading: true,
+            even: true, //不开启隔行背景
+            cols: [[
+                {title: '序号', type: 'numbers'},
+                {field: 'label', title: '名称', width: '15%',},
+                {field: 'images', title: '图片', toolbar: '#datagrid-operate-bar', width: '40%',},
+                {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 rows = res.data.order_info;
                     var oldData = table.cache[layTableId];
                     for (var k in rows) {
                         oldData.push(
@@ -135,51 +174,87 @@
                     tableIns.reload({
                         data: oldData
                     });
+
+                    var image_rows = res.data.image_info;
+                    var oldImageData = table.cache[layTableImageId];
+                    for (var i in image_rows) {
+                        oldImageData.push(
+                            {
+                                label: image_rows[i].label,
+                                images: image_rows[i].images,
+                                name: image_rows[i].name,
+                                edit_time: image_rows[i].edit_time,
+                                reason: image_rows[i].reason,
+                                type: image_rows[i].type,
+                            }
+                        )
+                    }
+                    tableImageIns.reload({
+                        data: oldImageData
+                    });
                 }
                 else
                     layer.msg('获取内容失败', {icon: 5});
             }
         });
+
+        //监听工具条
+        table.on('tool(imageTable-operate)', function (obj) {
+            var imgsList = obj.data.images;
+            var index = obj.event.split('_')[1]
+            var newPage = window.open();
+            newPage.document.write("<img src=" + imgsList[index] + " />")
+        })
         //保存
-        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);
+        form.on('submit(component-form-check)', function (data) {
+            if (data.elem.id === "id_save_pass") {
+                admin.req({
+                    url: '/order/' + id + '/checkEdit/?statu=1'
+                    , data: {items: []}
+                    , type: 'post'
+                    , done: function (res) {
+                        parent.layui.onSubmitPass(res);
+                    }
+                });
+            } else if (data.elem.id === "id_save_edit") {
+                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);
+                var image_rows = table.cache[layTableImageId];
+                for (var i in image_rows) {
+                    if (image_rows[i].reason) {
+                        var item2 = {
+                            name: image_rows[i].name,
+                            reason: image_rows[i].reason,
+                            type: image_rows[i].type,
+                        };
+                        items.push(item2);
+                    }
                 }
-            });
-
-            return false;
-        });
 
-        form.on('submit(component-form-pass)', function (data) {
-            admin.req({
-                url: '/order/' + id + '/checkEdit/?statu=1'
-                , data: {items:[]}
-                , type: 'post'
-                , done: function (res) {
-                    parent.layui.onSubmitPass(res);
+                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;
         });
         parent.layui.submitEdit = function () {