nestjs rewrite

This commit is contained in:
popovspiridon99
2025-08-01 11:33:40 +09:00
parent 145827ab6d
commit 37bfa912a0
58 changed files with 17130 additions and 0 deletions

View File

@ -0,0 +1,250 @@
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<any[]> {
const generalDatabase = 'nGeneral'
const result = await this.dataSource.query(`
SELECT * FROM ${generalDatabase}..vRegions;
`)
return result
}
async getDistricts(region_id: number): Promise<any[]> {
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<any[]> {
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<any[]> {
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<any[]> {
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<any[]> {
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<any[]> {
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<any[]> {
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<any[]> {
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<any[]> {
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
}
}