Prechádzať zdrojové kódy

Merge branch 'master' of http://git.zzliaoyuan.com:4000/wushaodong/decorate

lijiangwei 4 rokov pred
rodič
commit
6d054dbb98

+ 2 - 1
apps/account/serializers.py

@@ -72,7 +72,8 @@ class EmployeeSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = User
-        fields = '__all__'
+        # fields = '__all__'
+        exclude = ('password',)
 
     def create(self, validated_data):
         username = self.initial_data['username']

+ 2 - 13
apps/customer/serializers.py

@@ -166,17 +166,6 @@ class NewCustomerSerializer(serializers.ModelSerializer):
 
     def update(self, instance, validated_data):
         instance = super(NewCustomerSerializer, self).update(instance, validated_data)
-        order = Order.objects.filter(customer=instance).first()
-        if not order:
-            order = Order.objects.create(customer=instance, service_user_id=instance.track_user.id, status=Order.NORMAL,
-                                         stage_progress=instance.stage_progress)
-            projects = instance.project.all()
-            for project in projects:
-                order.project.add(project.id)
-            order.no = order.get_no()
-            order.save()
-        if order:
-            Order.objects.filter(no=order.no).update(stage_progress=instance.stage_progress)
         return instance
 
 
@@ -185,9 +174,9 @@ class ReviewSerializer(serializers.ModelSerializer):
     check_user_text = serializers.CharField(source='check_user.name', read_only=True)
     check_status_text = serializers.CharField(source='get_check_status_display', read_only=True)
     create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
-                                           read_only=True)
+                                              read_only=True)
     check_time_f = serializers.DateTimeField(source='check_time', format=settings.SHORT_DATETIME_FORMAT,
-                                           read_only=True)
+                                             read_only=True)
 
     next_time_f = DateCharField(source='customer.next_time', read_only=True)
     is_giveup_text = BooleanCharField(source='is_giveup', read_only=True)

+ 2 - 9
apps/customer/views.py

@@ -86,7 +86,7 @@ class ReportCustomerViewSet(CustomModelViewSet):
                                        track_user_id=user_id, next_time=next_time, stage_progress=stage_progress,
                                        create_user=instance.create_user,store=instance.store,
                                        name=instance.name,tel=instance.tel,village=instance.village,
-                                       address=instance.address,source=instance.source,notes=instance.notes,
+                                       address=instance.address, source=instance.source, notes=instance.notes,
                                        )
             projects = instance.project.all()
             for project in projects:
@@ -255,6 +255,7 @@ class NewCustomerViewSet(CustomModelViewSet):
                         'service_user': instance.track_user,
                     }
                     ser = Order.objects.create(**data)
+                    ser.notes = instance.notes
                     ser.no = ser.get_no()
                     ser.save()
                     projects = instance.project.all()
@@ -343,11 +344,3 @@ class ReviewViewSet(CustomModelViewSet):
         except Exception as e:
             return response_error(str(e))
         return response_ok()
-
-
-
-
-
-
-
-

+ 1 - 0
apps/order/__init__.py

@@ -0,0 +1 @@
+# coding=utf-8

+ 13 - 12
apps/order/models.py

@@ -5,6 +5,7 @@ from django.utils import timezone
 from apps.option.models import Option
 from apps.customer.models import NewCustomer
 from utils.format import strftime
+from utils.exceptions import CustomError
 
 class Order(models.Model):
     NORMAL = 1
@@ -43,6 +44,17 @@ class Order(models.Model):
         no = '%s%d-%s' % ('DD', self.service_user.id, now.strftime('%Y%m%d%H%M%S'))
         return no
 
+    @staticmethod
+    def get_instance_by_id(id):
+        try:
+            id = int(id)
+        except:
+            raise CustomError('无效的报修单ID')
+        instance = Order.objects.filter(pk=id, delete=False).first()
+        if not instance:
+            raise CustomError('未找到对应的报修工单')
+        return instance
+
 
 class ProgressDetails(models.Model):
 
@@ -57,15 +69,4 @@ class ProgressDetails(models.Model):
         db_table = 'progress_details'
         verbose_name = '进度明细'
         ordering = ('-id', )
-        default_permissions = ()
-
-    def get_details(self):
-        dict = {
-            'progress_details_id': self.id,
-            'operation': self.operation,
-            'user': self.user.name,
-            'notes': self.notes,
-            'operation_time': strftime(self.operation_time),
-        }
-
-        return dict
+        default_permissions = ()

+ 5 - 3
apps/order/serializers.py

@@ -1,12 +1,12 @@
 # coding=utf-8
 from rest_framework import serializers
 from .models import Order,ProgressDetails
-from utils.booleancharfield import TimeCharField
-
+from django.conf import settings
 
 class OrderSerializer(serializers.ModelSerializer):
     service_user_text = serializers.CharField(source='service_user.name', read_only=True)
-    create_time_f = TimeCharField(source='create_time', 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)
 
     name = serializers.CharField(source='customer.name', read_only=True)
@@ -27,6 +27,8 @@ class OrderSerializer(serializers.ModelSerializer):
 
 class ProgressDetailsSerializer(serializers.ModelSerializer):
     user_text = serializers.CharField(source='user.name', read_only=True)
+    operation_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
+                                                 read_only=True)
 
 
     class Meta:

+ 18 - 19
apps/order/views.py

@@ -1,9 +1,13 @@
 # coding=utf-8
 import traceback
-from utils.custom_modelviewset import CustomModelViewSet
 from rest_framework.views import APIView
+from rest_framework.decorators import action
+from django.db import transaction
+from django.conf import settings
+
+from utils.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
-from .serializers import OrderSerializer
+from .serializers import OrderSerializer,ProgressDetailsSerializer
 from .filters import OrderFilter
 from apps.log.models import BizLog
 from utils import response_ok, response_error
@@ -12,19 +16,23 @@ from apps.customer.models import NewCustomer
 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') # 分配服务人员,
+
         instance = NewCustomer.objects.filter(id=customer_id).first()
         if not instance:
             raise CustomError('当前客户信息有误,请刷新重试!')
         if instance.stage_progress.end_stage:
             raise CustomError('当前客户进度已到最后阶段,请勿重复更新!')
         order = Order.objects.filter(customer=instance).first()
-        if order and order.status == Order.WAIT_DISPATCH:
+        # 分配服务人员,不做重复更新判断
+        if order and order.status == Order.WAIT_DISPATCH and not dispatch:
             data = {
                 'error': True,
                 'error_message': u'当前客户订单等待分配中,请勿重复更新!',
@@ -68,28 +76,19 @@ class GetDetailsView(APIView):
     permission_classes = [isLogin]
 
     def get(self, request):
+        # 进度明细
         order_id = request.GET.get('order_id')
         details = ProgressDetails.objects.filter(order_id=order_id).order_by('-operation_time')
-        data = []
-        for detail in details:
-            dict = detail.get_details()
-            data.append(dict)
+        data = ProgressDetailsSerializer(details, many=True).data
         return response_ok(data)
 
+
 class GetFilesView(APIView):
     permission_classes = [isLogin]
 
     def get(self, request):
-        progress_details_id = request.GET.get('progress_details_id')
-        images = Upload.objects.filter(progress_details_id=progress_details_id)
-        img_data = []
-        for img in images:
-            img_data.append(
-                {
-                    'url': img.picture,
-                    'create_time': img.create_time,
-                    'file_size': img.file_size,
-                    'user': img.user.name,
-                }
-            )
+        # 附件内容
+        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)

+ 4 - 1
apps/upload/serializers.py

@@ -6,7 +6,10 @@ from .models import Upload
 
 
 class UploadSerializer(serializers.ModelSerializer):
+    user_text = serializers.CharField(source='user.name', read_only=True)
+    create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
+                                              read_only=True)
 
     class Meta:
         model = Upload
-        fields = ('picture', 'width', 'height', 'type', 'voice_time')
+        fields = ('picture', 'create_time_f', 'file_size', 'user_text')

+ 1 - 0
uis/views/employee/index.html

@@ -101,6 +101,7 @@
                 , {field: 'gender_text', title: '性别', width: 80}
                 , {field: 'tel', title: '电话', width: 120}
                 , {field: 'username', title: '账号', width: 120}
+                , {field: 'general_agent_text', title: '总代理', width: 150}
                 , {field: 'agent_text', title: '代理商', width: 150}
                 , {field: 'store_text', title: '门店', width: 150}
                 , {field: 'enable_text', title: '是否在用', width: 100}

+ 3 - 9
uis/views/order/detail.html

@@ -9,7 +9,6 @@
           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>
         .input {
             border-radius: 2px;
@@ -79,17 +78,12 @@
     layui.link('../../../layuiadmin/style/autocomplete.css');
     layui.config({
         base: '../../../layuiadmin/' //静态资源所在路径
-        , autocomplete: 'autocomplete'
     }).extend({
         index: 'lib/index',
-        formSelects: 'formSelects-v4'
-    }).use(['index', 'table', 'form', 'autocomplete', 'formSelects', 'laytpl' ], function () {
+    }).use(['index', 'table','laytpl' ], function () {
         var $ = layui.$
             , table = layui.table
-            , admin = layui.admin
             , laytpl = layui.laytpl
-            , formSelects = layui.formSelects
-            , form = layui.form;
 
         var order_id = layui.view.getParameterByName('order_id');
         editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
@@ -104,9 +98,9 @@
             , url: '/order/get_details/?order_id=' + order_id
             , cols: [[
                 {field: 'operation', title: "操作", width: 200}
-                , {field: 'operation_time', title: '操作时间', width: 150}
+                , {field: 'operation_time_f', title: '操作时间', width: 150}
                 , {field: 'notes', title: '备注', width: 200}
-                , {field: 'user', title: '操作人', width: 120}
+                , {field: 'user_text', title: '操作人', width: 120}
                 , {width: 100, align: 'center', fixed: 'right', toolbar: '#customer-operate-bar'}
             ]]
             , page: true

+ 0 - 134
uis/views/order/dispatch_process_detail.html

@@ -1,134 +0,0 @@
-<!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>
-        .input {
-            border-radius: 2px;
-            height: 38px;
-            border-width: 1px;
-            border-color: lightgray;
-            border-style: solid;
-            background-color: white;
-            padding-left: 3px;
-        }
-    </style>
-</head>
-<body>
-
-<div class="layui-fluid">
-    <div class="layui-row layui-col-space15">
-        <div class="layui-card">
-            <div class="layui-card-body" pad15>
-                <div id="tableDom"></div>
-                <h3 style="margin: 20px 0 10px 0">进度明细</h3>
-                <table class="layui-hide" id="process_datagrid" lay-filter="customer-operate"></table>
-            </div>
-        </div>
-    </div>
-</div>
-<script id="demo" type="text/html">
-    <table class="layui-table">
-          <tbody>
-            <tr>
-              <td style="background: #f8f8f8; width: 90px">单号:</td>
-              <td>{{ d.no || "" }}</td>
-              <td style="background: #f8f8f8; width: 90px">客户名称:</td>
-              <td>{{ d.name || "" }}</td>
-            </tr>
-            <tr>
-              <td style="background: #f8f8f8; width: 90px">客户电话:</td>
-              <td>{{ d.tel || "" }}</td>
-              <td style="background: #f8f8f8; width: 90px">地址:</td>
-              <td>{{ d.address || "" }}</td>
-            </tr>
-            <tr>
-              <td style="background: #f8f8f8; width: 90px">小区:</td>
-              <td>{{ d.village || "" }}</td>
-              <td style="background: #f8f8f8; width: 90px">项目:</td>
-              <td>{{ d.project_text || "" }}</td>
-            </tr>
-            <tr>
-              <td style="background: #f8f8f8; width: 90px">当前跟踪人:</td>
-              <td>{{ d.current_follow_user || "" }}</td>
-              <td style="background: #f8f8f8; width: 90px">申请进度:</td>
-              <td>{{ d.apply_process || "" }}</td>
-            </tr>
-          </tbody>
-        </table>
-</script>
-<script type="text/html" id="customer-operate-bar">
-    <div class="layui-btn-group">
-        <a class="layui-btn layui-btn-xs" lay-event="order_detail"
-        >查看资料</a>
-    </div>
-</script>
-
-
-<script src="../../layuiadmin/layui/layui.js"></script>
-<script>
-    layui.link('../../../layuiadmin/style/autocomplete.css');
-    layui.config({
-        base: '../../../layuiadmin/' //静态资源所在路径
-        , autocomplete: 'autocomplete'
-    }).extend({
-        index: 'lib/index',
-        formSelects: 'formSelects-v4'
-    }).use(['index', 'table', 'form', 'autocomplete', 'formSelects', 'laytpl' ], function () {
-        var $ = layui.$
-            , table = layui.table
-            , admin = layui.admin
-            , laytpl = layui.laytpl
-            , formSelects = layui.formSelects
-            , form = layui.form;
-
-        editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
-        var data = editdata;
-        var getTpl = demo.innerHTML
-        ,tableDom = document.getElementById('tableDom');
-        laytpl(getTpl).render(data, function(html){
-          tableDom.innerHTML = html;
-        });
-        var id = layui.view.getParameterByName('customer');
-        table.render({
-            elem: '#process_datagrid'
-            , url: '/api/process.json'
-            , cols: [[
-                {field: 'time', title: '时间', width: 150}
-                , {field: 'process', title: "进度", width: 120}
-                , {field: 'notes', title: '备注', width: 200}
-                , {field: 'option_user', title: '操作人', width: 120}
-                , {width: 100, align: 'center', fixed: 'right', toolbar: '#customer-operate-bar'}
-            ]]
-            , page: true
-        });
-
-         //监听工具条
-        table.on('tool(customer-operate)', function (obj) {
-            var data = obj.data;
-            if (obj.event === 'order_detail') {
-                // 显示资料图片
-                layer.open({
-                    type: 2,
-                    title: '资料图片',
-                    area: ['100%', '70%'],
-                    btn: ['取消'],
-                    btn1: function (index, layero) {
-                        layer.close(index);//关闭当前按钮
-                    },
-                    content: 'imgsInfo.html'
-                });
-            }
-        });
-    });
-</script>
-</body>
-</html>

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

@@ -113,7 +113,7 @@
         //form.render(null, 'component-form-element');
         var next_process_id = '';
         admin.req({
-            url: '/order/get_process/?customer_id=' + customer_id
+            url: '/order/get_process/?customer_id=' + customer_id + '&dispatch=1'
             , type: 'get'
             , done: function (res) {
                 if (res.data.error) {

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

@@ -156,7 +156,7 @@
                 btn1: function (index, layero) {
                     layer.close(index);//关闭当前按钮
                 },
-                content: 'dispatch_process_detail.html'
+                content: 'detail.html'
             });
             }else if(obj.event === "order_update"){
                 // 更新进度

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

@@ -62,9 +62,9 @@
             elem: '#customer_datagrid_imgs'
             , url: '/order/get_files/?progress_details_id=' + progress_details_id
             , cols: [[
-                {field: 'create_time', title: "上传时间", width: 220}
+                {field: 'create_time_f', title: "上传时间", width: 220}
                 , {field: 'file_size', title: '文件大小', width: 120}
-                , {field: 'user', title: '上传人', width: 120}
+                , {field: 'user_text', title: '上传人', width: 120}
                 , {width: 80, align: 'center', fixed: 'right', toolbar: '#customer-imgs-operate-bar'}
             ]]
         });

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

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