'use strict'; const moment = require('moment') module.exports = function (app, opts) { const { models } = app.fs.dc const { clickHouse } = app.fs const { database: anxinyun } = clickHouse.anxinyun.opts.config async function getAxyStructs(pepProjectId) { try { try { const { pepProjectRes, bindRes } = await pomsWithPepRangeParams(pepProjectId) // 获取不重复的 安心云项目 id const anxinProjectIds = [ ...(bindRes).reduce( (arr, b) => { for (let sid of b.anxinProjectId) { arr.add(sid); } return arr; }, new Set() ) ] // 查询安心云项目及结构物信息 const undelStrucRes = anxinProjectIds.length ? await clickHouse.anxinyun.query( `SELECT t_project.id AS projectId, t_structure.id AS strucId, t_structure.name AS strucName, project_state FROM t_project LEFT JOIN t_project_structure ON t_project_structure.project = t_project.id LEFT JOIN t_project_structuregroup ON t_project_structuregroup.project = t_project.id LEFT JOIN t_structuregroup_structure ON t_structuregroup_structure.structuregroup = t_project_structuregroup.structuregroup LEFT JOIN t_project_construction ON t_project_construction.project = t_project.id LEFT JOIN t_structure_site ON t_structure_site.siteid = t_project_construction.construction RIGHT JOIN t_structure ON t_structure.id = t_project_structure.structure OR t_structure.id = t_structuregroup_structure.structure OR t_structure.id = t_structure_site.structid WHERE project_state != -1 AND t_project.id IN (${anxinProjectIds.join(',')})`).toPromise() : [] // 构建安心云结构物和项企项目的关系 // 并保存信息至数据 let undelStruc = [] for (let s of undelStrucRes) { let corStruc = undelStruc.find(us => us.strucId == s.strucId) if (corStruc) { if (!corStruc.project.some(cp => cp.id == s.projectId)) { corStruc.project.push({ id: s.projectId }) } } else { corStruc = { strucId: s.strucId, strucName: s.strucName, projectId: s.projectId, project: [{ id: s.projectId, }], pomsProject: [] } undelStruc.push(corStruc) } for (let { dataValues: br } of bindRes) { if (br.anxinProjectId.some(braId => braId == s.projectId)) { let corPepProject = pepProjectRes.find(pp => pp.id == br.pepProjectId) let corPomsProject = corStruc.pomsProject.find(cp => cp.id == br.id) if (corPomsProject) { // poms 的 project 和 pep 的 project 是一对一的关系 所以这个情况不用处理 } else { corStruc.pomsProject.push({ ...br, pepProject: corPepProject }) } } } } return undelStruc } catch (error) { console.error(error); } } catch (error) { console.log(error) } } async function pomsWithPepRangeParams(pepProjectId) { try { let findOption = { where: { del: false } } if (pepProjectId) { // 有 特定的项目id 就按此查询 findOption.where.id = pepProjectId } const bindRes = await models.ProjectCorrelation.findAll(findOption); // 获取不重复的 项企项目id let pepProjectIds = [] for (let b of bindRes) { if (b.pepProjectId) { pepProjectIds.push(b.pepProjectId) } } // 查询项企项目的信息 const pepProjectRes = pepProjectIds.length ? await clickHouse.projectManage.query( `SELECT t_pim_project.id AS id, t_pim_project.project_name AS projectName, t_pim_project.isdelete AS isdelete, t_pim_project_construction.construction_status_id AS constructionStatusId, t_pim_project_state.construction_status AS constructionStatus FROM t_pim_project LEFT JOIN t_pim_project_construction ON t_pim_project.id = t_pim_project_construction.project_id LEFT JOIN t_pim_project_state ON t_pim_project_construction.construction_status_id = t_pim_project_state.id WHERE id IN (${pepProjectIds.join(',')})` ).toPromise() : []; return { pepProjectRes, bindRes } } catch (error) { console.error(error); } } return { getAxyStructs } }