| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | 'use strict';/** * * * @author Mai * @date 2025/7/17 * @version */module.exports = app => {    class tenderPermission extends app.BaseService {        /**         * 构造函数         *         * @param {Object} ctx - egg全局变量         * @param {String} tableName - 表名         * @return {void}         */        constructor(ctx) {            super(ctx);            this.tableName = 'tender_permission';            this.PermissionConst = {                quality: {                    view: { title: '查看', value: 1, isDefault: 1 },                    upload: { title: '上传文件', value: 2 },                    add: { title: '新增功能', value: 3 },                },            };            this.PermissionBlock = [                { key: 'quality', name: '质量管理', field: 'quality' },            ];            for (const p of this.PermissionBlock) {                if (p.children) {                    for (const c of p.children) {                        c.permission = [];                        const pConst = this.PermissionConst[c.key];                        if (!pConst) continue;                        for (const prop in pConst) {                            c.permission.push({ key: prop, ...pConst[prop]});                        }                    }                } else {                    p.permission = [];                    const pConst = this.PermissionConst[p.key];                    if (!pConst) continue;                    for (const prop in pConst) {                        p.permission.push({ key: prop, ...pConst[prop]});                    }                }            }            this.AdminPermission = {};            for (const p in this.PermissionConst) {                this.AdminPermission[p] = this.ctx.helper.mapAllSubField(this.PermissionConst[p], 'value');            }        }        partPermissionConst(part) {            if (!part) return this.PermissionConst;            const parts = part instanceof Array ? part : [part];            const result = {};            for (const p of parts) {                result[p] = this.PermissionConst[p];            }            return result;        }        partPermissionBlock(part) {            if (!part) return this.PermissionBlock;            const parts = part instanceof Array ? part : [part];            const result = this.PermissionBlock.filter(x => { return parts.indexOf(x.key) >= 0; });            return result;        }        parsePermission(data) {            const _ = this.ctx.helper._;            const datas = data instanceof Array ? data : [data];            datas.forEach(x => {                for (const p in this.PermissionConst) {                    x[p] = x[p] ? _.map(x[p].split(','), _.toInteger) : [];                }            });        }        // 权限检查        conversePermission(permission) {            const result = {};            for (const block of this.PermissionBlock) {                const per = {};                for(const p of block.permission) {                    per[p.key] = permission[block.key].indexOf(p.value) >= 0;                }                result[block.key] = per;            }            return result;        }        getAdminPermission() {            return this.conversePermission(this.AdminPermission);        }        async getUserPermission(tid, uid) {            const result = await this.getDataByCondition({ tid, uid });            this.parsePermission(result);            return this.conversePermission(result);        }        // 用户权限编辑        async getPartsPermission(tid, parts) {            if (!parts || parts.length === 0) return [];            const partSql = parts.map(x => { return `${x} <> ''`}).join(' OR ');            const sql = `SELECT qp.*, pa.name, pa.role FROM ${this.tableName} qp LEFT JOIN ${this.ctx.service.projectAccount.tableName} pa ON qp.uid = pa.id WHERE qp.tid = ? AND (${partSql})`;            const result = await this.db.query(sql, [tid]);            this.parsePermission(result);            return result;        }        async savePermission(tid, member, permissionBlock) {            const orgMember = await this.getAllDataByCondition({ where: { tid } });            const updateMember = [], insertMember = [];            for (const om of orgMember) {                const nmi = member.findIndex(x => { return om.uid == x.uid; });                if (nmi < 0) {                    const um = { id: om.id };                    for (const p of permissionBlock) {                        um[p] = '';                    }                    updateMember.push(um);                } else {                    const nm = member[nmi];                    const um = { id: om.id };                    for (const p in this.PermissionConst) {                        if (nm[p]) um[p] = nm[p].join(',');                    }                    updateMember.push(um);                    member.splice(nmi, 1);                }            }            for (const m of member) {                const im = { id: this.uuid.v4(), pid: this.ctx.session.sessionProject.id, tid, uid: m.uid };                for (const p in this.PermissionConst) {                    if (m[p]) im[p] = m[p].join(',');                }                insertMember.push(im);            }            const conn = await this.db.beginTransaction();            try {                if (updateMember.length > 0) await conn.updateRows(this.tableName, updateMember);                if (insertMember.length > 0) await conn.insert(this.tableName, insertMember);                await conn.commit();            } catch (err) {                await conn.rollback();                throw err;            }        }    }    return tenderPermission;};
 |