浏览代码

code sync

TonyKang 5 年之前
父节点
当前提交
c5b83f0c3a

+ 4 - 1
app/controller/report_controller.js

@@ -33,6 +33,7 @@ module.exports = app => {
                 const custCfg = await ctx.service.rptCustomizeCfg.getCustomizeCfgByUserId('Administrator');
                 const stageList = await ctx.service.stage.getValidStagesShort(tender.id);
                 const prjAccList = await ctx.service.projectAccount.getAllAccountByProjectId(tender.data.project_id);
+                const roleList = await ctx.service.signatureRole.getSignatureRolesByTenderId(tender.id);
                 // console.log(maxStageAmt[0].maxAmt);
                 if (stage !== null && stage !== undefined) {
                     stage_id = stage.id;
@@ -53,6 +54,7 @@ module.exports = app => {
                     stg_status: stage_status,
                     stage_list: JSON.stringify(stageList),
                     prj_account_list: JSON.stringify(prjAccList),
+                    role_list: JSON.stringify(roleList),
                     tenderMenu,
                     preUrl: '/tender/' + tender.id,
                     measureType,
@@ -87,6 +89,7 @@ module.exports = app => {
                 // test
                 const pageRst = await getAllPagesCommon(ctx, rptTpl, params, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_NORMAL);
                 // console.log(pageRst);
+                const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id);
                 /*
                 // --------------------------
                 const printCom = JpcEx.createNew();
@@ -98,7 +101,7 @@ module.exports = app => {
                 const pageRst = printCom.outputAsPreviewPage(rptTpl, JSON.parse(defProperties[0].defined_content));
                 // console.log(pageRst);
                 */
-                ctx.body = { data: pageRst };
+                ctx.body = { data: pageRst, signatureRelInfo: roleRel };
                 // ctx.body = { data: { msg: 'test the network' } };
                 ctx.status = 201;
             } catch (ex) {

+ 27 - 0
app/controller/signature_controller.js

@@ -0,0 +1,27 @@
+'use strict';
+/**
+ * Created by Tony on 2019/9/26.
+ */
+
+module.exports = app => {
+    class ReportController extends app.BaseController {
+
+        /**
+         * 获取报表数据
+         *
+         * @param {Object} ctx - egg全局context
+         * @return {void}
+         */
+        async createSignatureRole(ctx) {
+            const params = JSON.parse(ctx.request.body.params);
+            // console.log(params);
+            const rst = await ctx.service.signatureRole.createRole(params.name, params.bind_acc_id, params.prj_id, params.tender_id);
+            // console.log(rst);
+            ctx.body = { data: rst };
+            // ctx.body = { data: { msg: 'test the network' } };
+            ctx.status = 201;
+        }
+    }
+
+    return ReportController;
+};

二进制
app/public/images/20190926_sign_1569481904.png


二进制
app/public/images/20190926_sign_1569481905.png


二进制
app/public/images/20190926_sign_1569482230.png


二进制
app/public/images/20190926_sign_kt.png


+ 3 - 0
app/public/report/js/rpt_main.js

@@ -241,6 +241,8 @@ let zTreeOprObj = {
             function(result){
                 // hintBox.unWaitBox();
                 let pageRst = result.data;
+                ROLE_REL_LIST = result.signatureRelInfo;
+                // if (ROLE_REL_LIST)
                 let canvas = zTreeOprObj.canvas;
                 if (pageRst && pageRst.items && pageRst.items.length > 0) {
                     me.resetAfter(pageRst);
@@ -257,6 +259,7 @@ let zTreeOprObj = {
                     }
                     // zTreeOprObj.resetESignature(zTreeOprObj.currentRptPageRst);
                     rptSignatureHelper.buildSelectableAccount();
+                    rptSignatureHelper.buildRoleDom(ROLE_LIST);
                     me.showPage(1, canvas);
                 } else {
                     //返回了无数据表

+ 168 - 30
app/public/report/js/rpt_signature.js

@@ -19,7 +19,8 @@ let rptSignatureHelper = {
         const prj_accounts = [];
         const prj_sel_option_accounts = [];
         const acc_role_keys = [];
-        for (const prjAccount of PRJ_ACCOUNT_LIST) {
+        for (let accIdx = 0; accIdx < PRJ_ACCOUNT_LIST.length; accIdx++) {
+            const prjAccount = PRJ_ACCOUNT_LIST[accIdx];
             let companyKey = prjAccount.company;
             let roleKey = prjAccount.role;
             if (companyKey === '') {
@@ -40,9 +41,9 @@ let rptSignatureHelper = {
                 prj_sel_option_accounts[keyIdx].push('<optgroup label=" ' + companyKey + '">');
             }
             //push item
-            prj_accounts[keyIdx].push('<li class="add-sign-list-item"><a onclick="rptSignatureHelper.drawEsignature(' + keyIdx + ')" class="btn-link pull-right" title="添加" data-dismiss="modal"><i class="fa fa-plus"></i></a>' +
+            prj_accounts[keyIdx].push('<li class="add-sign-list-item"><a href="javascript:void(0)" onclick="rptSignatureHelper.createEsignatureByAccIdx(' + accIdx + ')" class="btn-link pull-right" title="添加" data-dismiss="modal"><i class="fa fa-plus"></i></a>' +
                 prjAccount.name + '-<small class="text-muted">' + roleKey + '</small></li>');
-            prj_sel_option_accounts[keyIdx].push('<option value="' + keyIdx + '">' + prjAccount.name + '-' + roleKey + '</option>');
+            prj_sel_option_accounts[keyIdx].push('<option value="' + accIdx + '">' + prjAccount.name + '-' + roleKey + '</option>');
         }
         for (const prjAccList of prj_accounts) {
             prjAccList.push('</ul>');
@@ -60,7 +61,7 @@ let rptSignatureHelper = {
     drawEsignature: function (accIdx) {
         let dftSignSrc = '/public/images/user-sign.PNG';
         if (PRJ_ACCOUNT_LIST[accIdx].sign_path !== '') {
-            dftSignSrc = PRJ_ACCOUNT_LIST[accIdx].sign_path;
+            dftSignSrc = '/public/images/' + PRJ_ACCOUNT_LIST[accIdx].sign_path;
         }
         //找到相关签名地方,stamp!
         if (rptSignatureHelper.currentSelectedESignAccName !== null) {
@@ -74,18 +75,14 @@ let rptSignatureHelper = {
                 }
             }
             // 1. 删除不需要的child dom
-            let list = rptSignatureHelper.currentSelectedESignAccDom.childNodes;
-            if (list && list.length > 0) {
-                for (let domIdx = list.length - 1; domIdx >= 0; domIdx--) {
-                    rptSignatureHelper.currentSelectedESignAccDom.removeChild(list[domIdx]);
-                }
-            }
+            $(rptSignatureHelper.currentSelectedESignAccDom).empty();
             // 2. 创建已选择签名相关 dom
             const canvasWidth = 60;
             const canvasHeight = 30;
             // 2.1 canvas / X
             const elementsStrArr = [];
             elementsStrArr.push('<p class=" d-flex justify-content-between m-0"><canvas id="signCanvas' + accIdx + '" width="' + canvasWidth + '" height="' + canvasHeight + '"></canvas><a onclick="rptSignatureHelper.removeSignature(this)" class="text-danger"><i class="fa fa-remove" title="移除签名"></i></a></p>');
+            $(rptSignatureHelper.currentSelectedESignAccDom).append(elementsStrArr.join(' '));
             let imgObj = new Image();
             imgObj.src = dftSignSrc;
             imgObj.onload = function(){
@@ -94,11 +91,79 @@ let rptSignatureHelper = {
                 ctx.drawImage(this, 0, 0, canvasWidth, canvasHeight);
             }
             //.appendChild(pNode);
+            //*/
+            // 2.2 date-picker
+        }
+    },
+    createEsignatureByAccIdx: function (accIdx) {
+        rptSignatureHelper.createPreSelectedSignature(PRJ_ACCOUNT_LIST[accIdx], null);
+    },
+    createEsignatureByRoleIdx: function (roleIdx) {
+        rptSignatureHelper.createPreSelectedSignature(null, ROLE_LIST[roleIdx]);
+    },
+    createPreSelectedSignature: function (directAcc, roleAcc) {
+        let dftSignSrc = '/public/images/user-sign.PNG';
+        let userAcc = directAcc;
+        if (roleAcc) {
+            userAcc = rptSignatureHelper.getUserAccount(roleAcc.bind_acc_id);
+        }
+        if (userAcc.sign_path !== '') {
+            dftSignSrc = '/public/images/' + userAcc.sign_path;
+        }
+        if (rptSignatureHelper.currentSelectedESignAccName !== null) {
+            for (const page of zTreeOprObj.currentRptPageRst.items) {
+                if (page.signature_cells) {
+                    for (const sCell of page.signature_cells) {
+                        if (sCell.signature_name === rptSignatureHelper.currentSelectedESignAccName) {
+                            sCell.pre_path = dftSignSrc;
+                        }
+                    }
+                }
+            }
+            // 1. 删除不需要的child dom
+            $(rptSignatureHelper.currentSelectedESignAccDom).empty();
+            // 2. 创建已选择签名相关 dom
+            rptSignatureHelper.cleanOldSignature(rptSignatureHelper.currentSelectedESignAccName);
+            // 2.1 dom element
+            const elementsStrArr = [];
+            if (directAcc) {
+                rptSignatureHelper.pushDomElementByUser(elementsStrArr, userAcc.name, userAcc.role);
+                // 还有ROLE_REL_LIST
+                let roleRelObj = {};
+                roleRelObj.signature_name = rptSignatureHelper.currentSelectedESignAccName;
+                roleRelObj.sign_path = dftSignSrc;
+                roleRelObj.user_name = userAcc.name;
+                roleRelObj.type = '用户';
+                roleRelObj.role = (userAcc.role === '')?"工程师":userAcc.role;
+                ROLE_REL_LIST.push(roleRelObj);
+            } else if (roleAcc) {
+                // 创建相关dom元素
+                rptSignatureHelper.pushDomElementByRole(elementsStrArr, roleAcc.name, userAcc.name);
+                // 还有ROLE_REL_LIST
+                let roleRelObj = {};
+                roleRelObj.signature_name = rptSignatureHelper.currentSelectedESignAccName;
+                roleRelObj.sign_path = dftSignSrc;
+                roleRelObj.user_name = userAcc.name;
+                roleRelObj.type = '角色';
+                roleRelObj.role = (userAcc.role === '')?"工程师":userAcc.role;
+                roleRelObj.role_name = roleAcc.name;
+                ROLE_REL_LIST.push(roleRelObj);
+            }
+            // elementsStrArr.push('');
             $(rptSignatureHelper.currentSelectedESignAccDom).append(elementsStrArr.join(' '));
+            //.appendChild(pNode);
             //*/
             // 2.2 date-picker
         }
     },
+    cleanOldSignature: function (signature_name) {
+        // 清掉ROLE_REL_LIST原有的签名
+        for (let idx = ROLE_REL_LIST.length - 1; idx >= 0 ; idx--) {
+            if (ROLE_REL_LIST[idx].signature_name === signature_name) {
+                ROLE_REL_LIST.splice(idx, 1);
+            }
+        }
+    },
     resetESignature: function (pageRst) {
         let body = $('#eSignatureBodyDiv');
         body.empty();
@@ -116,9 +181,6 @@ let rptSignatureHelper = {
         }
         if (signature_cells.length > 0) {
             const elementsStrArr = [];
-            const canvasWidth = 60;
-            const canvasHeight = 30;
-
             for (let scIdx = 0; scIdx < signature_cells.length; scIdx++) {
                 const sCell = signature_cells[scIdx];
                 elementsStrArr.push('<div class="form-group row">');
@@ -127,17 +189,16 @@ let rptSignatureHelper = {
                 elementsStrArr.push('<ul class="list-group">');
                 elementsStrArr.push('<li class="list-group-item">');
                 if (sCell.path || sCell.pic) {
-                    elementsStrArr.push('<p class=" d-flex justify-content-between m-0"><canvas id="signCanvas' + scIdx + '" width="' + canvasWidth + '" height="' + canvasHeight + '"></canvas><a onclick="rptSignatureHelper.removeSignature(this)" class="text-danger"><i class="fa fa-remove" title="移除签名"></i></a></p>');
-                    let imgObj = new Image();
-                    if (sCell.path) {
-                        imgObj.src = sCell.path;
-                    } else {
-                        imgObj.src = sCell.pic;
-                    }
-                    imgObj.onload = function(){
-                        let canvasNode = document.getElementById('signCanvas' + scIdx);
-                        let ctx = canvasNode.getContext('2d');
-                        ctx.drawImage(this, 0, 0, canvasWidth, canvasHeight);
+                    for (const role_rel of ROLE_REL_LIST) {
+                        if (role_rel.signature_name === sCell.signature_name) {
+                            if (role_rel.type === '用户') {
+                                rptSignatureHelper.pushDomElementByUser(elementsStrArr, role_rel.user_name, role_rel.role);
+                            } else {
+                                //角色
+                                rptSignatureHelper.pushDomElementByRole(elementsStrArr, role_rel.role_name, role_rel.user_name);
+                            }
+                            break;
+                        }
                     }
                 } else {
                     elementsStrArr.push('<a href="#add-sign" onclick="rptSignatureHelper.currentSelectedESignAccDom = this.parentNode; rptSignatureHelper.currentSelectedESignAccName = \'' + sCell.signature_name + '\'" data-toggle="modal" data-target="#add-sign"><i class="fa fa-plus"></i> 添加签名</a>');
@@ -150,13 +211,23 @@ let rptSignatureHelper = {
             body.append(elementsStrArr.join(' '));
         }
     },
+    pushDomElementByUser: function (elementsStrArr, userName, userRole) {
+        elementsStrArr.push('<p class=" d-flex justify-content-between m-0"><span>' + userName +
+            '-<small class="text-muted">' + ((userRole === '')?"工程师":userRole) +
+            '</small></span><a onclick="rptSignatureHelper.removeSignature(this)" class="text-danger"><i class="fa fa-remove" title="移除签名"></i></a></p>')
+    },
+    pushDomElementByRole: function (elementsStrArr, roleName, userName) {
+        elementsStrArr.push('<p class=" d-flex justify-content-between m-0"><span><i class="fa fa-user" title="角色"> ' + roleName +
+            '</i>-<small class="text-muted">' + userName +
+            '</small></span><a onclick="rptSignatureHelper.removeSignature(this)" class="text-danger"><i class="fa fa-remove" title="移除签名"></i></a></p>')
+    },
     removeSignature: function (dom) {
         let accTxtName = $(dom.parentNode.parentNode.parentNode.parentNode.parentNode).find('label')[0].innerText;
         let jDom = $(dom.parentNode.parentNode);
         jDom.empty();
-        jDom.append('<a href="#add-sign" onclick="rptSignatureHelper.currentSelectedESignAccDom = dom.parentNode; rptSignatureHelper.currentSelectedESignAccName = \'' +
+        jDom.append('<a href="#add-sign" onclick="rptSignatureHelper.currentSelectedESignAccDom = this.parentNode; rptSignatureHelper.currentSelectedESignAccName = \'' +
             accTxtName + '\'" data-toggle="modal" data-target="#add-sign"><i class="fa fa-plus"></i> 添加签名</a>');
-        //要记得清空相关pre_path属性
+        // 要记得清空相关pre_path属性
         for (const page of zTreeOprObj.currentRptPageRst.items) {
             if (page.signature_cells) {
                 for (const sCell of page.signature_cells) {
@@ -166,6 +237,10 @@ let rptSignatureHelper = {
                 }
             }
         }
+        // 还有ROLE_REL_LIST
+        for (let idx = 0; idx < ROLE_REL_LIST.length; idx++) {
+            //
+        }
     },
     removeSelectSignature: function () {
         for (const page of zTreeOprObj.currentRptPageRst.items) {
@@ -193,13 +268,76 @@ let rptSignatureHelper = {
         zTreeOprObj.showPage(zTreeOprObj.currentPage, zTreeOprObj.canvas);
     },
     switchAddRoleDiv: function (dom) {
-        if (dom.nextElementSibling.style.display === 'none') {
-            dom.nextElementSibling.style.display = '';
+        if (dom.nextElementSibling.children[0].style.display === 'none') {
+            dom.nextElementSibling.children[0].style.display = '';
         } else {
-            dom.nextElementSibling.style.display = 'none';
+            dom.nextElementSibling.children[0].style.display = 'none';
         }
     },
     createNewRole: function (dom) {
-        //acc_role_name fa fa-remove
+        if ($('#acc_role_name')[0].value !== '') {
+            const params = {};
+            params.name = $('#acc_role_name')[0].value;
+            const selectedAcc = PRJ_ACCOUNT_LIST[$('#project_account_select_dom')[0].selectedOptions[0].value];
+            const roleName = (selectedAcc.role === '')?'工程师':selectedAcc.role;
+            params.bind_acc_id = selectedAcc.id;
+            params.prj_id = PROJECT_ID;
+            params.tender_id = TENDER_ID;
+            CommonAjax.postXsrfEx("/tender/report_api/createSignatureRole", params, 10000, true, getCookie('csrfToken'),
+                function(result){
+                    console.log(result);
+                    const domArr = [];
+                    domArr.push('<li class="add-sign-list-item">');
+                    //1. apply签名
+                    domArr.push('<a href="javascript:void(0)" onclick="rptSignatureHelper.drawEsignature(' + $('#project_account_select_dom')[0].selectedIndex + ')" class="btn-link pull-right" title="添加" data-dismiss="modal">');
+                    domArr.push('<i class="fa fa-plus"></i>');
+                    domArr.push('</a>');
+                    //2. 编辑角色(暂缓)
+                    // domArr.push('<a href="" class="btn-link pull-right mr-1" title="编辑">');
+                    // domArr.push('<i class="fa fa-pencil-square-o"></i>');
+                    // domArr.push('</a>');
+                    //3. 显示名称
+                    domArr.push('<i class="fa fa-user"></i> ' + $('#acc_role_name')[0].value + '<p>' + selectedAcc.name + '-<small class="text-muted">' + roleName + '</small></p>');
+                    $('#existed_roles_ul').append(domArr.join(' '));
+                }, function(err){
+                    // hintBox.unWaitBox();
+                }, function(ex){
+                    // hintBox.unWaitBox();
+                }
+            );
+        } else {
+            alert('请输入合适的名称!');
+        }
+    },
+    buildRoleDom: function (roleList) {
+        const ulDom = $('#existed_roles_ul');
+        ulDom.empty();
+        for (let domIdx = 0; domIdx < roleList.length; domIdx++) {
+            const role = roleList[domIdx];
+            const domArr = [];
+            domArr.push('<li class="add-sign-list-item">');
+            //1. apply签名
+            domArr.push('<a href="javascript:void(0)" onclick="rptSignatureHelper.createEsignatureByRoleIdx(' + domIdx + ')" class="btn-link pull-right" title="添加" data-dismiss="modal">');
+            domArr.push('<i class="fa fa-plus"></i>');
+            domArr.push('</a>');
+            //2. 编辑角色(暂缓)
+            domArr.push('<a href="javascript:void(0)" onclick="" class="btn-link pull-right mr-1" title="编辑">');
+            domArr.push('<i class="fa fa-pencil-square-o"></i>');
+            domArr.push('</a>');
+            //3. 显示名称
+            let acc = rptSignatureHelper.getUserAccount(role.bind_acc_id);
+            domArr.push('<i class="fa fa-user"></i> ' + role.name + '<p>' + acc.name + '-<small class="text-muted">' + ((acc.role === '')?"工程师":acc.role) + '</small></p>');
+            ulDom.append(domArr.join(' '));
+        }
+    },
+    getUserAccount: function (accId) {
+        let rst = null;
+        for (const acc of PRJ_ACCOUNT_LIST) {
+            if (acc.id === accId) {
+                rst = acc;
+                break;
+            }
+        }
+        return rst;
     }
 }

+ 1 - 0
app/router.js

@@ -179,6 +179,7 @@ module.exports = app => {
     app.get('/tender/:id/report', sessionAuth, tenderCheck, 'reportController.index');
     app.get('/tender/:id/measure/stage/:order/report', sessionAuth, tenderCheck, stageCheck, 'reportController.index');
     app.post('/tender/report_api/getReport', sessionAuth, 'reportController.getReport');
+    app.post('/tender/report_api/createSignatureRole', sessionAuth, 'signatureController.createSignatureRole');
     // 计量附件
     app.post('/tender/:id/measure/stage/:order/upload/file', sessionAuth, 'stageController.uploadFile');
     app.get('/tender/:id/measure/stage/:order/download/file/:fid', sessionAuth, 'stageController.downloadFile');

+ 106 - 0
app/service/role_rpt_rel.js

@@ -0,0 +1,106 @@
+'use strict';
+
+/**
+ * Created by Tony on 2019/9/26.
+ */
+
+const BaseService = require('../base/base_service');
+
+module.exports = app => {
+
+    class RoleRptRel extends BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'role_rpt_rel';
+            this.dataId = 'id';
+        }
+
+        async getRoleRptRelById(id) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('id', {
+                value: id,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['id', 'tender_id', 'rpt_id', 'rel_content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async getRoleRptRelByTenderId(tenderId) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('tender_id', {
+                value: tenderId,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['id', 'tender_id', 'rpt_id', 'rel_content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async getRoleRptRelByDetailIds(tenderId, rptId) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('tender_id', {
+                value: tenderId,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('rpt_id', {
+                value: rptId,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['id', 'tender_id', 'rpt_id', 'rel_content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async createRoleRelationship(tender_id, rpt_id, relArr) {
+            let rst = null;
+            this.transaction = await this.db.beginTransaction();
+            try {
+                const data = {
+                    id: 0,
+                    tender_id: tender_id,
+                    rpt_id: rpt_id,
+                    rel_content: JSON.stringify(relArr),
+                };
+                rst = await this.transaction.insert(this.tableName, data);
+                await this.transaction.commit();
+            } catch (ex) {
+                console.log(ex);
+                // 回滚
+                await this.transaction.rollback();
+            }
+            return rst;
+        }
+
+        // async updateRoleRelationship(tender_id, rpt_id, relArr) {
+        //     let rst = null;
+        //     this.transaction = await this.db.beginTransaction();
+        //     try {
+        //         const data = {
+        //             id: 0,
+        //             tender_id: tender_id,
+        //             rpt_id: rpt_id,
+        //             rel_content: JSON.stringify(relArr),
+        //         };
+        //         rst = await this.transaction.insert(this.tableName, data);
+        //         await this.transaction.commit();
+        //     } catch (ex) {
+        //         console.log(ex);
+        //         // 回滚
+        //         await this.transaction.rollback();
+        //     }
+        //     return rst;
+        // }
+    }
+    return RoleRptRel;
+};

+ 73 - 0
app/service/signature_role.js

@@ -0,0 +1,73 @@
+'use strict';
+
+/**
+ * Created by Tony on 2019/9/26.
+ */
+
+const BaseService = require('../base/base_service');
+
+module.exports = app => {
+
+    class SignatureRole extends BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'signature_role';
+            this.dataId = 'id';
+        }
+
+        async getSignatureRoleById(id) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('id', {
+                value: id,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['id', 'name', 'bind_acc_id', 'prj_id', 'tender_id'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async getSignatureRolesByTenderId(tenderId) {
+            // 依据需求,角色是标段level通用
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('tender_id', {
+                value: tenderId,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['id', 'name', 'bind_acc_id', 'prj_id', 'tender_id'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async createRole(name, acc_id, prj_id, tender_id) {
+            let rst = null;
+            this.transaction = await this.db.beginTransaction();
+            try {
+                const data = {
+                    id: 0,
+                    name: name,
+                    bind_acc_id: acc_id,
+                    prj_id: prj_id,
+                    tender_id: tender_id,
+                };
+                rst = await this.transaction.insert(this.tableName, data);
+                await this.transaction.commit();
+            } catch (ex) {
+                console.log(ex);
+                // 回滚
+                await this.transaction.rollback();
+            }
+            return rst;
+        }
+
+    }
+    return SignatureRole;
+};

+ 2 - 0
app/view/report/index.ejs

@@ -184,7 +184,9 @@
     const STAGE_TIMES = <%- stg_times %>;
     const STAGE_LIST = <%- stage_list %>;
     const PRJ_ACCOUNT_LIST = <%- prj_account_list %>;
+    const ROLE_LIST = <%- role_list %>;
     const STAGE_STATUS = <%- stg_status %>;
+    let ROLE_REL_LIST = [];
     let current_stage_order = -1;
     let current_stage_id = -1;
     let current_stage_times = -1;

+ 3 - 3
app/view/report/rpt_all_popup.ejs

@@ -242,9 +242,9 @@
                     </div>
                     <div class="tab-pane fade" id="adst-2" role="tabpanel" aria-labelledby="profile-tab">
                         <a href="javascript:void(0)" onclick="rptSignatureHelper.switchAddRoleDiv(this)" class="btn btn-sm btn-link">添加角色</a>
-                        <div class="modal-height-300" id="role_select_acc_div" style="display:none">
+                        <div class="modal-height-300">
                             <!--添加角色-->
-                            <div class="card">
+                            <div class="card" id="role_select_acc_div" style="display:none">
                                 <div class="p-2">
                                     <div class="input-group input-group-sm mb-1">
                                         <div class="input-group-prepend">
@@ -262,7 +262,7 @@
                                     <a href="javascript:void(0)" onclick="rptSignatureHelper.createNewRole(this)" class="btn btn-sm btn-primary">添加角色</a>
                                 </div>
                             </div>
-                            <ul class="list-group">
+                            <ul class="list-group p-2" id="existed_roles_ul">
                             </ul>
                         </div>
                     </div>