Forráskód Böngészése

安全计量标段部分功能和权限设置

ellisran 1 hete
szülő
commit
20455aedc3

+ 1 - 1
app/base/base_controller.js

@@ -58,7 +58,7 @@ class BaseController extends Controller {
                     } else if (index === 'safe') {
                         for (const child of im.children) {
                             if (child.msg === 'payment') {
-                                // child.url = `/sp/${ctx.subProject.id}/contract/panel`;
+                                child.url = `/sp/${ctx.subProject.id}/safe`;
                             } else if (child.msg === 'inspection') {
                                 child.url = `/sp/${ctx.subProject.id}/safe/inspection`;
                             }

+ 2 - 0
app/const/shenpi.js

@@ -20,6 +20,7 @@ const sp_type = {
     phasePay: 9,
     inspection: 10,
     safe_inspection: 11,
+    safe_payment: 12,
 };
 const sp_other_type = {
     financial: 8,
@@ -43,6 +44,7 @@ const sp_lc = [
     // { code: 'financial', type: sp_type.financial, name: '资金支付审批' },
     { code: 'phasePay', type: sp_type.phasePay, name: '合同支付审批' },
     { code: 'inspection', type: sp_type.inspection, name: '质量巡检审批' },
+    { code: 'safe_payment', type: sp_type.payment, name: '安全计量审批' },
     { code: 'safe_inspection', type: sp_type.inspection, name: '安全巡检审批' },
 ];
 

+ 3 - 1
app/const/sp_page_show.js

@@ -17,7 +17,7 @@ const pageStatus = {
 const managerPageControl = [
     { title: '项目概况', name: 'openInfo', value: pageStatus.show, type: 'checkbox' },
     { title: '决策大屏', name: 'openDataCollect', value: pageStatus.show, type: 'checkbox', tip: '开启后,前台配置用户权限后方可显示' },
-    { title: '合同管理', name: 'openContract', value: pageStatus.show, type: 'checkbox' },
+    { title: '项目合同', name: 'openContract', value: pageStatus.show, type: 'checkbox' },
     { title: '资料管理', name: 'openFile', value: pageStatus.show, type: 'checkbox' },
     { title: '动态投资', name: 'openBudget', value: pageStatus.show, type: 'checkbox', tip: '开启后,前台配置用户权限后方可显示' },
     { title: '支付审批', name: 'openPayment', value: pageStatus.show, type: 'checkbox', tip: '开启后,前台配置用户权限后方可显示' },
@@ -35,6 +35,7 @@ const tenderPageControl = [
     { title: '合同管理', name: 'openTenderContract', value: pageStatus.show, type: 'checkbox' },
     { title: '质量管理', name: 'quality', value: pageStatus.show, type: 'checkbox' },
     { title: '质量巡检', name: 'qualityInspection', value: pageStatus.show, type: 'checkbox' },
+    { title: '安全计量', name: 'safePayment', value: pageStatus.show, type: 'checkbox' },
     { title: '安全巡检', name: 'safeInspection', value: pageStatus.show, type: 'checkbox' },
 ];
 // 报表相关开关
@@ -113,6 +114,7 @@ const defaultSetting = {
     correctCalcContractTp: 0,
     quality: 1,
     qualityInspection: 1,
+    safePayment: 1,
     safeInspection: 1,
 };
 

+ 3 - 3
app/controller/quality_controller.js

@@ -70,7 +70,7 @@ module.exports = app => {
             } catch (err) {
                 ctx.log(err);
                 ctx.postError(err, '无法查看质量管理数据');
-                ctx.redirect('/dashboard');
+                ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
             }
         }
 
@@ -106,7 +106,7 @@ module.exports = app => {
             } catch (err) {
                 ctx.log(err);
                 ctx.postError(err, '无法查看质量巡检数据');
-                ctx.redirect('/dashboard');
+                ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
             }
         }
 
@@ -148,7 +148,7 @@ module.exports = app => {
                 }
                 let uids;
                 let auditList = [];
-                const tenderPermissionKeys = ['quality', 'inspection', 'safe_inspection'];
+                const tenderPermissionKeys = ['quality', 'inspection', 'safe_inspection', 'safe_payment'];
                 switch (data.type) {
                     case 'add-audit':
                         if (!data.key || !tenderPermissionKeys.includes(data.key)) throw '参数有误';

+ 37 - 1
app/controller/safe_controller.js

@@ -38,6 +38,42 @@ module.exports = app => {
             };
         }
 
+        async tender(ctx) {
+            try {
+                if (!ctx.subProject.page_show.safePayment) throw '该功能已关闭';
+
+                const renderData = {
+                    is_inspection: ctx.url.includes('inspection') ? 1 : 0,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.safe.tender),
+                };
+
+                const accountList = await ctx.service.projectAccount.getAllSubProjectAccount(ctx.subProject);
+                renderData.accountList = accountList;
+                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 };
+                }).filter(x => { return x.groupList.length > 0; });
+                // const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
+                // renderData.accountGroup = unitList.map(item => {
+                //     const groupList = accountList.filter(item1 => item1.company === item.name);
+                //     return { groupName: item.name, groupList };
+                // });
+                renderData.accountGroup = accountGroupList;
+                renderData.accountInfo = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
+                renderData.tenderList = await ctx.service.tender.getSpecList(ctx.service.tenderPermission, 'safe_payment', ctx.session.sessionUser.is_admin ? 'all' : '');
+                renderData.categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
+                renderData.selfCategoryLevel = this.ctx.subProject.permission.self_category_level;
+                renderData.permissionConst = ctx.service.tenderPermission.partPermissionConst('safe_payment');
+                renderData.permissionBlock = ctx.service.tenderPermission.partPermissionBlock('safe_payment');
+                await this.layout('safe/tender.ejs', renderData, 'safe/tender_modal.ejs');
+            } catch (err) {
+                ctx.log(err);
+                ctx.postError(err, '无法查看安全计量数据');
+                ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
+            }
+        }
+
         async inspectionTender(ctx) {
             try {
                 if (!ctx.subProject.page_show.safeInspection) throw '该功能已关闭';
@@ -70,7 +106,7 @@ module.exports = app => {
             } catch (err) {
                 ctx.log(err);
                 ctx.postError(err, '无法查看安全巡检数据');
-                ctx.redirect('/dashboard');
+                ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
             }
         }
 

+ 11 - 6
app/controller/sub_proj_setting_controller.js

@@ -591,9 +591,10 @@ module.exports = app => {
                     change_type_list: shenpiConst.change_type_list,
                     subProjects,
                 };
+                const permissionKey = ['quality', 'inspection', 'safe_inspection', 'safe_payment'];
                 renderData.selfCategoryLevel = await this.ctx.service.projectAccount.getSelfCategoryLevel(this.ctx.session.sessionUser.accountId);
-                renderData.permissionConst = ctx.service.tenderPermission.partPermissionConst(['quality', 'inspection', 'safe_inspection']);
-                renderData.permissionBlock = ctx.service.tenderPermission.partPermissionBlock(['quality', 'inspection', 'safe_inspection']);
+                renderData.permissionConst = ctx.service.tenderPermission.partPermissionConst(permissionKey);
+                renderData.permissionBlock = ctx.service.tenderPermission.partPermissionBlock(permissionKey);
                 await this.layout('sp_setting/manage.ejs', renderData, 'sp_setting/manage_modal.ejs');
             } catch (error) {
                 ctx.log(error);
@@ -622,6 +623,7 @@ module.exports = app => {
                 //     throw '标段不存在';
                 // }
                 // const tenderInfo = await ctx.service.tenderInfo.getTenderInfo(tender.id);
+                const permissionKey = ['quality', 'inspection', 'safe_inspection', 'safe_payment'];
                 switch (data.type) {
                     case 'msg':
                         if (!data.tid) {
@@ -646,9 +648,12 @@ module.exports = app => {
                         responseData.data.scheduleAuditList = await ctx.service.scheduleAudit.getAllDataByCondition({ where: { tid: tender.id } });
                         responseData.data.contractAuditList = await ctx.service.contractAudit.getList({ tid: tender.id });
                         responseData.data.constructionAuditList = await ctx.service.constructionAudit.getList(tender.id);
-                        responseData.data.qualityAuditList = await ctx.service.tenderPermission.getPartsPermission(tender.id, ['quality']);
-                        responseData.data.inspectionAuditList = await ctx.service.tenderPermission.getPartsPermission(tender.id, ['inspection']);
-                        responseData.data.safe_inspectionAuditList = await ctx.service.tenderPermission.getPartsPermission(tender.id, ['safe_inspection']);
+                        for (const key of permissionKey) {
+                            responseData.data[`${key}AuditList`] = await ctx.service.tenderPermission.getPartsPermission(tender.id, [key]);
+                        }
+                        // responseData.data.qualityAuditList = await ctx.service.tenderPermission.getPartsPermission(tender.id, ['quality']);
+                        // responseData.data.inspectionAuditList = await ctx.service.tenderPermission.getPartsPermission(tender.id, ['inspection']);
+                        // responseData.data.safe_inspectionAuditList = await ctx.service.tenderPermission.getPartsPermission(tender.id, ['safe_inspection']);
                         break;
                     case 'copy2otu':
                         if (data.userType === 'tourist') {
@@ -659,7 +664,7 @@ module.exports = app => {
                             await ctx.service.contractAudit.setOtherTender(data.tidList, data.auditList);
                         } else if (data.userType === 'construction') {
                             await ctx.service.constructionAudit.setOtherTender(data.tidList, data.auditList);
-                        } else if (data.userType === 'quality' || data.userType === 'inspection' || data.userType === 'safe_inspection') {
+                        } else if (permissionKey.includes(data.userType)) {
                             await ctx.service.tenderPermission.setOtherTender(data.tidList, data.auditList, [data.userType]);
                         } else {
                             throw '参数有误';

+ 3 - 2
app/public/js/setting_manage.js

@@ -177,10 +177,11 @@ $(document).ready(() => {
         construction: '施工日志',
         quality: '质量管理',
         inspection: '质量巡检',
+        safe_payment: '安全计量',
         safe_inspection: '安全巡检',
     };
-    const tabTypeKeys = ['tourist', 'schedule', 'contract', 'construction', 'quality', 'inspection', 'safe_inspection'];
-    const tenderPermissionKeys = ['quality', 'inspection', 'safe_inspection'];
+    const tabTypeKeys = ['tourist', 'schedule', 'contract', 'construction', 'quality', 'inspection', 'safe_inspection', 'safe_payment'];
+    const tenderPermissionKeys = ['quality', 'inspection', 'safe_inspection', 'safe_payment'];
 
     const $filterTenderDone = $('body #filter-tender-done')
     if (window.location.search && window.location.search.split('done=')[1]) {

+ 3 - 0
app/router.js

@@ -498,6 +498,9 @@ module.exports = app => {
     app.get('/sp/:id/quality/tender/:tid/inspection/:qiid/information/file/:fid/download', sessionAuth, subProjectCheck, tenderCheck, tenderPermissionCheck, qualityInspectionCheck, 'qualityController.downloadInspectionFile');
 
     // 安全管理
+    // 安全计量
+    app.get('/sp/:id/safe', sessionAuth, subProjectCheck, 'safeController.tender');
+    // 安全巡检
     app.get('/sp/:id/safe/inspection', sessionAuth, subProjectCheck, 'safeController.inspectionTender');
     app.get('/sp/:id/safe/tender/:tid/inspection', sessionAuth, subProjectCheck, tenderCheck, tenderPermissionCheck, 'safeController.inspection');
     app.post('/sp/:id/safe/tender/:tid/inspection/save', sessionAuth, subProjectCheck, tenderCheck, tenderPermissionCheck, 'safeController.inspectionSave');

+ 1 - 1
app/service/sub_proj_permission.js

@@ -74,7 +74,7 @@ module.exports = app => {
             this.PermissionBlock = [
                 { key: 'datacollect', name: '决策大屏', field: 'datacollect_permission' },
                 { key: 'info', name: '项目概况', field: 'info_permission' },
-                { key: 'contract', name: '合同管理', field: 'contract_permission', hint: ['1、编辑节点:编辑合同管理内页树结构',
+                { key: 'contract', name: '项目合同', field: 'contract_permission', hint: ['1、编辑节点:编辑合同管理内页树结构',
                         '2、添加合同:允许添加合同',
                         '3、编辑合同:编辑非自己上传的合同信息',
                         '4、添加支付:给非自己上传的合同添加合同支付',

+ 5 - 0
app/service/tender_permission.js

@@ -36,12 +36,17 @@ module.exports = app => {
                     view: { title: '查看', value: 1, isDefault: 1 },
                     add: { title: '新增巡检', value: 2 },
                     view_all: { title: '查看所有巡检', value: 3 },
+                },
+                safe_payment: {
+                    view: { title: '查看', value: 1, isDefault: 1 },
+                    add: { title: '上报人', value: 2 },
                 }
             };
             this.PermissionBlock = [
                 { key: 'quality', name: '质量管理', field: 'quality' },
                 { key: 'inspection', name: '质量巡检', field: 'inspection' },
                 { key: 'safe_inspection', name: '安全巡检', field: 'safe_inspection' },
+                { key: 'safe_payment', name: '安全计量', field: 'safe_payment' },
             ];
             for (const p of this.PermissionBlock) {
                 if (p.children) {

+ 26 - 1
app/view/sp_setting/manage.ejs

@@ -26,10 +26,11 @@
                     <a class="nav-item nav-link active" data-toggle="tab" href="#splc" role="tab">审批流程</a>
                     <a class="nav-item nav-link" data-toggle="tab" href="#guest" role="tab">游客账号</a>
                     <a class="nav-item nav-link" data-toggle="tab" href="#tzpro" role="tab">投资进度</a>
-                    <a class="nav-item nav-link" data-toggle="tab" href="#htgl" role="tab">合同管理</a>
+                    <a class="nav-item nav-link" data-toggle="tab" href="#htgl" role="tab">标段合同</a>
                     <a class="nav-item nav-link" data-toggle="tab" href="#sgrz" role="tab">施工日志</a>
                     <a class="nav-item nav-link" data-toggle="tab" href="#quality" role="tab">质量管理</a>
                     <a class="nav-item nav-link" data-toggle="tab" href="#inspection" role="tab">质量巡检</a>
+                    <a class="nav-item nav-link" data-toggle="tab" href="#safe_payment" role="tab">安全计量</a>
                     <a class="nav-item nav-link" data-toggle="tab" href="#safe_inspection" role="tab">安全巡检</a>
 <!--                    <a class="nav-item nav-link" data-toggle="tab" href="#subadmin" role="tab">标段管理员</a>-->
                     <div class="ml-auto" id="user-set" style="display: none">
@@ -276,6 +277,30 @@
                             </table>
                         </div>
                     </div>
+                    <!--质量巡检 -->
+                    <div id="safe_payment" class="tab-pane">
+                        <div class="col-8" style="max-width: 800px">
+                            <table class="table table-hover table-bordered table-sm">
+                                <thead class="text-center">
+                                <tr>
+                                    <th class="align-middle" rowspan="2">成员名称</th>
+                                    <th class="align-middle" rowspan="2">角色/职位</th>
+                                    <% const safePaymentPb = permissionBlock.find(item => item.key === 'safe_payment'); %>
+                                    <th colspan="<%- safePaymentPb.permission.filter(x => { return !x.isDefault; }).length %>"><%- safePaymentPb.name %></th>
+                                    <th class="align-middle" rowspan="2">操作</th>
+                                </tr>
+                                <tr>
+                                    <% for (const p of safePaymentPb.permission) { %>
+                                        <% if (p.isDefault) continue; %>
+                                        <th><%- p.title %></th>
+                                    <% } %>
+                                </tr>
+                                </thead>
+                                <tbody id="safe_payment-users">
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
                     <!--安全巡检 -->
                     <div id="safe_inspection" class="tab-pane">
                         <div class="col-8" style="max-width: 800px">

+ 1 - 1
app/view/sp_setting/permission.ejs

@@ -31,7 +31,7 @@
                                 <dl class="list-group">
                                     <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=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>

+ 2 - 1
sql/update.sql

@@ -116,7 +116,8 @@ ADD COLUMN `check_api` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NO
 
 ALTER TABLE `zh_tender_permission`
 ADD COLUMN `inspection` varchar(255) NOT NULL DEFAULT '' COMMENT '质量巡检权限(,分隔,具体见代码定义)' AFTER `quality`,
-ADD COLUMN `safe_inspection` varchar(255) NOT NULL DEFAULT '' COMMENT '安全巡检权限(,分隔,具体见代码定义)' AFTER `inspection`;
+ADD COLUMN `safe_inspection` varchar(255) NOT NULL DEFAULT '' COMMENT '安全巡检权限(,分隔,具体见代码定义)' AFTER `inspection`,
+ADD COLUMN `safe_payment` varchar(255) NOT NULL DEFAULT '' COMMENT '安全计量权限(,分隔,具体见代码定义)' AFTER `safe_inspection`;
 
 ALTER TABLE `zh_budget`
 ADD COLUMN `final_type` varchar(50) NOT NULL DEFAULT 'code_name' COMMENT '决算汇总规则' AFTER `final_id`;