Explorar el Código

TASK #5329 + code sync

Tony Kang hace 1 día
padre
commit
2dc662016f

+ 15 - 0
app/controller/report_controller.js

@@ -335,6 +335,7 @@ module.exports = app => {
 
                 // 获取所有项目参与者
                 const { accountList, newAccountGroup, advance } = await this._getInvolveAcc(ctx, this.ctx.tender.id);
+                // console.log(accountList);
 
                 let sp_id = -1;
                 if (this.ctx.subProject) sp_id = this.ctx.subProject.id;
@@ -438,6 +439,19 @@ module.exports = app => {
                     if (cust_select_item.customize) rpt_tpl_items.customize = cust_select_item.customize;
                 }
                 // const accountInfo = await this.ctx.service.projectAccount.getDataById(this.ctx.session.sessionUser.accountId);
+                const { accountList } = await this._getInvolveAcc(ctx, this.ctx.tender.id);
+                // 然后还要分一下组(根据company分组)
+                const companyGrpNameObj = [];
+                const cacheObj = {};
+                accountList.forEach(acc => {
+                    if (!cacheObj[acc.company]) cacheObj[acc.company] = [];
+                    cacheObj[acc.company].push(acc);
+                });
+                for (const prop in cacheObj) {
+                    companyGrpNameObj.push({ groupName: prop, groupList: cacheObj[prop] });
+                }
+                // console.log(companyGrpNameObj);
+
 
                 const renderData = {
                     rpt_tpl_data: JSON.stringify(treeNodes),
@@ -453,6 +467,7 @@ module.exports = app => {
                     // auditType: auditConst.auditType,
                     // preUrl: '',
                     // otherHintName: '',
+                    accountGroup: companyGrpNameObj,
                 };
                 await this.layout('report/rpt_format_setup.ejs', renderData, 'report/rpt_format_popup.ejs');
             } catch (err) {

+ 23 - 21
app/controller/sub_proj_setting_controller.js

@@ -1,4 +1,4 @@
- 'use strict';
+'use strict';
 
 /**
  *
@@ -90,7 +90,7 @@ module.exports = app => {
                 ctx.body = responseData;
             } catch (err) {
                 ctx.log(err);
-                ctx.body = {err: 1, msg: err.toString(), data: null};
+                ctx.body = { err: 1, msg: err.toString(), data: null };
             }
         }
 
@@ -102,20 +102,20 @@ module.exports = app => {
          */
         async updateCategory(ctx) {
             try {
-                const responseData = {err: 0, msg: '', data: null};
+                const responseData = { err: 0, msg: '', data: null };
 
                 const data = JSON.parse(ctx.request.body.data);
                 if (!data.id) {
                     throw '提交数据错误';
                 }
                 if (data.name) {
-                    const count = await ctx.service.category.count({spid: ctx.subProject.id, name: data.name});
+                    const count = await ctx.service.category.count({ spid: ctx.subProject.id, name: data.name });
                     if (count >= 1) {
                         throw '存在同名类别';
                     }
                 }
 
-                const result = await ctx.service.category.update(data, {id: data.id});
+                const result = await ctx.service.category.update(data, { id: data.id });
                 if (!result) {
                     throw '提交数据失败';
                 }
@@ -125,13 +125,13 @@ module.exports = app => {
                 ctx.body = responseData;
             } catch (err) {
                 ctx.log(err);
-                ctx.body = {err: 1, msg: err.toString(), data: null};
+                ctx.body = { err: 1, msg: err.toString(), data: null };
             }
         }
 
         async setCategoryValue(ctx) {
             try {
-                const responseData = {err: 0, msg: '', data: {}};
+                const responseData = { err: 0, msg: '', data: {} };
 
                 const data = JSON.parse(ctx.request.body.data);
                 if (!data.id) {
@@ -146,7 +146,7 @@ module.exports = app => {
                 ctx.body = responseData;
             } catch (err) {
                 ctx.log(err);
-                ctx.body = {err: 1, msg: err instanceof String ? err : '提交数据失败', data: null};
+                ctx.body = { err: 1, msg: err instanceof String ? err : '提交数据失败', data: null };
             }
         }
 
@@ -172,7 +172,7 @@ module.exports = app => {
                 ctx.body = responseData;
             } catch (err) {
                 ctx.log(err);
-                ctx.body = {err: 1, msg: err.toString(), data: null};
+                ctx.body = { err: 1, msg: err.toString(), data: null };
             }
         }
 
@@ -194,7 +194,7 @@ module.exports = app => {
                 ctx.body = responseData;
             } catch (err) {
                 ctx.log(err);
-                ctx.body = {err: 1, msg: err.toString(), data: null};
+                ctx.body = { err: 1, msg: err.toString(), data: null };
             }
         }
 
@@ -203,8 +203,8 @@ module.exports = app => {
                 const data = JSON.parse(ctx.request.body.data);
 
                 await ctx.service.subProjPermission.defaultUpdate({
-                    self_category_level: data.self_category_level || ''
-                }, { where: { spid: ctx.subProject.id, uid: ctx.session.sessionUser.accountId}});
+                    self_category_level: data.self_category_level || '',
+                }, { where: { spid: ctx.subProject.id, uid: ctx.session.sessionUser.accountId } });
                 ctx.body = {
                     err: 0, msg: '', data: null,
                 };
@@ -300,7 +300,7 @@ module.exports = app => {
                     return { id: item.id, name: item.name, groupList };
                 }).filter(x => { return x.groupList.length > 0; });
                 const relaBlock = ctx.service.subProjPermission.getRelaPermissionBlock(ctx.query.ptype);
-                const subProjects = await this.ctx.service.subProject.getAllDataByCondition({ where: { project_id: this.ctx.session.sessionProject.id, is_folder: 0, is_delete: 0 }});
+                const subProjects = await this.ctx.service.subProject.getAllDataByCondition({ where: { project_id: this.ctx.session.sessionProject.id, is_folder: 0, is_delete: 0 } });
                 const renderData = {
                     ptype: ctx.query.ptype,
                     ptypeStr: relaBlock ? relaBlock.name : '',
@@ -374,7 +374,7 @@ module.exports = app => {
         /**
          * 保存功能设置相关
          * @param ctx
-         * @returns {Promise<void>}
+         * @return {Promise<void>}
          */
         async updateFun(ctx) {
             try {
@@ -415,7 +415,7 @@ module.exports = app => {
                     if (!result3) throw '保存数据失败';
                 }
 
-                ctx.body = {err: 0, msg: '', data: null};
+                ctx.body = { err: 0, msg: '', data: null };
             } catch (error) {
                 ctx.log(error);
                 this.ajaxErrorBody(error, '保存数据失败');
@@ -433,10 +433,10 @@ module.exports = app => {
                 const dataCollectAudits = await ctx.service.subProjPermission.getDatacollectAuditList(ctx.subProject.id);
                 // 获取所有项目参与者
                 const accountList = await ctx.service.projectAccount.getAllSubProjectAccount(ctx.subProject);
-                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({where: {pid: ctx.session.sessionProject.id}});
+                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
                 const accountGroupList = unitList.map(item => {
                     const groupList = accountList.filter(item1 => item1.company === item.name);
-                    return {groupName: item.name, companyId: item.id, groupList};
+                    return { groupName: item.name, companyId: item.id, groupList };
                 }).filter(x => { return x.groupList.length > 0; });
                 const categoryData = await ctx.service.category.getAllCategory(ctx.subProject);
                 const tenders = await ctx.service.tender.getList('', null, 1);
@@ -488,7 +488,7 @@ module.exports = app => {
                         responseData.data = await ctx.service.subProject.update({
                             data_collect: data.data_collect,
                             data_collect_pages: data.data_collect_pages.join(','),
-                        }, {id: ctx.subProject.id});
+                        }, { id: ctx.subProject.id });
                         ctx.subProject.data_collect = data.data_collect;
                         ctx.subProject.showDataCollect = data.data_collect ? 1 : 0;
                         break;
@@ -533,7 +533,7 @@ module.exports = app => {
                 ctx.body = responseData;
             } catch (err) {
                 ctx.log(err);
-                ctx.body = {err: 1, msg: err.toString(), data: null};
+                ctx.body = { err: 1, msg: err.toString(), data: null };
             }
         }
 
@@ -564,11 +564,13 @@ module.exports = app => {
 
                 // 获取所有项目参与者
                 const accountList = await ctx.service.projectAccount.getAllSubProjectAccount(ctx.subProject);
-                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({where: {pid: ctx.session.sessionProject.id}});
+                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
                 const accountGroupList = unitList.map(item => {
                     const groupList = accountList.filter(item1 => item1.company === item.name);
-                    return {groupName: item.name, groupList};
+                    console.log(groupList);
+                    return { groupName: item.name, groupList };
                 }).filter(x => { return x.groupList.length > 0; });
+                // console.log(accountGroupList);
 
                 // 获取项目列表
                 // const subProjects = await ctx.service.subProject.getAllDataByCondition({ where: { project_id: projectId, is_folder: 0, is_delete: 0 } });

+ 109 - 15
app/view/report/rpt_format_setup.ejs

@@ -58,7 +58,9 @@
                 <div class="col-auto" id="format-main-view" style="width: 80%">
                     <nav class="nav nav-tabs m-3" role="tablist">
                         <a class="nav-item nav-link active" data-toggle="tab" data-target="#format-setup-edit" href="#format-setup-edit" role="tab" aria-selected="true">修改报表模板</a>
-                        <!-- <a class="nav-item nav-link" data-toggle="tab" data-target="#format-setup-private" href="#format-setup-private" role="tab" aria-selected="false">报表私有化</a> -->
+                        <% if (isAdmin) {%>
+                        <a class="nav-item nav-link" data-toggle="tab" data-target="#format-setup-private" href="#format-setup-private" role="tab" aria-selected="false">报表私有化</a>
+                        <% } %>
                     </nav>
                     <div class="tab-content m-3">
                         <div id="format-setup-edit" class="tab-pane active">
@@ -124,25 +126,40 @@
                                             <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" aria-labelledby="dropdownMenuButton" style="width:220px">
-												<div class="mb-2 p-2"><input class="form-control form-control-sm" placeholder="姓名/手机 检索"></div>
+                                            <div class="dropdown-menu" id="format-setup-add-user" aria-labelledby="dropdownMenuButton" style="width:220px">
+												<!-- <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">中交第一公路工程局有限公司国道311线满别公路施工一分部</span>
-														</dd>
-													<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">中交第一公路工程局有限公司国道311线满别公路施工一分部</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>
+                                                    <% accountGroup.forEach((group, idx) => { %>
+                                                        <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
+                                                        <div class="dd-content" data-toggleid="<%- idx %>">
+                                                            <% group.groupList.forEach(item => { %>
+                                                                <dd class="border-bottom p-2 mb-0 user-item" data-id="<%- item.id %>" >
+                                                                    <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
+                                                                                class="ml-auto"><%- item.mobile %></span>
+                                                                        <span class="selected-mark text-success ml-2" style="display:none;"><i class="fa fa-check"></i></span>
+                                                                    </p>
+                                                                    <span class="text-muted"><%- item.role %></span>
+                                                                </dd>
+                                                            <% });%>
+                                                        </div>
+                                                    <% }) %>
 												</dl>
 											</div>
                                         </div>
                                     </div>
+                                    <div class="col-6 pl-0">
+                                        <table class="table table-hover table-bordered table-sm mt-3">
+                                            <thead>
+                                                <tr>
+                                                <th class="text-center" width="25%">用户</th>
+                                                <th class="text-center" width="35%">职位/角色</th>
+                                                <th class="text-center" width="25%">添加时间</th>
+                                                <th class="text-center" width="15%">操作</th>
+                                                </tr>  
+                                            </thead>
+                                            <tbody class="text-center"></tbody>
+                                        </table>
+                                    </div>
                                 </div>
                             </div>
                         </div>
@@ -254,6 +271,83 @@
     getReportTemplateTree();
     refreshNodes();
 
+    <% if (isAdmin) {%>
+    // 初始化 报表私有化 用户
+    $('body').on('click', '#format-setup-add-user .book-list dt', function () {
+        const idx = $(this).find('.acc-btn').attr('data-groupid');
+        const type = $(this).find('.acc-btn').attr('data-type');
+        if (type === 'hide') {
+            $(this).parent().find(`div[data-toggleid="${idx}"]`).show(() => {
+                $(this).children().find('i').removeClass('fa-plus-square').addClass('fa-minus-square-o');
+                $(this).find('.acc-btn').attr('data-type', 'show');
+
+            })
+        } else {
+            $(this).parent().find(`div[data-toggleid="${idx}"]`).hide(() => {
+                $(this).children().find('i').removeClass('fa-minus-square-o').addClass('fa-plus-square');
+                $(this).find('.acc-btn').attr('data-type', 'hide');
+            })
+        }
+        return false;
+    });    
+    // format-setup-add-user
+    $('body').on('click', '#format-setup-add-user dl dd', function (e) {
+        console.log(e);
+    });
+    function iniPrivateReport() {
+        //
+    }
+    <% } %>
+
+    function updateSelectedMarks(forcedType = null) { 
+        let currentUserListSelector = '';
+        let selectedIdsArray = []; 
+        let currentType = forcedType; 
+        if (!currentType) {
+            const $activeTabPane = $('.tab-pane.active');
+            const activeTabId = $activeTabPane.attr('id');
+            switch(activeTabId) {
+                case 'guest': currentType = 'tourist'; break;
+                case 'tzpro': currentType = 'schedule'; break;
+                case 'htgl': currentType = 'contract'; break;
+                case 'sgrz': currentType = 'construction'; break;
+                case 'zlgl': currentType = 'quality'; break;
+                case 'zlxj': currentType = 'inspection'; break;
+                default: currentType = null;
+            }
+        }
+
+        if (currentType && selectedUserIdsByType.hasOwnProperty(currentType)) {
+            switch(currentType) {
+                case 'tourist': currentUserListSelector = '#tourist-users'; break;
+                case 'schedule': currentUserListSelector = '#schedule-users'; break;
+                case 'contract': currentUserListSelector = '#contract-users'; break;
+                case 'construction': currentUserListSelector = '#construction-users'; break;
+                case 'quality': currentUserListSelector = '#quality-users'; break;
+                case 'inspection': currentUserListSelector = '#inspection-users'; break;
+            }
+            selectedIdsArray = selectedUserIdsByType[currentType];
+        } else {
+            $('.user-item').find('.selected-mark').hide();
+            $('.user-item').removeClass('bg-light');
+            return;
+        }
+        if ($('#add_user_dropdownMenu2 .book-list').length > 0) {
+            $('.user-item').each(function() {
+                const userIdStr = $(this).data('id');
+                const userId = parseInt(userIdStr, 10);
+                const $mark = $(this).find('.selected-mark');
+                if (!isNaN(userId) && selectedIdsArray.includes(userId)) {
+                    $mark.show();
+                    $(this).addClass('bg-light');
+                } else {
+                    $mark.hide();
+                    $(this).removeClass('bg-light');
+                }
+            });
+        }
+    }
+
     function buildTplTree() {
         if (TOP_TREE_NODES.length > 0) {
             //1. 整理模板树 (原始状态的TOP_TREE_NODES包含了推荐报表与定制表,需要分割)