123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- '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 pt.`pid` = ? AND pt.`spid` = ?';
- const params1 = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.session.sessionProject.id, this.ctx.subProject.id];
- return await this.db.query(sql1, params1);
- }
- const typeValues = [];
- const modes = this.ctx.subProject.payment_setting ? JSON.parse(this.ctx.subProject.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 spid = ? 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, this.ctx.subProject.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 getNoSpList(pid, spIsNull = true) {
- const spSql = spIsNull ? ' AND pt.`spid` = ?' : ' AND pt.`spid` != ?';
- const sql1 = 'SELECT pt.*, pa.name as user_name FROM ?? as pt LEFT JOIN ?? as pa ON pt.`uid` = pa.`id` WHERE pt.`pid` = ?' + spSql;
- const params1 = [this.tableName, this.ctx.service.projectAccount.tableName, pid, ''];
- return await this.db.query(sql1, params1);
- }
- 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,
- spid: this.ctx.subProject.id,
- 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 } });
- // }
- async doCheckTender(id) {
- return await this.service.paymentTender.getDataById(id);
- }
- async bindSp(tids) {
- const noSpTenderList = await this.getNoSpList(this.ctx.session.sessionProject.id);
- const noSpFolderList = await this.ctx.service.paymentFolder.getNoSpList(this.ctx.session.sessionProject.id);
- const transaction = await this.db.beginTransaction();
- try {
- const hadSpTenderList = await this.getNoSpList(this.ctx.session.sessionProject.id, false);
- if (tids.length === noSpTenderList.length && hadSpTenderList.length === 0) {
- // 一次性迁移所有可以不用复制folder数据,也不用调整tender数据,直接更新spid
- await transaction.update(this.tableName, { spid: this.ctx.subProject.id }, { where: { pid: this.ctx.session.sessionProject.id } });
- await transaction.update(this.ctx.service.paymentFolder.tableName, { spid: this.ctx.subProject.id }, { where: { pid: this.ctx.session.sessionProject.id } });
- } else {
- const hadSpTenderIds = hadSpTenderList.map(item => item.id);
- // tids里过滤掉hadSpTenderIds存在的值
- const filterTids = tids.filter(item => !hadSpTenderIds.includes(item));
- if (filterTids.length > 0) {
- const folderList = await this.ctx.service.paymentFolder.getAllDataByCondition({ where: { spid: this.ctx.subProject.id } });
- // 需要复制一份folder数据,且比对folderList,如果存在则不复制,且可能需要调整id,parent_id,parent_path, order值
- const allNotExistFolderIds = [];
- for (const tid of filterTids) {
- const tender = this._.find(noSpTenderList, { id: tid });
- if (tender) {
- const parentFolder = this._.find(noSpFolderList, { folder_id: tender.folder_id });
- if (parentFolder) {
- const spParentFolder = this._.find(folderList, { folder_id: tender.folder_id });
- if (!spParentFolder) allNotExistFolderIds.push(tender.folder_id);
- const parentPathArray = parentFolder.parent_path ? this._.map(parentFolder.parent_path.split('-'), this._.toInteger) : [];
- if (parentPathArray.length > 0) {
- for (const id of parentPathArray) {
- const spFolder = this._.find(folderList, { folder_id: id });
- if (!spFolder && !this._.includes(allNotExistFolderIds, id)) {
- allNotExistFolderIds.push(id);
- }
- }
- }
- }
- }
- }
- const newFolderList = [];
- if (allNotExistFolderIds.length > 0) {
- const allNotExistFolderList = this._.orderBy(this._.filter(noSpFolderList, item => this._.includes(allNotExistFolderIds, item.folder_id)), ['in_time'], ['asc']);
- for (const f of allNotExistFolderList) {
- newFolderList.push({
- id: this.uuid.v4(),
- pid: this.ctx.session.sessionProject.id,
- spid: this.ctx.subProject.id,
- uid: f.uid,
- name: f.name,
- folder_id: f.folder_id,
- parent_id: f.parent_id,
- parent_path: f.parent_path,
- level: f.level,
- order: f.order,
- is_leaf: f.is_leaf,
- had_tender: f.had_tender,
- in_time: f.in_time,
- });
- }
- }
- await transaction.update(this.tableName, { spid: this.ctx.subProject.id }, { where: { id: filterTids } });
- if (newFolderList.length > 0) await transaction.insert(this.ctx.service.paymentFolder.tableName, newFolderList);
- }
- }
- // 权限也要迁移至本子项目
- const ppAudits = await this.ctx.service.paymentPermissionAudit.getAllDataByCondition({ where: { pid: this.ctx.session.sessionProject.id } });
- for (const audit of ppAudits) {
- if (audit.uid) {
- const spAudit = await this.ctx.service.subProjPermission.getDataByCondition({ spid: this.ctx.subProject.id, uid: audit.uid });
- const payment_permission = [1];
- const one_pp = audit.permission_json ? JSON.parse(audit.permission_json) : null;
- if (one_pp) {
- if (one_pp.admin) payment_permission.push(2);
- if (one_pp.view_all) payment_permission.push(3);
- }
- const new_payment_permission = payment_permission.join(',');
- console.log(spAudit, new_payment_permission);
- if (spAudit && spAudit.payment_permission !== new_payment_permission) {
- await transaction.update(this.ctx.service.subProjPermission.tableName, { id: spAudit.id, payment_permission: new_payment_permission });
- } else if (!spAudit) {
- const a = await this.ctx.service.projectAccount.getDataById(audit.uid);
- if (a) {
- const sp_permission = { id: this.uuid.v4(), spid: this.ctx.subProject.id, pid: this.ctx.session.sessionProject.id, uid: audit.uid, self_category_level: a.self_category_level, payment_permission: new_payment_permission };
- await transaction.insert(this.ctx.service.subProjPermission.tableName, sp_permission);
- }
- }
- }
- }
- await transaction.commit();
- } catch (err) {
- await transaction.rollback();
- throw err;
- }
- return true;
- }
- }
- return paymentTender;
- };
|