import { Injectable } from '@nestjs/common'; import { InjectDataSource } from '@nestjs/typeorm'; import { DataSource } from 'typeorm'; @Injectable() export class GeneralService { constructor( @InjectDataSource('emsConnection') private dataSource: DataSource ) { } async getRegions(): Promise { const generalDatabase = 'nGeneral' const result = await this.dataSource.query(` SELECT * FROM ${generalDatabase}..vRegions; `) return result } async getDistricts(region_id: number): Promise { const generalDatabase = 'nGeneral' const result = await this.dataSource.query(` SELECT c.*, d.name AS district_name FROM ${generalDatabase}..vCities c JOIN ${generalDatabase}..vDistricts d ON d.id_region = c.id_region AND d.id = c.id_district WHERE c.id_region = ${region_id}; `) return result } async getCities(offset?: number, limit?: number, search?: string, id?: number): Promise { const generalDatabase = 'nGeneral' const result = await this.dataSource.query(` SELECT * FROM ${generalDatabase}..Cities ${id ? `WHERE id = ${id}` : ''} ${search ? `WHERE name LIKE '%${search || ''}%'` : ''} ORDER BY id OFFSET ${Number(offset) || 0} ROWS FETCH NEXT ${Number(limit) || 10} ROWS ONLY; `) return result } async getTypes(): Promise { const generalDatabase = 'nGeneral' const result = await this.dataSource.query(` SELECT * FROM ${generalDatabase}..tTypes ORDER BY id `) return result } async getObjects(offset?: number, limit?: number, city_id?: number): Promise { const generalDatabase = 'nGeneral' const result = await this.dataSource.query(` SELECT * FROM ${generalDatabase}..vObjects ${city_id ? `WHERE id_city = ${Number(city_id)}` : ''} ORDER BY id_object OFFSET ${Number(offset) || 0} ROWS FETCH NEXT ${Number(limit) || 10} ROWS ONLY; `) return result } // TODO: GisDB async getObjectsList(city_id: number, year: number, planning: number, type?: number): Promise { const generalDatabase = 'nGeneral' const gisDatabase = 'New_Gis' const result = await this.dataSource.query(type ? ` WITH cte_split(type_id, split_value, caption_params) AS ( -- anchor member SELECT DISTINCT type_id, CAST(LEFT(caption_params, CHARINDEX(',', caption_params + ',') - 1) AS VARCHAR(255)), -- Explicitly casting to VARCHAR STUFF(caption_params, 1, CHARINDEX(',', caption_params + ','), '') FROM ${gisDatabase}..caption_params WHERE city_id = -1 AND user_id = -1 UNION ALL -- recursive member SELECT type_id, CAST(LEFT(caption_params, CHARINDEX(',', caption_params + ',') - 1) AS VARCHAR(255)), -- Explicitly casting to VARCHAR STUFF(caption_params, 1, CHARINDEX(',', caption_params + ','), '') FROM cte_split WHERE caption_params > '' ) SELECT o.object_id, o.type, o.id_city, o.year, o.planning, string_agg(cast(v.value as varchar), ',') as caption FROM ${generalDatabase}..vObjects o JOIN cte_split c ON o.type = c.type_id JOIN ${generalDatabase}..tParameters p ON p.id = split_value LEFT JOIN ${generalDatabase}..tValues v ON v.id_param = split_value AND v.id_object = o.object_id AND (v.date_po IS NULL) AND (v.date_s < DATEFROMPARTS(${Number(year) + 1},01,01)) WHERE o.id_city = ${city_id} AND o.year = ${year} AND o.type = ${type} AND ( CASE WHEN TRY_CAST(o.planning AS BIT) IS NOT NULL THEN TRY_CAST(o.planning AS BIT) WHEN o.planning = 'TRUE' THEN 1 WHEN o.planning = 'FALSE' THEN 0 ELSE NULL END ) = ${planning} GROUP BY object_id, type, id_city, year, planning; `: ` SELECT ${generalDatabase}..tTypes.id AS id, ${generalDatabase}..tTypes.name AS name, COUNT(vo.type) AS count, tr.r, tr.g, tr.b FROM ${generalDatabase}..vObjects vo JOIN ${generalDatabase}..tTypes ON vo.type = ${generalDatabase}..tTypes.id LEFT JOIN ${gisDatabase}..TypeRoles tr ON tr.id = ${generalDatabase}..tTypes.id WHERE vo.id_city = ${city_id} AND vo.year = ${year} AND ( CASE WHEN TRY_CAST(vo.planning AS BIT) IS NOT NULL THEN TRY_CAST(vo.planning AS BIT) WHEN vo.planning = 'TRUE' THEN 1 WHEN vo.planning = 'FALSE' THEN 0 ELSE NULL END ) = ${planning} GROUP BY ${generalDatabase}..tTypes.id, ${generalDatabase}..tTypes.name, tr.r, tr.g, tr.b; ` ) return result } async getObjectById(id: string): Promise { const generalDatabase = 'nGeneral' const gisDatabase = 'New_Gis' const result = await this.dataSource.query(` SELECT * FROM ${generalDatabase}..vObjects WHERE id_object = '${id}' `) return result } async getValuesByObjectId(object_id: string): Promise { const generalDatabase = 'nGeneral' const result = await this.dataSource.query(` SELECT id_object, id_param, CAST(v.value AS varchar(max)) AS value, date_s, date_po, id_user FROM ${generalDatabase}..tValues v JOIN ${generalDatabase}..tParameters p ON v.id_param = p.id WHERE id_object = '${object_id}' `) return result } async getParamsById(param_id: number): Promise { const generalDatabase = 'nGeneral' const result = await this.dataSource.query(` SELECT * FROM ${generalDatabase}..TParameters WHERE id = '${param_id}' `) return result } tcbParamQuery = (vtable: string, id_city: number) => { const generalDatabase = 'nGeneral' switch (vtable) { case 'vStreets': return `SELECT * FROM ${generalDatabase}..${vtable} WHERE id_city = ${id_city};` case 'vBoilers': return `SELECT * FROM ${generalDatabase}..${vtable} WHERE id_city = ${id_city};` default: return `SELECT * FROM ${generalDatabase}..${vtable};` } } async getTCBParams(vtable: string, id_city: number, id?: number): Promise { const generalDatabase = 'nGeneral' const query = id ? ` SELECT * FROM ${generalDatabase}..${vtable} WHERE id = '${id}' ` : this.tcbParamQuery(vtable, id_city) const result = await this.dataSource.query(query) return result } async getSearchObjects(q: string, id_city: number, year: number) { const generalDatabase = 'nGeneral' const gisDatabase = 'New_Gis' const result = await this.dataSource.query(` WITH RankedValues AS ( SELECT id_object, date_s, CAST(value AS varchar(max)) AS value, ROW_NUMBER() OVER (PARTITION BY id_object ORDER BY date_s DESC) AS rn, o.id_city AS id_city, o.year AS year FROM ${generalDatabase}..tValues JOIN ${generalDatabase}..tObjects o ON o.id = id_object WHERE CAST(value AS varchar(max)) LIKE '%${q}%' ) SELECT id_object, date_s, value, id_city, year FROM RankedValues WHERE rn = 1 AND id_city = ${id_city} AND year = ${year}; `) return result } }