wushaodong 4 lat temu
rodzic
commit
5c5644eada

+ 6 - 6
apps/customer/views.py

@@ -277,14 +277,14 @@ class NewCustomerViewSet(CustomModelViewSet):
                         'customer': instance,
                         'service_user': instance.track_user,
                         'store': instance.store,
+                        'notes': instance.notes,
                     }
-                    ser = Order.objects.create(**data)
-                    ser.notes = instance.notes
-                    ser.no = ser.get_no()
-                    ser.save()
+                    order = Order.objects.create(**data)
+                    order.no = order.get_no()
+                    order.save()
                     projects = instance.project.all()
                     for project in projects:
-                        ser.project.add(project.id)
+                        order.project.add(project.id)
                 # 创建订单流程,保存图片
                 user = self.request.user
                 operation = u'更新进度为:{}'.format(order.stage_progress.name)
@@ -382,7 +382,7 @@ class GetReviewViewSet(CustomModelViewSet):
 
     @permission_required('customer.view_new_customer')
     def filter_queryset(self, queryset):
-        # TODO 过滤记录中是否抄送业务员
+        # 过滤记录中是否抄送业务员
         if len(self.request.user.get_manager_range()) == 0:
             queryset = queryset.filter(is_copy=True)
         f = ReviewFilter(self.request.GET, queryset=queryset)

+ 1 - 1
apps/order/models.py

@@ -44,7 +44,7 @@ class Order(models.Model):
 
     def get_no(self):
         now = timezone.now()
-        no = '%s%d-%s' % ('DD', self.service_user.id, now.strftime('%Y%m%d%H%M%S'))
+        no = '%s%d-%s' % ('DD', self.store.id, now.strftime('%Y%m%d%H%M%S'))
         return no
 
     @staticmethod

+ 46 - 10
apps/order/views.py

@@ -3,28 +3,29 @@ import traceback
 from rest_framework.views import APIView
 from rest_framework.decorators import action
 from django.db import transaction
-from django.conf import settings
-
+import datetime
+from django.utils import timezone
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
-from .serializers import OrderSerializer,ProgressDetailsSerializer
+from .serializers import OrderSerializer, ProgressDetailsSerializer
 from .filters import OrderFilter
 from apps.log.models import BizLog
 from django.db.models import Q
 from utils import response_ok, response_error
 from utils.permission import isLogin, check_permission
-from apps.customer.models import NewCustomer
-from apps.order.models import Order,ProgressDetails
+from apps.customer.models import NewCustomer, NewCustomerRemind
+from apps.order.models import Order, ProgressDetails
 from apps.option.models import Option
 from apps.upload.models import Upload
 from apps.upload.serializers import UploadSerializer
 
+
 class GetProcessView(APIView):
     permission_classes = [isLogin]
 
     def get(self, request):
         customer_id = request.query_params.get('customer_id')
-        dispatch = request.query_params.get('dispatch') # 分配服务人员,
+        dispatch = request.query_params.get('dispatch')  # 分配服务人员,
 
         instance = NewCustomer.objects.filter(id=customer_id).first()
         if not instance:
@@ -44,9 +45,9 @@ class GetProcessView(APIView):
                                        enable=True).order_by('sort').first()
         if option:
             data = {
-                'now_process_text':instance.stage_progress.name,
-                'next_process_text':option.name,
-                'next_process_id':option.id,
+                'now_process_text': instance.stage_progress.name,
+                'next_process_text': option.name,
+                'next_process_id': option.id,
             }
             return response_ok(data)
         else:
@@ -76,6 +77,41 @@ class OrderViewSet(CustomModelViewSet):
             return None
         return self.paginator.paginate_queryset(queryset, self.request, view=self)
 
+    @action(methods=['post'], detail=True)
+    def dispatch_service(self, request, pk):
+        # 订单分配服务人员
+        check_permission(request, 'order.order_process_dispatch')
+        stage_progress = request.POST.get('stage_progress')
+        service = request.POST.get('service')
+
+        try:
+            with transaction.atomic():
+                stage_progress = Option.objects.filter(id=stage_progress, enable=True).order_by('sort').first()
+                if not stage_progress:
+                    raise CustomError('阶段进度有误,请刷新重试!')
+                if not stage_progress.track_day:
+                    raise CustomError('下一阶段进度,没有可用跟踪天数,请联系管理员设置!')
+                Order.objects.filter(id=pk).update(stage_progress=stage_progress, service_user_id=service,
+                                                   status=Order.NORMAL)
+
+                next_time = (timezone.now() + datetime.timedelta(days=stage_progress.track_day)).strftime('%Y-%m-%d')
+                # 更新进度,删除上一个跟踪人提醒
+                order = self.get_object()
+                NewCustomerRemind.objects.filter(customer=order.customer, remind_user=order.customer.track_user).delete()
+                NewCustomer.objects.filter(id=order.customer_id).update(
+                    stage_progress=stage_progress,
+                    track_user_id=service,
+                    next_time=next_time,
+                )
+                NewCustomerRemind.objects.create(customer=order.customer, remind_user_id=service, next_time=next_time)
+                operation = u'分配服务人员为:{}'.format(order.service_user.name)
+                ProgressDetails.objects.create(order=order, user=request.user, operation=operation,)
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            return response_error(str(e))
+        return response_ok()
+
 
 class GetDetailsView(APIView):
     permission_classes = [isLogin]
@@ -96,4 +132,4 @@ class GetFilesView(APIView):
         id = request.GET.get('id')
         images = Upload.objects.filter(progress_details_id=id)
         img_data = UploadSerializer(images, many=True).data
-        return response_ok(img_data)
+        return response_ok(img_data)

+ 2 - 2
uis/views/index.html

@@ -113,10 +113,10 @@
                           <cite>订单作业</cite>
                       </a>
                       <dl class="layui-nav-child">
-                          <dd data-name="nav" data-permission="customer.view_report_customer">
+                          <dd data-name="nav" data-permission="order.view_order">
                               <a lay-href="order/index.html">订单管理</a>
                           </dd>
-                          <dd data-name="nav" data-permission="customer.view_report_customer">
+                          <dd data-name="nav" data-permission="order.order_process_dispatch">
                               <a lay-href="order/dispatch_process_index.html">进度分配</a>
                           </dd>
                       </dl>

+ 2 - 2
uis/views/order/detail.html

@@ -97,10 +97,10 @@
             elem: '#customer_datagrid'
             , url: '/order/get_details/?order_id=' + order_id
             , cols: [[
-                {field: 'operation', title: "操作", width: 200}
+                {field: 'operation', title: "操作", width: 280}
                 , {field: 'operation_time_f', title: '操作时间', width: 150}
                 , {field: 'notes', title: '备注', width: 200}
-                , {field: 'user_text', title: '操作人', width: 120}
+                , {field: 'user_text', title: '操作人', width: 150}
                 , {width: 100, align: 'center', fixed: 'right', toolbar: '#customer-operate-bar'}
             ]]
             , page: true

+ 16 - 2
uis/views/order/dispatch_process_edit.html

@@ -110,7 +110,7 @@
             , form = layui.form;
 
         var customer_id = layui.view.getParameterByName('customer_id');
-        //form.render(null, 'component-form-element');
+        var order_id = layui.view.getParameterByName('order_id');
         var next_process_id = '';
         admin.req({
             url: '/order/get_process/?customer_id=' + customer_id + '&dispatch=1'
@@ -138,6 +138,19 @@
             }
         });
 
+        admin.req({
+            url: '/customer/get_user/',
+            done: function (res) {
+                var data_user = res.data;
+                var user_node = $('#id_service');
+                for (var i in data_user) {
+                    var pid = data_user[i].value;
+                    var name = data_user[i].lable;
+                    user_node.append("<option value='" + pid + "'>" + name + "</option>");
+                }
+                form.render()
+            }
+        });
 
         form.on('submit(component-form-element)', function (data) {
             var submitData = data.field;
@@ -145,7 +158,8 @@
                 layer.msg("下个进度阶段有误,请刷新重试!", {icon: 2});
                 return false
             }
-            var url = '/customer/new_customer/' + customer_id + '/add_order/';
+            submitData['stage_progress'] = next_process_id
+            var url = '/order/' + order_id + '/dispatch_service/';
             admin.req({
                 url: url
                 , data: submitData

+ 8 - 11
uis/views/order/dispatch_process_index.html

@@ -118,7 +118,7 @@
 
         table.render({
             elem: '#dispatch_process_datagrid'
-            , url: '/order/'
+            , url: '/order/?status=3'
             , title: '订单管理'
             , cols: [[
                 {field: 'no', title: '单号', width: 180}
@@ -127,8 +127,8 @@
                 , {field: 'address', title: '地址', width: 200}
                 , {field: 'village', title: '小区', width: 200}
                 , {field: 'project_text', title: '项目', width: 120}
-                , {field: 'current_follow_user', title: '当前跟踪人', width: 100}
-                , {field: 'apply_process', title: "申请进度", width: 150}
+                , {field: 'stage_progress_text', title: "申请进度", width: 150}
+                , {field: 'service_user_text', title: '当前服务人', width: 150}
                 , {width: 150, align: 'center', fixed: 'right', toolbar: '#order-operate-bar'}
             ]]
             , page: true
@@ -151,25 +151,22 @@
                layer.open({
                 type: 2,
                 title: '查看详情',
-                area: ['45%', '80%'],
-                btn: ['取消'],
+                area: ['55%', '80%'],
+                btn: ['关闭'],
                 btn1: function (index, layero) {
                     layer.close(index);//关闭当前按钮
                 },
-                content: 'detail.html?id=' + data.id
+                content: 'detail.html?order_id=' + data.id
             });
             }else if(obj.event === "order_update"){
                 // 更新进度
                 layer.open({
                     type: 2,
                     title: '分配',
-                    area: ['30%', '45%'],
+                    area: ['40%', '55%'],
                     btn: ['保存','取消'],
                     yes: function (index, dom) {
                         layui.onSubmitChild = function (res) {
-                            if (res.code === 0) {
-                                layer.msg('分配成功!', {icon: 1})
-                            }
                             layer.close(index);
                             table.reload('order_datagrid', {});
                         };
@@ -178,7 +175,7 @@
                     btn2: function (index, layero) {
                         layer.close(index);//关闭当前按钮
                     },
-                    content: 'dispatch_process_edit.html?customer_id=' + data.id
+                    content: 'dispatch_process_edit.html?customer_id=' + data.customer +'&order_id=' + data.id
                 });
             }
         });

+ 1 - 1
uis/views/order/imgsInfo.html

@@ -64,7 +64,7 @@
             , cols: [[
                 {field: 'create_time_f', title: "上传时间", width: 220}
                 , {field: 'file_size', title: '文件大小', width: 120}
-                , {field: 'user_text', title: '上传人', width: 120}
+                , {field: 'user_text', title: '上传人', width: 150}
                 , {width: 80, align: 'center', fixed: 'right', toolbar: '#customer-imgs-operate-bar'}
             ]]
         });

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

@@ -175,7 +175,7 @@
                 type: 2,
                 title: '查看详情',
                 area: ['55%', '80%'],
-                btn: ['取消'],
+                btn: ['关闭'],
                 btn1: function (index, layero) {
                     layer.close(index);//关闭当前按钮
                 },

+ 1 - 1
uis/views/report_check/divide.html

@@ -31,7 +31,7 @@
                 <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>
+                            <label class="layui-form-label"><font color='red' size="4">*</font>选择客户经理:</label>
                             <div class="layui-input-block">
                                 <select lay-verify="required" name="user" id="id_user">
                                     <option value="">请选择人员</option>

+ 3 - 2
utils/__init__.py

@@ -1,5 +1,5 @@
 #coding=utf-8
-
+import traceback
 from rest_framework import status
 from rest_framework.response import Response
 
@@ -7,6 +7,7 @@ def response_error(msg, errcode=None):
     code = 1
     if errcode:
         code = errcode
+    traceback.print_exc()
     return Response({"code":code, "msg": msg}, status=status.HTTP_200_OK)
 
 def response_ok(data=None):
@@ -21,4 +22,4 @@ def get_remote_addr(request):
         ip = x_forwarded_for.split(',')[0]
     else:
         ip = request.META.get('REMOTE_ADDR')
-    return ip
+    return ip