Browse Source

企业信息

wushaodong 4 years ago
parent
commit
c23a737d06

+ 2 - 2
apps/admin/tenant/serializers.py

@@ -25,10 +25,10 @@ class TenantSerializer(serializers.ModelSerializer) :
             return ''
 
     def get_username(self, obj):
-        names = Employee.objects.filter(tenant=obj, user__type=User.SUPER).values('name')
+        names = Employee.objects.filter(tenant=obj, user__type=User.SUPER).values('user__username')
         name = []
         for i in names:
-            name.append(i.get('name'))
+            name.append(i.get('user__username'))
         return ','.join(name)
 
     def create(self, validated_data):

+ 3 - 3
apps/tenant/models.py

@@ -8,12 +8,12 @@ from django.utils import timezone
 class Tenant(models.Model):
 
     company_no = models.CharField(max_length=10, verbose_name=u'单位编号', blank=True, null=True)
-    company_name = models.CharField(max_length=200, verbose_name=u'单位名称')
-    organ_code = models.CharField(max_length=200, verbose_name=u'组织代码')
+    company_name = models.CharField(max_length=200, verbose_name=u'单位名称', blank=True, null=True)
+    organ_code = models.CharField(max_length=200, verbose_name=u'组织代码', blank=True, null=True)
     # images = models.ForeignKey('Upload', verbose_name='营业执照图片',on_delete=models.PROTECT, blank=True)
     name = models.CharField(max_length=20, verbose_name=u'联系人名称')
     tel = models.CharField(max_length=20, verbose_name=u'联系人电话')
-    address = models.CharField(max_length=20, verbose_name=u'联系人电话')
+    address = models.CharField(max_length=20, verbose_name=u'地址', blank=True, null=True)
     create_time = models.DateTimeField(verbose_name=u'申请时间', auto_now_add=True, editable=False)
     end_date = models.DateField(verbose_name=u'到期时间', editable=False, blank=True, null=True)
     status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATE_CHOICES, verbose_name=u'审核状态',

+ 2 - 6
apps/tenant/option/views.py

@@ -1,5 +1,5 @@
 from utils.custom_modelviewset import CustomModelViewSet
-from utils.permission import IsTenantUser, permission_required
+from utils.permission import IsTenantUser, IsAdministratorUser
 from rest_framework.views import APIView
 from .models import Option
 from .serializers import OptionSerializer
@@ -19,31 +19,27 @@ class DictView(APIView):
         return response_ok(ret)
 
 class OptionViewSet(CustomModelViewSet):
-    permission_classes = [IsTenantUser,]
+    permission_classes = [IsAdministratorUser,]
     queryset = Option.objects.filter(delete=False)
     serializer_class = OptionSerializer
 
-    @permission_required('option.browse_option')
     def filter_queryset(self, queryset):
         queryset = queryset.filter(tenant=self.request.user.employee.tenant)
         f = OptionFilter(self.request.GET, queryset=queryset)
         return f.qs
 
-    @permission_required('option.add_option')
     def perform_create(self, serializer):
         super(OptionViewSet,self).perform_create(serializer)
         instance = serializer.instance
         validated_data = serializer.validated_data
         tenant_log(self.request.user.employee, BizLog.INSERT, u'添加系统选项[%s],id=%d' % (instance.name, instance.id), validated_data)
 
-    @permission_required('option.add_option')
     def perform_update(self, serializer):
         super(OptionViewSet,self).perform_update(serializer)
         instance = serializer.instance
         validated_data = serializer.validated_data
         tenant_log(self.request.user.employee, BizLog.INSERT, u'修改系统选项[%s],id=%d' % (instance.name, instance.id), validated_data)
 
-    @permission_required('option.delete_option')
     def destroy(self, request, *args, **kwargs):
         with transaction.atomic():
             instance = self.get_object()

+ 5 - 0
apps/tenant/urls.py

@@ -23,3 +23,8 @@ urlpatterns = [
     url(r'^device/', include('apps.tenant.device.urls')),
     url(r'^notices/', include('apps.tenant.notices.urls')),
 ]
+
+
+router = SimpleRouter()
+router.register(r'company', CompanyViewSet)
+urlpatterns += router.urls

+ 27 - 3
apps/tenant/views.py

@@ -1,10 +1,16 @@
 # coding=utf-8
-
+import json
+from rest_framework.decorators import action
 from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
 from rest_framework.serializers import ValidationError
-
+from utils.custom_modelviewset import CustomModelViewSet
 from utils import response_error, response_ok
 from .serializers import TenantJWTSerializer
+from utils.permission import IsTenantUser, IsAdministratorUser
+from .models import Tenant
+from apps.admin.tenant.serializers import TenantSerializer
+from apps.admin.tenant.filters import TenantFilter
+from apps.log.models import BizLog
 
 class TenantLoginView(ObtainJSONWebToken):
     serializer_class = TenantJWTSerializer
@@ -36,4 +42,22 @@ class TenantRefreshTokenView(RefreshJSONWebToken):
             if ser.is_valid(raise_exception=True):
                 return response_ok({'token': ser.validated_data['token']})
         except ValidationError as e:
-            return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
+            return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
+
+class CompanyViewSet(CustomModelViewSet):
+    permission_classes = [IsAdministratorUser,]
+    queryset = Tenant.objects.filter(delete=False)
+    serializer_class = TenantSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(id=self.request.user.employee.tenant.id)
+        f = TenantFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    @action(methods=['post'], detail=True)
+    def update_company(self,request,pk):
+        name = request.POST.get('name')
+        tel = request.POST.get('tel')
+        Tenant.objects.filter(id=pk).update(name=name,tel=tel)
+        BizLog.objects.addnew(self.request.user.employee.tenant, self.request.user, BizLog.INSERT, u'修改企业联系人,id=%s' % pk, request.POST)
+        return response_ok()

+ 135 - 0
uis/tenant/company/detail.html

@@ -0,0 +1,135 @@
+<!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">
+        .tenant-li {
+            margin: 10px
+        }
+
+        img {
+            width: 40%;
+            height: 30%;
+            margin-bottom: 20px;
+        }
+        /*企业营业执照样式*/
+        .imgStyle{
+            width: 100px;
+            height: 100px;
+        }
+    </style>
+</head>
+<body>
+
+<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 id="tenant_detail" class="layui-tab-item layui-show"></div>
+        <div id="invest_record" class="layui-tab-item"></div>
+
+        <script id="tenant_detail_demo" type="text/html">
+            <div class="layui-tab-item layui-show">
+                <ui>
+                    <li class="tenant-li">
+                        <h3>单位名称:{{ d.company_name }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>单位编码:{{ d.company_no }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>组织代码:{{ d.organ_code }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>联系人姓名:{{ d.name }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>联系人电话:{{ d.tel }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>租户到期日期:{{ d.end_date }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>申请时间:{{ d.create_time }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>审核状态:{{ d.status_text }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>管理员账号:{{ d.username }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>续费时间:{{ d.renew_time || ''}}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>续费金额:{{ d.renew_amount || '' }}</h3>
+                    </li>
+                    <li class="tenant-li">
+                        <h3>拒绝原因:{{ d.reject_reason  || ''}}</h3>
+                    </li>
+                    {{# if(d.image){ }}
+                    <li class="tenant-li">
+                        <h3>企业营业执照:</h3>
+                        <img src="{{d.image}}" class="imgStyle" />
+                    </li>
+                    {{# } }}
+                </ui>
+            </div>
+        </script>
+        <script id="invest_record_demo" type="text/html">
+            <div class="layui-tab-item layui-show">
+                <ul class="layui-timeline">
+                    <li class="layui-timeline-item">
+                        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
+                        <div class="layui-timeline-content layui-text">
+                        </div>
+                    </li>
+                </ul>
+            </div>
+        </script>
+    </div>
+</div>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index',  'laytpl'], function () {
+        var $ = layui.$
+            , laytpl = layui.laytpl;
+        var data = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+
+        var getTpl = tenant_detail_demo.innerHTML
+            , tenant_detail = document.getElementById('tenant_detail');
+        laytpl(getTpl).render(data, function (html) {
+            tenant_detail.innerHTML = html;
+        });
+        // admin.req({
+        //     url: '/tenant/repair_order/get_repair_order_record/'
+        //     , data: {order_id: data.id}
+        //     , type: 'get'
+        //     , done: function (res) {
+        //        var getTpl2 = invest_record_demo.innerHTML
+        //            , invest_record = document.getElementById('invest_record');
+        //          laytpl(getTpl2).render(res.data, function (html) {
+        //          invest_record.innerHTML = html;
+        //         });
+        //     }
+        // });
+    });
+</script>
+</body>
+</html>

+ 98 - 0
uis/tenant/company/edit.html

@@ -0,0 +1,98 @@
+<!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"/>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md6">
+            <div class="layui-card">
+
+                <div class="layui-card-body">
+                    <form class="layui-form" action="" lay-filter="component-form-element">
+
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>联系人姓名:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="name" lay-verify="required" placeholder="请输入联系人姓名"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item">
+                            <label class="layui-form-label "><font color='red' size="4">*</font>联系人电话:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="tel" lay-verify="required" placeholder="请输入联系人电话"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+
+                        <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                                style="display: none">保存
+                        </button>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+        formSelects: 'formSelects-v4'
+    }).use(['index', 'form', 'utils', 'laydate'], function () {
+        var $ = layui.$
+            , laydate = layui.laydate
+            , admin = layui.admin
+            , form = layui.form;
+        var id = layui.view.getParameterByName('id');
+
+        form.render(null, 'component-form-element');
+
+        if (id) {
+            var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+            form.val("component-form-element", editdata);
+        }
+
+        form.on('submit(component-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            var submitData = data.field;
+            if (id) {
+                var url = '/tenant/company/' + id + '/update_company/';
+                var type = 'post';
+            }
+            admin.req({
+                url: url
+                , data: submitData
+                , type: type
+                , done: function (res) {
+                    parent.layer.closeAll('iframe');
+                    parent.layui.table.reload('datagrid', {});
+                }
+            });
+
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 181 - 0
uis/tenant/company/index.html

@@ -0,0 +1,181 @@
+<!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">
+        .LAY-btns .layui-nav {
+            padding-left: 0;
+            padding-right: 10px;
+            top: -4px;
+            margin: 0 10px;
+            border: 0;
+            background-color: #009688;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-item {
+            line-height: 30px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child {
+            top: 34px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-bar {
+            display: none;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a {
+            color: #333;
+            background-color: #fff;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {
+            background-color: #f2f2f2;
+            color: #000;
+        }
+
+        .seach_items {
+            display: inline-block;
+            margin-right: 5px;
+            margin-top: 5px;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+                    <div class="LAY-btns" style="margin-bottom: 10px;">
+
+                        <div style="float:right;">
+                            <form class="layui-form" lay-filter="query-form-element">
+                                <div class="seach_items">
+                                    <input type="text" name="company_name" autocomplete="off" class="layui-input"
+                                           placeholder="单位名称"/>
+                                </div>
+                                <div class="seach_items">
+                                    <input type="text" name="name" autocomplete="off" class="layui-input"
+                                           placeholder="联系人姓名"/>
+                                </div>
+                                <div class="seach_items">
+                                    <input type="text" name="tel" autocomplete="off" class="layui-input"
+                                           placeholder="联系人电话"/>
+                                </div>
+                                <div class="seach_items">
+                                    <button class="layui-btn" lay-submit lay-filter="query-form-element"><i
+                                            class="layui-icon layui-icon-search"></i>查询
+                                    </button>
+                                </div>
+                            </form>
+                        </div>
+                        <div style="clear: both;"></div>
+
+                    </div>
+                    <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
+
+                    <script type="text/html" id="datagrid-operate-bar">
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="detail">查看</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="edit">修改联系人</a>
+                        </div>
+
+                    </script>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js?t=1"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table', 'form', 'upload'], function () {
+        var $ = layui.$
+            , table = layui.table
+            , admin = layui.admin
+            , form = layui.form;
+
+        table.render({
+            elem: '#datagrid'
+            , url: '/tenant/company/'
+            , cols: [[
+                {field: 'company_no', title: '单位编号', width: 100}
+                , {field: 'company_name', title: '单位名称', width: 200}
+                , {field: 'organ_code', title: '组织代码', width: 150}
+                , {field: 'name', title: '联系人姓名', width: 120}
+                , {field: 'tel', title: '联系人电话', width: 120}
+                , {field: 'address', title: '联系人地址', width: 200}
+                , {field: 'end_date', title: '租户到期日期', width: 120}
+                , {field: 'create_time', title: '申请时间', width: 160}
+                , {field: 'status_text', title: '审核状态', width: 100}
+                , {field: 'username', title: '管理员账号', width: 200}
+                , {field: 'renew_time', title: '续费时间', width: 160}
+                , {field: 'renew_amount', title: '续费金额', width: 120}
+                , {field: 'reject_reason', title: '拒绝原因', width: 120}
+                , {title: "操作", width: 260, align: 'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
+        var _params;
+        form.on('submit(query-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            _params = data.field;
+            table.reload('datagrid', {
+                where: data.field
+                , page: {curr: 1}
+            });
+            layer.closeAll();
+            return false;
+        });
+        //监听工具条
+        table.on('tool(datagrid-operate)', function (obj) {
+            var data = obj.data;
+            if (obj.event === 'detail') {
+                table.editdata = data;
+                layer.open({
+                    type: 2,
+                    title: "查看",
+                    shadeClose: false,
+                    area: ['700px', '700px'],
+                    content: 'detail.html'
+                })
+            }else if (obj.event === 'edit') {
+                table.editdata = data;
+                layer.open({
+                    type: 2,
+                    title: '修改',
+                    shadeClose: false,
+                    area: ['700px', '450px'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'edit.html?id=' + data.id
+                });
+            }
+        });
+
+    });
+</script>
+</body>
+</html>
+

+ 4 - 0
uis/tenant/index.html

@@ -69,6 +69,10 @@
                         </a>
                         <dl class="layui-nav-child">
 
+                            <dd data-name="nav" data-user_type="1,2">
+                                <a lay-href="company/index.html">企业信息</a>
+                            </dd>
+
                             <dd data-name="nav" data-user_type="1,2">
                                 <a lay-href="device/index.html">设备管理</a>
                             </dd>