Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	apps/customer/views.py
wushaodong 4 лет назад
Родитель
Сommit
dd406b0591

+ 48 - 41
apps/customer/views.py

@@ -210,29 +210,33 @@ class NewCustomerViewSet(CustomModelViewSet):
                 if serializer.is_valid(raise_exception=True):
                     serializer.save()
 
-                sort = 1
-                track_day = 1
-                try:
-                    sort = int(instance.stage_progress.sort)
-                    track_day = int(instance.stage_progress.track_day)
-                except:
-                    pass
-                # 预定客户,sort排序大于1,提交跟踪报告此字段为空
-                if sort > 1 or not next_time:
-                    next_time = (timezone.now() + datetime.timedelta(days=track_day)).strftime('%Y-%m-%d')
-                data = {
-                    'potential_level': potential_level or None,  # 预定客户,sort排序大于1,,无客户等级
-                    'next_time': next_time,
-                    'end_time': timezone.now(),
-                    'stage_progress': instance.stage_progress.id,
-                    'status': NewCustomer.NORMAL,
-                }
-                # TODO 如果客户已放弃,再次跟踪后自动改成正常客户,同时工单状态改成正常
-                if instance.status == NewCustomer.ABANDONED:
-                    data['status'] = NewCustomer.NORMAL
-                ser = self.serializer_class(instance, data=data, partial=True)
-                if ser.is_valid(raise_exception=True):
-                    ser.save()
+            sort = 1
+            track_day = 1
+            try:
+                sort = int(instance.stage_progress.sort)
+                track_day = int(instance.stage_progress.track_day)
+            except:
+                pass
+            # 预定客户,sort排序大于1,提交跟踪报告此字段为空
+            if sort > 1 or not next_time:
+                next_time = (timezone.now() + datetime.timedelta(days=track_day)).strftime('%Y-%m-%d')
+            data = {
+                'potential_level':potential_level or None, #预定客户,sort排序大于1,,无客户等级
+                'next_time':next_time,
+                'end_time':timezone.now(),
+                'stage_progress':instance.stage_progress.id,
+                'status':NewCustomer.NORMAL,
+            }
+            # TODO 如果客户已放弃,再次跟踪后自动改成正常客户,同时工单状态改成正常
+            if instance.status == NewCustomer.ABANDONED:
+                data['status'] = NewCustomer.NORMAL
+                order = Order.objects.filter(customer=instance).first()
+                if order:
+                    order.status = Order.NORMAL
+                    order.save()
+            ser = self.serializer_class(instance, data=data, partial=True)
+            if ser.is_valid(raise_exception=True):
+                ser.save()
 
         except ValidationError as e:
             traceback.print_exc()
@@ -370,24 +374,27 @@ class ReviewViewSet(CustomModelViewSet):
         check_comment = request.POST.get('check_comment')
         next_time = request.POST.get('next_time')
         try:
-            with transaction.atomic():
-                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.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.save()
-                    instance.customer.status = NewCustomer.ABANDONED
-                    # TODO 如果客户已下单,把工单状态改成放弃
-                instance.customer.next_time = next_time
-                instance.customer.save()
+            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.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.save()
+                instance.customer.status = NewCustomer.ABANDONED
+                # TODO 如果客户已下单,把工单状态改成放弃
+                order = Order.objects.filter(customer=instance.customer).first()
+                if order:
+                    order.status = Order.ABANDONED
+                    order.save
+            instance.customer.next_time = next_time
+            instance.customer.save()
         except CustomError as e:
             return response_error(e.get_error_msg())
         except Exception as e:

+ 1 - 1
apps/order/models.py

@@ -53,7 +53,7 @@ class Order(models.Model):
             id = int(id)
         except:
             raise CustomError('无效的报修单ID')
-        instance = Order.objects.filter(pk=id, delete=False).first()
+        instance = Order.objects.filter(pk=id).first()
         if not instance:
             raise CustomError('未找到对应的报修工单')
         return instance

+ 2 - 4
uis/views/agent/index.html

@@ -115,24 +115,22 @@
 
                     <script type="text/html" id="total-agent-operate-bar">
                         <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-xs" lay-event="agent_edit" data-permission="agent.add_general_agent"
+                            <a class="layui-btn layui-btn-xs" lay-event="agent_edit"
                             >修改</a>
                         </div>
                         <div class="layui-btn-group">
                             <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="agent_del"
-                               data-permission="agent.delete_general_agent"
                             >删除</a>
                         </div>
                     </script>
 
                     <script type="text/html" id="agent-operate-bar">
                         <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-xs" lay-event="agent_edit" data-permission="agent.add_agent"
+                            <a class="layui-btn layui-btn-xs" lay-event="agent_edit"
                             >修改</a>
                         </div>
                         <div class="layui-btn-group">
                             <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="agent_del"
-                               data-permission="agent.delete_agent"
                             >删除</a>
                         </div>
                     </script>

+ 94 - 25
uis/views/customer/index.html

@@ -63,6 +63,17 @@
             background-color: red;
             color: #fff;
         }
+
+        .treeContent{
+            height: 30vh;
+            overflow-y: scroll;
+            margin-bottom: 10px;
+            border: 1px solid rgba(0,0,0,0.1);
+        }
+        /*隐藏滚动条*/
+        .treeContent::-webkit-scrollbar {
+            height: 0 !important;width:0px !important;
+        }
     </style>
 
 </head>
@@ -109,24 +120,13 @@
 
                     <div class="tableContent">
                         <div style="width: 345px">
-                            <table class="layui-hide" id="customer_log" lay-filter="customer-operate-log"></table>
+                            <div class="treeContent demo-tree" id="id_tree"></div>
+                            <table id="customer_log" lay-filter="customer-operate-log"></table>
                         </div>
                         <div style="width: calc(100% - 360px)">
-                            <table class="layui-hide" id="customer_datagrid" lay-filter="customer-operate"></table>
+                            <table id="customer_datagrid" lay-filter="customer-operate"></table>
                         </div>
                     </div>
-
-                    <script type="text/html" id="customer-operate-bar">
-                        <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-xs" lay-event="customer_search"
-                            >查看</a>
-                        </div>
-                        <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="add_review"
-                               data-permission="customer.view_new_customer"
-                            >跟踪报告</a>
-                        </div>
-                    </script>
                 </div>
             </div>
         </div>
@@ -138,10 +138,11 @@
         base: '../../../layuiadmin/' //静态资源所在路径
     }).extend({
         index: 'lib/index' //主入口模块
-    }).use(['index', 'table', 'form',], function () {
+    }).use(['index', 'table', 'form', 'tree'], function () {
         var $ = layui.$;
         var table = layui.table
             , form = layui.form
+            , tree = layui.tree
             , admin = layui.admin;
 
         admin.req({
@@ -169,13 +170,35 @@
             elem: '#customer_log'
             , url: '/customer/stage_count/'
             , cols: [[
-                {field: 'stage', title: '阶段', width: 100}
-                , {field: 'total_count', title: "总数", width: 80, sort: true}
-                , {field: 'today_count', title: '今日', width: 80, sort: true}
-                , {field: 'overdue_count', title: '逾期', width: 80, sort: true}
+                {field: 'stage', title: '阶段', event: 'stage', width: 100}
+                , {field: 'total_count', title: "总数", event: 'total', width: 80, sort: true}
+                , {field: 'today_count', title: '今日', event: 'today', width: 80, sort: true}
+                , {field: 'overdue_count', title: '逾期', event: 'overdue', width: 80, sort: true}
             ]]
         });
 
+        //操作栏的模板字符串
+        var templateToolbar = `<div class="layui-btn-group">
+            <a class="layui-btn layui-btn-xs" lay-event="customer_search"
+            >查看</a>
+            <a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="add_review"
+            >跟踪报告</a>
+            <a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="internal_trace"
+            >内部跟踪</a>
+        </div>`;
+
+        //判断内部跟踪权限
+        var permissions = layui.data(layui.setter.tableName)['permissions'];
+        var is_has = permissions.indexOf('inner_review') !== -1;
+        if (!is_has) {
+            templateToolbar = `<div class="layui-btn-group">
+                <a class="layui-btn layui-btn-xs" lay-event="customer_search"
+                >查看</a>
+                <a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="add_review"
+                >跟踪报告</a>
+            </div>`;
+        }
+
         table.render({
             elem: '#customer_datagrid'
             , url: '/customer/new_customer/'
@@ -201,12 +224,27 @@
                 , {field: 'create_time_f', title: '建档时间', width: 150}
                 , {field: 'create_user_text', title: '建档人', width: 100}
                 , {field: 'notes', title: '备注', width: 200}
-                , {width: 140, align: 'center', fixed: 'right', toolbar: '#customer-operate-bar'}
+                , {width: is_has ? 220 : 160, align: 'center', fixed: 'right', toolbar: templateToolbar}
             ]]
             , page: true
             , height: 'full-108'
         });
 
+         admin.req({
+            url: '/account/store/tree/?id=' + 43
+            , done: function (res) {
+                tree.render({
+                    elem: '#id_tree'  //绑定元素
+                   ,onlyIconControl: true
+                  ,data: res.data
+                  //点击菜单时触发
+                  ,click: function(obj) {
+                    console.log(obj.data, "oppppppp")
+                  }
+                });
+            }
+        });
+
         function createFollowReport(customer_id, stage_progress_sort) {
             layer.open({
                 type: 2,
@@ -278,20 +316,51 @@
             } else if (obj.event === 'add_review') {
                 //添加跟踪报告
                 createFollowReport(data.id, data.stage_progress_sort)
+            }else if(obj.event === 'internal_trace'){
+                layer.open({
+                    type: 2,
+                    title: '内部跟踪',
+                    area: ['35%', '50%'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitChild = function (res) {
+                            if (res.code === 0) {
+                                layer.msg('添加成功!', {icon: 1})
+                            }
+                            layer.close(index);
+                            //刷新表格
+                            table.reload('customer_log', {});
+                            table.reload('customer_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'internal_trace.html?customer_id=' + data.id + '&stage_progress_sort=' + data.stage_progress_sort
+                });
             }
         });
 
-        table.on('row(customer-operate-log)', function (obj) {
+        // 点击表格触发
+        table.on('tool(customer-operate-log)', function(obj){
             var data = obj.data;
+            let tool_event = obj.event;
+            let params = {};
+            params['stage_progress'] = data.stage_id;
+            if(tool_event === 'today'){
+                params['today'] = 'today';
+            }else if(tool_event === 'overdue'){
+                params['overdue'] = 'overdue';
+            };
             table.reload('customer_datagrid', {
-                where: {stage_progress: data.stage_id}
+                where: params
                 , page: {curr: 1}
             });
-
-            //标注选中样式
-            obj.tr.addClass('layui-table-click').siblings().removeClass('layui-table-click');
         });
 
+
+
         var _params = {};
         form.on('submit(query-form-element)', function (data) {
             _params = data.field;

+ 111 - 0
uis/views/customer/internal_trace.html

@@ -0,0 +1,111 @@
+<!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>
+        .input {
+            border-radius: 2px;
+            height: 38px;
+            border-width: 1px;
+            border-color: lightgray;
+            border-style: solid;
+            background-color: white;
+            padding-left: 3px;
+        }
+        .layui-form-label{
+            width: 100px !important;
+        }
+        .layui-input-block{
+            margin-left: 135px;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-card">
+
+            <div class="layui-card-body" pad15>
+                <form class="layui-form" action="" lay-filter="component-form-element">
+                    <div class="layui-row layui-col-space10 layui-form-item">
+                        <div>
+                            <label class="layui-form-label"><font color='red' size="4">*</font>回访情况:</label>
+                            <div class="layui-input-block">
+                                <textarea type="text" name="description" lay-verify="required" class="layui-textarea"
+                                          placeholder="请填写回访情况"/></textarea>
+                            </div>
+                        </div>
+                        <div>
+                            <label class="layui-form-label">抄送业务员:</label>
+                            <div class="layui-input-block">
+                                <input type="radio" name="is_entry" value="1" title="是">
+                                <input type="radio" name="is_entry" value="0" title="否" checked>
+                            </div>
+                        </div>
+                        <div class="layui-hide" id="next_time_div">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>下次回访:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="next_time" class="layui-input" id="next_time" lay-verify="required"
+                                       placeholder="修改下次回访日期">
+                            </div>
+                        </div>
+
+                        <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element"
+                                style="display: none">保存
+                        </button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index', 'form', 'laydate'], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , laydate = layui.laydate
+            , form = layui.form;
+        laydate.render({
+            elem: '#next_time'
+        });
+        var customer_id = layui.view.getParameterByName('customer_id');
+        // 自定义进度的排序,只有排序为1的,是潜客,可以修改客户等级
+        var stage_progress_sort = layui.view.getParameterByName('stage_progress_sort');
+        if(stage_progress_sort && parseFloat(stage_progress_sort) === 1){
+            $('#level_div').removeClass('layui-hide')
+            $('#next_time_div').removeClass('layui-hide')
+        }
+
+        form.on('submit(component-form-element)', function (data) {
+            admin.req({
+                url: '/customer/new_customer/'+customer_id+'/add_review/'
+                , data: data.field
+                , type: 'post'
+                , done: function (res) {
+                    parent.layui.onSubmitChild(res);
+                }
+            });
+
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>