浏览代码

账号管理,模块权限

MaiXinRong 5 月之前
父节点
当前提交
d3bb80e025

+ 41 - 0
app/controller/sub_proj_setting_controller.js

@@ -267,11 +267,52 @@ module.exports = app => {
         }
 
         async permission(ctx) {
+            try {
+                this.defaultCheck(ctx);
+                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
+                const filter = {
+                    keyword: ctx.query.keyword || '',
+                };
+                const permissionConst = this.service.subProjPermission.PermissionConst;
+                const subProjectAccountList = await ctx.service.projectAccount.getSubProjecAllAccountListWithPermission(ctx.subProject, filter);
+                const subProjectAllAccountList = await ctx.service.projectAccount.getSubProjecAllAccountListWithPermission(ctx.subProject);
+                const subProjectUnitList = unitList.map(item => {
+                    const users = subProjectAccountList.filter(item1 => item1.company === item.name);
+                    return { name: item.name, users };
+                }).filter(x => { return x.users.length > 0; });
 
+                const accountList = await ctx.service.projectAccount.getAllDataByCondition({
+                    columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group', 'mobile', 'company_id'],
+                    where: { project_id: ctx.subProject.project_id },
+                });
+                accountList.forEach(x => {
+                    x.sp_exist = subProjectAllAccountList.findIndex(y => { return y.id === x.id; }) >= 0;
+                });
+                const accountGroup = unitList.map(item => {
+                    const groupList = accountList.filter(item1 => item1.company === item.name);
+                    return { id: item.id, name: item.name, groupList };
+                }).filter(x => { return x.groupList.length > 0; });
+                const renderData = {
+                    ptype: ctx.query.ptype,
+                    accountGroup,
+                    subProjectAccountList,
+                    subProjectAllAccountList,
+                    subProjectUnitList,
+                    keyword: filter.keyword,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.sp_permission),
+                    permissionBlock: ctx.service.subProjPermission.PermissionBlock,
+                    permissionConst: permissionConst[ctx.query.ptype],
+                };
+                await this.layout('sp_setting/permission.ejs', renderData, 'sp_setting/user_modal.ejs');
+            } catch (error) {
+                console.log(error);
+                ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
+            }
         }
 
         async permissionUpdate(ctx) {
             try {
+                this.defaultCheck(ctx);
                 const data = JSON.parse(ctx.request.body.data);
                 const result = await ctx.service.subProjPermission.updatePermission(ctx.subProject, data);
                 ctx.body = { err: 0, msg: '', data: result };

+ 44 - 3
app/public/js/sp_setting_permission.js

@@ -46,14 +46,14 @@ $(document).ready(() => {
                 if (u.select && !u.sp_exist) select.push(u.id);
             }
         }
-        postData(`user/permission/update`, { add: select }, function() {
+        postData(`sp/${spid}/setting/user/permission/update`, { add: select }, function() {
             window.location.reload();
         });
     });
     // 移除账号
     $('[name=remove-user]').click(function() {
         const id = this.getAttribute('data-id');
-        postData(`user/permission/update`, { del: id }, function() {
+        postData(`sp/${spid}/setting/user/permission/update`, { del: id }, function() {
             window.location.reload();
         });
     });
@@ -86,8 +86,49 @@ $(document).ready(() => {
         updatePermission.forEach(x => {
             data[x.key + '_permission'] = x.value.join(',');
         });
-        postData(`user/permission/update`, { update: data }, function() {
+        postData(`sp/${spid}/setting/user/permission/update`, { update: data }, function() {
             window.location.reload();
         });
     });
+    $('#filter-valid').change(function() {
+        const filter = this.checked;
+        const users = $('[name=user-permission]');
+        for (const user of users) {
+            if (filter) {
+                const checked = $(':checked', user);
+                if (checked.length > 0) {
+                    $(user).show();
+                } else {
+                    $(user).hide();
+                }
+            } else {
+                $(user).show();
+            }
+        }
+    });
+    $('#save-permission').click(function() {
+        const updateData = [];
+        const users = $('[name=user-permission]');
+        for (const user of users) {
+            const data = { id: user.getAttribute('pid') };
+            const permissionKey = [], permission = {};
+            const check = $('[type=checkbox]', user);
+            for (const c of check) {
+                const ptype = c.getAttribute('ptype');
+                const pvalue = c.getAttribute('pvalue');
+                if (permissionKey.indexOf(ptype) < 0) {
+                    permissionKey.push(ptype);
+                    permission[ptype] = [];
+                }
+                if (c.checked) permission[ptype].push(pvalue);
+            }
+            permissionKey.forEach(x => {
+                data[x + '_permission'] = permission[x].join(',');
+            });
+            updateData.push(data);
+        }
+        postData(`/sp/${spid}/setting/user/permission/update`, { update: updateData }, function() {
+            window.location.reload();
+        })
+    });
 });

+ 1 - 0
app/router.js

@@ -205,6 +205,7 @@ module.exports = app => {
     app.post('/sp/:id/setting/category/self-level', sessionAuth, subProjectCheck, 'subProjSettingController.selfCategoryLevel');
     // 账号设置
     app.get('/sp/:id/setting/user', sessionAuth, subProjectCheck, 'subProjSettingController.user');
+    app.get('/sp/:id/setting/user/permission', sessionAuth, subProjectCheck, 'subProjSettingController.permission');
     app.post('/sp/:id/setting/user/permission/update', sessionAuth, subProjectCheck, 'subProjSettingController.permissionUpdate');
     // 操作日志
     app.get('/sp/:id/setting/logs', sessionAuth, subProjectCheck, 'subProjSettingController.logs');

+ 21 - 1
app/service/project_account.js

@@ -1046,11 +1046,20 @@ module.exports = app => {
         }
 
         _getFilterSql(filter) {
+            const searchField = ['name', 'company', 'role', 'mobile'];
             const rstFilter = [];
             for (const f of filter) {
                 for (const prop in f.filter) {
                     if (!f.filter[prop]) continue;
-                    rstFilter.push(this.db.format(`${f.tableName}.${prop} = ?`, [f.filter[prop]]));
+                    if (prop === 'keyword') {
+                        const innerFilter = [];
+                        for (const sf of searchField) {
+                            innerFilter.push(`${f.tableName}.${sf} LIKE '%${f.filter[prop]}%'`);
+                        }
+                        rstFilter.push('(' + innerFilter.join(' OR ') + ')')
+                    } else {
+                        rstFilter.push(this.db.format(`${f.tableName}.${prop} = ?`, [f.filter[prop]]));
+                    }
                 }
             }
             return rstFilter.join(' AND ');
@@ -1065,6 +1074,17 @@ module.exports = app => {
             return result.count;
         }
 
+        async getSubProjecAllAccountListWithPermission(subProject, filter) {
+            const filterInfo = [{ filter: {spid: subProject.id}, tableName: 'spp' }];
+            if (filter) filterInfo.push({ filter, tableName: 'pa'});
+            const filterSql = this._getFilterSql(filterInfo);
+            const sql = `SELECT pa.*, spp.id AS permission_id, 
+                    spp.file_permission, spp.budget_permission, spp.info_permission, spp.datacollect_permission, spp.fund_trans_permission, spp.fund_pay_permission, spp.contract_permission 
+                FROM ${this.ctx.service.subProjPermission.tableName} spp LEFT JOIN ${this.tableName} pa ON spp.uid = pa.id WHERE ` + filterSql + ' ORDER BY spp.create_time DESC';
+            const result = await this.db.query(sql);
+            return result;
+        }
+
         async getSubProjectAccountListWithPermission(subProject, filter) {
             const filterInfo = [{ filter: {spid: subProject.id}, tableName: 'spp' }];
             if (filter) filterInfo.push({ filter, tableName: 'pa'});

+ 2 - 2
app/service/sub_proj_permission.js

@@ -230,10 +230,10 @@ module.exports = app => {
                 for (const p of this.PermissionBlock) {
                     if (p.children) {
                         for (const c of p.children) {
-                            if (data[c.field] !== undefined) ud[c.field] = x[c.field] || '';
+                            if (x[c.field] !== undefined) ud[c.field] = x[c.field] || '';
                         }
                     } else {
-                        if (data[p.field] !== undefined) ud[p.field] = x[p.field] || '';
+                        if (x[p.field] !== undefined) ud[p.field] = x[p.field] || '';
                     }
                 }
                 updateData.push(ud);

+ 45 - 80
app/view/sp_setting/permission.ejs

@@ -3,7 +3,6 @@
     <div class="panel-title">
         <div class="title-main">
             <h2>账号管理
-                <a href="#add-company" data-toggle="modal" data-target="#add-company" class="btn btn-primary btn-sm pull-right">添加单位</a>
                 <a href="#sel-batch" data-toggle="modal" data-target="#sel-batch" class="btn btn-primary btn-sm pull-right mr-1">选择账号</a>
             </h2>
         </div>
@@ -12,15 +11,16 @@
         <div class="c-body">
             <div class="sjs-height-0">
                 <nav class="nav nav-tabs m-3" role="tablist">
-                    <a class="nav-item nav-link" data-toggle="tab" data-target="#user-list" href="/sp/<%- ctx.subProject.id %>/setting/user" role="tab" aria-selected="false">账号列表</a>
-                    <a class="nav-item nav-link active" data-toggle="tab" data-target="#user-purview" href="/sp/<%- ctx.subProject.id %>/setting/permission" role="tab" aria-selected="true">模块权限</a>
+                    <a class="nav-item nav-link" href="/sp/<%- ctx.subProject.id %>/setting/user" aria-selected="false">账号列表</a>
+                    <a class="nav-item nav-link active"  href="/sp/<%- ctx.subProject.id %>/setting/user/permission?type=<%- ptype %><%- (keyword ? '&keyword=' + keyword : '')%>" aria-selected="true">模块权限</a>
                     <div class="ml-auto">
-                        <div class="input-group input-group-sm">
-                            <input type="text" class="form-control" placeholder="账号/姓名/单位/手机 搜索" aria-label="账号/姓名/单位/手机 搜索" aria-describedby="button-addon2">
+                        <form class="input-group input-group-sm" method="get">
+                            <input type="hidden" class="form-control" value="<%- ptype %>" name="ptype">
+                            <input type="text" class="form-control" placeholder="账号/姓名/单位/手机 搜索" aria-label="账号/姓名/单位/手机 搜索" value="<%- keyword %>" aria-describedby="button-addon2" name="keyword">
                             <div class="input-group-append">
-                                <button class="btn btn-outline-primary" type="button" id="button-addon2"><i class="fa fa-search"></i></button>
+                                <button class="btn btn-outline-primary" type="submit" id="search"><i class="fa fa-search"></i></button>
                             </div>
-                        </div>
+                        </form>
                     </div>
                 </nav>
                 <div class="tab-content m-3">
@@ -28,94 +28,55 @@
                         <div class="row">
                             <div class="col-3">
                                 <dl class="list-group">
-                                    <dt class="list-group-item bg-warning" type="datacollection">决策大屏</dt>
-                                    <dd class="list-group-item" type="info">项目概况</dd>
-                                    <dd class="list-group-item" type="contract">合同管理</dd>
-                                    <dd class="list-group-item" type="file">资料归集</dd>
-                                    <dd class="list-group-item" type="budget">动态投资</dd>
+                                    <a href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=datacollect<%- (keyword ? '&keyword=' + keyword : '')%>" class="list-group-item list-group-item-action <%- (ptype === 'datacollect' ? 'active' : '') %>">决策大屏</a>
+                                    <a href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=info<%- (keyword ? '&keyword=' + keyword : '')%>" class="list-group-item list-group-item-action <%- (ptype === 'info' ? 'active' : '') %>">项目概况</a>
+                                    <a href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=contract<%- (keyword ? '&keyword=' + keyword : '')%>" class="list-group-item list-group-item-action  <%- (ptype === 'contract' ? 'active' : '') %>">合同管理</a>
+                                    <a href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=file<%- (keyword ? '&keyword=' + keyword : '')%>" class="list-group-item list-group-item-action  <%- (ptype === 'file' ? 'active' : '') %>">资料归集</a>
+                                    <a href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=budget<%- (keyword ? '&keyword=' + keyword : '')%>" class="list-group-item list-group-item-action  <%- (ptype === 'budget' ? 'active' : '') %>">动态投资</a>
                                     <dd class="list-group-item">资金监管</dd>
-                                    <dd class="list-group-item" type="zjhb">  资金划拨</dd>
-                                    <dd class="list-group-item" type="zjzf">  资金支付</dd>
+                                    <a href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=fund_trans<%- (keyword ? '&keyword=' + keyword : '')%>" class="list-group-item list-group-item-action  <%- (ptype === 'fund_trans' ? 'active' : '') %>"><span class="ml-4"></span>资金划拨</a>
+                                    <a href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=fund_pay<%- (keyword ? '&keyword=' + keyword : '')%>" class="list-group-item list-group-item-action  <%- (ptype === 'fund_pay' ? 'active' : '') %>"><span class="ml-4"></span>资金支付</a>
                                 </dl>
                             </div>
                             <div class="col-9">
                                 <div class="card mb-2">
                                     <div class="card-header d-flex justify-content-between">
                                         <div>决策大屏</div>
-                                        <div class="dropdown">
-                                            <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                                添加用户
-                                            </button>
-                                            <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton" style="width: 220px; will-change: transform;">
-                                                <div class="mb-2 p-2"><input class="form-control form-control-sm" placeholder="姓名/手机 检索"></div>
-                                                <dl class="list-unstyled book-list">
-                                                    <dt><a href=""><i class="fa fa-minus-square-o"></i></a> 珠海纵横创新软件有限公司</dt>
-                                                    <dd class="border-bottom p-2 mb-0">
-                                                        <p class="mb-0 d-flex"><span class="text-primary">李旭</span><span class="ml-auto">15800000003</span></p>
-                                                        <span class="text-muted">职称</span>
-                                                    </dd>
-                                                    <dd class="border-bottom p-2 mb-0">
-                                                        <p class="mb-0 d-flex"><span class="text-primary">李旭</span><span class="ml-auto">15800000003</span></p>
-                                                        <span class="text-muted">职称</span>
-                                                    </dd>
-                                                    <dd class="border-bottom p-2 mb-0">
-                                                        <p class="mb-0 d-flex"><span class="text-primary">李旭</span><span class="ml-auto">15800000003</span></p>
-                                                        <span class="text-muted">职称</span>
-                                                    </dd>
-                                                    <dd class="border-bottom p-2 mb-0">
-                                                        <p class="mb-0 d-flex"><span class="text-primary">李旭</span><span class="ml-auto">15800000003</span></p>
-                                                        <span class="text-muted">职称</span>
-                                                    </dd>
-                                                    <dt><a href=""><i class="fa fa-minus-square-o"></i></a> 湖南XXX监理有限公司</dt>
-                                                    <dd class="border-bottom p-2 mb-0">
-                                                        <p class="mb-0 d-flex"><span class="text-primary">李旭</span><span class="ml-auto">15800000003</span></p>
-                                                        <span class="text-muted">职称</span>
-                                                    </dd>
-                                                    <dd class="border-bottom p-2 mb-0">
-                                                        <p class="mb-0 d-flex"><span class="text-primary">李旭</span><span class="ml-auto">15800000003</span></p>
-                                                        <span class="text-muted">职称</span>
-                                                    </dd>
-                                                    <dt><a href=""><i class="fa fa-plus-square"></i></a> 中铁十六局施工项目部</dt>
-                                                    <dt><a href=""><i class="fa fa-plus-square"></i></a> 广州勘查设计院一分院</dt>
-                                                </dl>
+                                        <div class="ml-auto">
+                                            <div class="form-check form-check-inline">
+                                                <span style="margin:0 .5rem 0 1rem; font-weight: bold;">筛选已授权</span>
+                                                <div class="custom-control custom-switch">
+                                                    <input type="checkbox" class="custom-control-input" id="filter-valid">
+                                                    <label class="custom-control-label" for="filter-valid"></label>
+                                                </div>
                                             </div>
+                                            <button class="btn btn-sm btn-warning" id="save-permission" style="display: none;">保存</button>
                                         </div>
                                     </div>
                                     <div class="card-body py-2">
-                                        <table class="table table-hover table-bordered table-sm" style="width: 500px;">
-                                            <thead>
-                                            <tr>
-                                                <th class="text-center" width="">用户</th>
-                                                <th class="text-center" width="150px">职位</th>
-                                                <th class="text-center" width="100px">查看</th>
-                                                <th class="text-center" width="100px">操作</th>
+                                        <table class="table table-hover table-bordered table-sm">
+                                            <thead><tr class="text-center">
+                                                <th width="120px">用户</th>
+                                                <th width="240px">公司</th>
+                                                <th width="150px">职位</th>
+                                                <% for (const key in permissionConst) { %>
+                                                <th><%- permissionConst[key].title %></th>
+                                                <% } %>
                                             </tr>
                                             </thead>
                                             <tbody class="text-center">
-                                            <tr>
-                                                <td>陈特</td>
-                                                <td>业主</td>
-                                                <td><input type="checkbox"></td>
-                                                <td class="text-center">
-                                                    <a href="#remove-user1" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger">移除</a>
-                                                </td>
-                                            </tr>
-                                            <tr>
-                                                <td>仁温书</td>
-                                                <td>项目经理</td>
-                                                <td><input type="checkbox"></td>
-                                                <td class="text-center">
-                                                    <a href="#remove-user1" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger">移除</a>
-                                                </td>
-                                            </tr>
-                                            <tr>
-                                                <td>玉安然</td>
-                                                <td>集团经理</td>
-                                                <td><input type="checkbox"></td>
-                                                <td class="text-center">
-                                                    <a href="#remove-user1" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger">移除</a>
-                                                </td>
+                                            <% for (const user of subProjectAccountList) { %>
+                                            <% console.log(user); %>
+                                            <% const tp = user[ptype + '_permission'].split(','); %>
+                                            <tr name="user-permission" pid="<%- user.permission_id %>">
+                                                <td><%- user.name %></td>
+                                                <td><%- user.company %></td>
+                                                <td><%- user.role %></td>
+                                                <% for (const key in permissionConst) { %>
+                                                <td><input type="checkbox" ptype="<%- ptype %>" pvalue="<%- permissionConst[key].value %>" <%- (tp.indexOf(permissionConst[key].value + '') >= 0 ? 'checked' : '') %> onchange="$('#save-permission').show();"></td>
+                                                <% } %>
                                             </tr>
+                                            <% } %>
                                             </tbody>
                                         </table>
                                     </div>
@@ -128,3 +89,7 @@
         </div>
     </div>
 </div>
+<script>
+    const accountGroup = JSON.parse(unescape('<%- escape(JSON.stringify(accountGroup)) %>'));
+    const permissionConst = JSON.parse(unescape('<%- escape(JSON.stringify(permissionConst)) %>'));
+</script>

+ 7 - 6
app/view/sp_setting/user.ejs

@@ -11,15 +11,16 @@
         <div class="c-body">
             <div class="sjs-height-0">
                 <nav class="nav nav-tabs m-3" role="tablist">
-                    <a class="nav-item nav-link active" data-toggle="tab" data-target="#user-list" href="/sp/<%- ctx.subProject.id %>/setting/user" role="tab" aria-selected="false">账号列表</a>
-                    <a class="nav-item nav-link" data-toggle="tab" data-target="#user-purview" href="/sp/<%- ctx.subProject.id %>/setting/permission" role="tab" aria-selected="true">模块权限</a>
+                    <a class="nav-item nav-link active" href="/sp/<%- ctx.subProject.id %>/setting/user" aria-selected="false">账号列表</a>
+                    <a class="nav-item nav-link"  href="/sp/<%- ctx.subProject.id %>/setting/user/permission?ptype=datacollect" aria-selected="true">模块权限</a>
                     <div class="ml-auto">
-                        <div class="input-group input-group-sm">
-                            <input type="text" class="form-control" placeholder="账号/姓名/单位/手机 搜索" aria-label="账号/姓名/单位/手机 搜索" value="<%- keyword %>" aria-describedby="button-addon2">
+                        <form class="input-group input-group-sm" method="get">
+                            <input type="hidden" class="form-control" value="<%- company %>" name="company">
+                            <input type="text" class="form-control" placeholder="账号/姓名/单位/手机 搜索" aria-label="账号/姓名/单位/手机 搜索" value="<%- keyword %>" aria-describedby="button-addon2" name="keyword">
                             <div class="input-group-append">
-                                <button class="btn btn-outline-primary" type="button" id="button-addon2"><i class="fa fa-search"></i></button>
+                                <button class="btn btn-outline-primary" type="submit" id="search"><i class="fa fa-search"></i></button>
                             </div>
-                        </div>
+                        </form>
                     </div>
                 </nav>
                 <div class="tab-content m-3">