| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 | 'use strict';/** * 决策大屏用户查看权限-数据模型 * * @author ellisran * @date 2021/09/23 * @version */const accountGroup = require('../const/account_group').group;const paymentConst = require('../const/payment');const auditConst = require('../const/audit').stage;module.exports = app => {    class paymentTenderRpt extends app.BaseService {        constructor(ctx) {            super(ctx);            this.tableName = 'payment_tender_rpt';        }        async getList(tid, uid) {            const typeValues = [];            for (const m in this.ctx.payment.project_setting) {                if (this.ctx.payment.project_setting[m].checked) {                    typeValues.push(this.ctx.payment.project_setting[m].value);                }            }            if (typeValues.length === 0) {                return -1;            }            const sql = 'SELECT * FROM ?? WHERE `tender_id` = ? AND `type` IN (' + this.ctx.helper.getInArrStrSqlFilter(typeValues) + ')' +                ' AND (`uid` = ?' +                ' OR `id` in (SELECT pda.`tr_id` FROM ?? as pda LEFT JOIN ?? as pd ON pda.`tr_id` = pd.`tr_id` WHERE pd.`status` != ' + auditConst.status.uncheck + ' AND pda.`aid` = ?)' +                ' OR `id` in (SELECT pra.`tr_id` FROM ?? as pra LEFT JOIN ?? as pd ON pra.`tr_id` = pd.`tr_id` WHERE pd.`status` != ' + auditConst.status.uncheck + ' AND pd.`status` != ' + auditConst.status.checkNo + ' AND pra.`uid` = ?))' +                ' ORDER BY FIELD(`type`, 1, 0), id asc';            const params = [this.tableName, tid, uid, this.ctx.service.paymentDetailAudit.tableName, this.ctx.service.paymentDetail.tableName, uid,                this.ctx.service.paymentRptAudit.tableName, this.ctx.service.paymentDetail.tableName, uid];            return await this.db.query(sql, params);        }        async getProcessList(id) {            const typeValues = [];            for (const m in this.ctx.payment.project_setting) {                if (this.ctx.payment.project_setting[m].checked) {                    typeValues.push(this.ctx.payment.project_setting[m].value);                }            }            if (typeValues.length === 0) {                return -1;            }            const sql = 'SELECT ptr.*, pa.name as user_name FROM ?? as ptr LEFT JOIN ?? as pa ON ptr.`create_uid` = pa.`id` WHERE ptr.`tender_id` = ?  AND ptr.`type` IN (' + this.ctx.helper.getInArrStrSqlFilter(typeValues) + ')';            const params = [this.tableName, this.ctx.service.projectAccount.tableName, id];            return await this.db.query(sql, params);        }        async checkAndUpdateList(tenderRptList, rptProjectList, formProcess = false) {            if (tenderRptList.length > 0) {                const transaction = await this.db.beginTransaction();                try {                    const updateDatas = [];                    const delDatas = [];                    const delRptIds = [];                    const noConstRptList = this._.filter(tenderRptList, { type: 0 });                    for (const tr of noConstRptList) {                        const rptInfo = this._.find(rptProjectList, { ID: tr.rpt_id });                        // 判断是否已经新建过报表次                        const had_rpt = await this.ctx.service.paymentDetail.hadDetail(tr.id);                        if (tr.is_del === 0 && !rptInfo) {                            if (had_rpt) {                                updateDatas.push({                                    id: tr.id,                                    is_del: 1,                                });                                tr.is_del = 1;                            } else {                                delDatas.push(tr.id);                            }                            delRptIds.push(tr.id);                        } else if (rptInfo && tr.rpt_name !== rptInfo.name) {                            updateDatas.push({                                id: tr.id,                                rpt_name: rptInfo.name,                            });                            tr.rpt_name = rptInfo.name;                        }                        if (rptInfo) rptInfo.had_rpt = had_rpt;                    }                    if (updateDatas.length > 0) await transaction.updateRows(this.tableName, updateDatas);                    if (delDatas.length > 0) {                        this._.remove(tenderRptList, function(item) {                            return delDatas.indexOf(item.id) !== -1;                        });                        await transaction.delete(this.tableName, { id: delDatas });                    }                    if (delRptIds.length > 0) await this.ctx.service.paymentShenpiAudit.delDataFromtrids(transaction, delRptIds);                    await transaction.commit();                } catch (err) {                    await transaction.rollback();                    throw err;                }            }            return formProcess ? [tenderRptList, rptProjectList] : tenderRptList;        }        async setRpt(tid, rpt_list) {            const transaction = await this.db.beginTransaction();            try {                const originList = await this.getAllDataByCondition({ where: { tender_id: tid, is_del: 0, type: 0 } });                const insertData = [];                let deleteData = [];                if (originList.length === 0 && rpt_list.length !== 0) {                    // 添加到tender_rpt                    for (const rpt of rpt_list) {                        insertData.push({                            tender_id: tid,                            rpt_id: rpt.id,                            rpt_name: rpt.name,                            create_uid: this.ctx.session.sessionUser.accountId,                            in_time: new Date(),                        });                    }                } else if (originList.length !== 0 && rpt_list.length === 0) {                    // 删除原有                    deleteData = this._.map(originList, 'id');                } else if (originList.length !== 0 && rpt_list.length !== 0) {                    const orginRptIds = this._.map(originList, 'rpt_id');                    const newIds = this._.map(rpt_list, 'id');                    console.log(orginRptIds, newIds);                    const insertRptIds = this._.difference(newIds, orginRptIds);                    const deleteRptIds = this._.difference(orginRptIds, newIds);                    if (deleteRptIds.length > 0) {                        for (const id of deleteRptIds) {                            const orginInfo = this._.find(originList, { rpt_id: id });                            deleteData.push(orginInfo.id);                        }                    }                    for (const id of insertRptIds) {                        const info = this._.find(rpt_list, { id });                        insertData.push({                            tender_id: tid,                            rpt_id: id,                            rpt_name: info.name,                            create_uid: this.ctx.session.sessionUser.accountId,                            in_time: new Date(),                        });                    }                }                if (insertData.length > 0) await transaction.insert(this.tableName, insertData);                if (deleteData.length > 0) {                    await transaction.delete(this.tableName, { id: deleteData });                    // 也要删除对应的审批流数据                    await this.ctx.service.paymentShenpiAudit.delDataFromtrids(transaction, deleteData);                }                await transaction.commit();                let tenderRptList = await this.getProcessList(tid);                tenderRptList = this._.filter(tenderRptList, { type: 0, is_del: 0 });                return tenderRptList;            } catch (err) {                await transaction.rollback();                throw err;            }        }        async setStatus(id, sp_status) {            const transaction = await this.db.beginTransaction();            try {                await transaction.update(this.tableName, { id, sp_status });                await transaction.commit();                return await this.ctx.service.paymentShenpiAudit.getShenpiAudit(id, sp_status);            } catch (err) {                await transaction.rollback();                throw err;            }        }        async setConstRpt(transaction, tid, uid) {            const insertData = [];            for (const rpt of paymentConst.const_rpt_list) {                insertData.push({                    tender_id: tid,                    create_uid: uid,                    rpt_id: rpt.rpt_id,                    rpt_name: rpt.rpt_name,                    type: 1,                    in_time: new Date(),                });            }            if (insertData.length > 0) await transaction.insert(this.tableName, insertData);        }        async updateRptAudit(trInfo, rpt_audit) {            const transaction = await this.db.beginTransaction();            try {                // 判断是否存在null                if (!trInfo.is_first && this._.findIndex(rpt_audit, { uid: null }) !== -1) {                    throw '请绑定所有表单角色再提交';                }                // 判断是否存在待上报或者退回的详情,有则同步更新                const detailList = await this.ctx.service.paymentDetail.getAllDataByCondition({ where: { tr_id: trInfo.id }, orders: [['id', 'desc']] });                if (!trInfo.is_change && detailList.length > 0 && (detailList[0].status === auditConst.status.uncheck || detailList[0].status === auditConst.status.checkNo)) {                    if (this._.findIndex(rpt_audit, { uid: null }) !== -1) {                        throw '未配置好表单角色';                    }                    await this.ctx.service.paymentRptAudit.updateAllAuditList(transaction, detailList[0].id, rpt_audit);                    let report_json = JSON.parse(detailList[0].report_json);                    report_json = await this.ctx.service.paymentDetail.clearAllSignatureData(report_json);                    await transaction.update(this.ctx.service.paymentDetail.tableName, {                        id: detailList[0].id,                        report_json: JSON.stringify(report_json),                    });                }                const is_first = this._.findIndex(rpt_audit, { uid: null }) === -1 ? 0 : 1;                await transaction.update(this.tableName, { id: trInfo.id, rpt_audit: JSON.stringify(rpt_audit), is_first });                await transaction.commit();                return { is_first };            } catch (err) {                await transaction.rollback();                throw err;            }        }        async updateReport(data) {            const transaction = await this.db.beginTransaction();            try {                const tr_id = data.tr_id;                if (!tr_id) throw '参数有误';                const trInfo = await this.getDataById(tr_id);                if (!trInfo) throw '表单不存在';                const userInfo = await this.ctx.service.projectAccount.getDataById(data.uid);                if (!userInfo) throw '用户不存在';                const updateData = {                    id: trInfo.id,                    uid: data.uid,                };                await transaction.update(this.tableName, updateData);                // 判断是否存在待上报或重新上报的表单详情,有则更改原报人                const result1 = await this.ctx.service.paymentDetail.updateReport(transaction, tr_id, data.uid);                // 判断固定审批流或固定终审是否存在上报人,有则移除                const result2 = await this.ctx.service.paymentShenpiAudit.removeAuditByReport(transaction, tr_id, data.uid);                await this.ctx.service.paymentPermissionAudit.saveAudits(this.ctx.session.sessionProject.id, [userInfo], transaction);                await transaction.commit();                let tenderRptList = await this.getProcessList(this.ctx.paymentTender.id);                tenderRptList = this._.filter(tenderRptList, { type: 0, is_del: 0 });                return { list: tenderRptList, updateRows: result2.affectedRows, updateData };            } catch (err) {                await transaction.rollback();                throw err;            }        }    }    return paymentTenderRpt;};
 |