'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 paymentTender extends app.BaseService { constructor(ctx) { super(ctx); this.tableName = 'payment_tender'; } async getList(uid, auditPermission) { if (auditPermission.view_all) { const sql1 = 'SELECT pt.*, pa.name as user_name FROM ?? as pt LEFT JOIN ?? as pa ON pt.`uid` = pa.`id` WHERE pid = ?'; const params1 = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.session.sessionProject.id]; return await this.db.query(sql1, params1); } const typeValues = []; const projectInfo = await this.ctx.service.project.getDataById(this.ctx.session.sessionProject.id); const modes = projectInfo.payment_setting ? JSON.parse(projectInfo.payment_setting) : this._.cloneDeep(paymentConst.setting_modes); for (const m in paymentConst.setting_modes) { if (!modes[m]) modes[m] = this._.cloneDeep(paymentConst.setting_modes[m]); if (modes[m].checked) { typeValues.push(modes[m].value); } } if (typeValues.length === 0) { return -1; } const sql = 'SELECT pt.*, pa.name as user_name FROM ?? as pt LEFT JOIN ?? as pa ON pt.`uid` = pa.`id` WHERE pid = ? AND (pt.`uid` = ? ' + 'OR pt.`id` in (SELECT pr.`tender_id` FROM ?? as pr WHERE pr.`uid` = ? AND pr.`type` IN (' + this.ctx.helper.getInArrStrSqlFilter(typeValues) + '))' + 'OR pt.`id` in (SELECT pd.`tender_id` FROM ?? as pd WHERE pd.`uid` = ?)' + 'OR pt.`id` in (SELECT pda.`tender_id` FROM ?? as pda LEFT JOIN ?? as pd ON pda.`tender_id` = pd.`tender_id` ' + 'WHERE pd.`status` != ' + auditConst.status.uncheck + ' AND pda.`aid` = ?)' + 'OR pt.`id` in (SELECT pra.`tender_id` FROM ?? as pra LEFT JOIN ?? as pd ON pra.`tender_id` = pd.`tender_id` ' + 'WHERE pd.`status` != ' + auditConst.status.uncheck + ' AND pd.`status` !=' + auditConst.status.checkNo + ' AND pra.`uid` = ?))'; const params = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.session.sessionProject.id, uid, this.ctx.service.paymentTenderRpt.tableName, uid, this.ctx.service.paymentDetail.tableName, 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 addTender(projectId, uid, folderId, name) { const transaction = await this.db.beginTransaction(); try { const folderInfo = await this.ctx.service.paymentFolder.getDataById(folderId); if (!folderInfo || folderInfo.is_leaf === 0) { throw '目录不存在或存在子目录不能新建标段'; } const insertData = { pid: projectId, uid, name, folder_id: folderId, in_time: new Date(), }; const result = await transaction.insert(this.tableName, insertData); const updateData = [ { id: folderInfo.id, had_tender: 1 }, ]; // 更新父节点had_tender值 if (folderInfo.parent_path) { const parentFolderIds = folderInfo.parent_path.split('-'); for (const pf of parentFolderIds) { updateData.push({ id: parseInt(pf), had_tender: 1, }); } } await transaction.updateRows(this.ctx.service.paymentFolder.tableName, updateData); // 同时生成固定的报表表单 await this.ctx.service.paymentTenderRpt.setConstRpt(transaction, result.insertId, uid); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } } async deleteTender(id) { const transaction = await this.db.beginTransaction(); try { const tenderInfo = await this.getDataById(id); if (!tenderInfo) { throw '标段不存在'; } if (tenderInfo.uid !== this.ctx.session.sessionUser.accountId && !this.ctx.session.sessionUser.is_admin) { throw '您没有权限删除此标段'; } const had_detail = await this.ctx.service.paymentDetail.haveDetail2Tender(id); if (had_detail) { throw '请先删除所有报表表单详情'; } const folderInfo = await this.ctx.service.paymentFolder.getDataById(tenderInfo.folder_id); if (!folderInfo) { throw '目录不存在'; } // 判断folderInfo下是否还存在tender,不存在则把had_tender为0,并判断父节点是否需要也为0 const leafTenderCount = await transaction.count(this.tableName, { folder_id: folderInfo.id }); if (leafTenderCount === 1) { const updateDatas = [{ id: folderInfo.id, had_tender: 0, }]; if (folderInfo.parent_path) { const parentFolderIds = folderInfo.parent_path.split('-').reverse(); for (const pfid of parentFolderIds) { const parentFolderId = parseInt(pfid); const leafFolderCount = await transaction.count(this.ctx.service.paymentFolder.tableName, { parent_id: parentFolderId, had_tender: 1 }); if (leafFolderCount === 1) { updateDatas.push({ id: parentFolderId, had_tender: 0, }); } else { break; } } } await transaction.updateRows(this.ctx.service.paymentFolder.tableName, updateDatas); } await transaction.delete(this.ctx.service.paymentTenderRpt.tableName, { tender_id: id }); await transaction.delete(this.ctx.service.paymentShenpiAudit.tableName, { tid: id }); await transaction.delete(this.tableName, { id }); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } } // async getChildrenByParentId(parentId, transaction = null) { // const list = await this.getAllDataByCondition({ where: { parent_id: parentId } }); // } } return paymentTender; };